Merge "API: Use User::getCanonicalName() when validating user names"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sun, 20 May 2018 17:46:13 +0000 (17:46 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 20 May 2018 17:46:14 +0000 (17:46 +0000)
407 files changed:
.phpcs.xml
RELEASE-NOTES-1.32
autoload.php
includes/AjaxDispatcher.php
includes/Block.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/Linker.php
includes/MediaWiki.php
includes/OutputPage.php
includes/Setup.php
includes/Title.php
includes/WebRequest.php
includes/actions/InfoAction.php
includes/api/i18n/es.json
includes/api/i18n/ko.json
includes/collation/Collation.php
includes/collation/CollationFa.php [deleted file]
includes/htmlform/HTMLForm.php
includes/htmlform/OOUIHTMLForm.php
includes/http/Http.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlUpdater.php
includes/installer/OracleUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/i18n/es.json
includes/installer/i18n/tr.json
includes/libs/CryptHKDF.php
includes/libs/MultiHttpClient.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/rdbms/ChronologyProtector.php
includes/libs/rdbms/lbfactory/ILBFactory.php
includes/libs/rdbms/lbfactory/LBFactory.php
includes/parser/Parser.php
includes/parser/ParserOutput.php
includes/password/UserPasswordPolicy.php
includes/registration/ExtensionJsonValidator.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderClientHtml.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialAllPages.php
includes/specials/SpecialPasswordPolicies.php [new file with mode: 0644]
includes/specials/SpecialPreferences.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialTrackingCategories.php
includes/specials/SpecialWhatlinkshere.php
includes/specials/forms/PreferencesFormOOUI.php
includes/specials/pagers/UsersPager.php
includes/title/MediaWikiTitleCodec.php
includes/user/UserGroupMembership.php
includes/utils/MWCryptHKDF.php
languages/Language.php
languages/LanguageConverter.php
languages/classes/LanguageKsh.php
languages/data/Names.php
languages/i18n/abs.json
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/arc.json
languages/i18n/arn.json
languages/i18n/arq.json
languages/i18n/ary.json
languages/i18n/arz.json
languages/i18n/as.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/ca.json
languages/i18n/cdo.json
languages/i18n/ce.json
languages/i18n/ceb.json
languages/i18n/ch.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/cu.json
languages/i18n/cv.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de-ch.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.json
languages/i18n/eo.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/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/glk.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.json
languages/i18n/gor.json
languages/i18n/got.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.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/kbp.json
languages/i18n/khw.json
languages/i18n/kiu.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/krl.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/kum.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/ltg.json
languages/i18n/lus.json
languages/i18n/luz.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/lzz.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/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/nys.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/pnt.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/rif.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/sdh.json
languages/i18n/se.json
languages/i18n/ses.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/shi.json
languages/i18n/shn.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/sty.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/sw.json
languages/i18n/szl.json
languages/i18n/ta.json
languages/i18n/tay.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/tly.json
languages/i18n/to.json
languages/i18n/tr.json
languages/i18n/tru.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/vmf.json
languages/i18n/vo.json
languages/i18n/vot.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/MessagesEn.php
languages/messages/MessagesTet.php
maintenance/archives/patch-change_tag-tag_id.sql [new file with mode: 0644]
maintenance/mssql/archives/patch-change_tag-tag_id.sql [new file with mode: 0644]
maintenance/mssql/tables.sql
maintenance/oracle/archives/patch-change_tag-tag_id.sql [new file with mode: 0644]
maintenance/oracle/tables.sql
maintenance/postgres/tables.sql
maintenance/resources/update-ooui.sh
maintenance/tables.sql
resources/Resources.php
resources/src/jquery/jquery.makeCollapsible.js
resources/src/jquery/jquery.tablesorter.styles.less
resources/src/mediawiki.Title/Title.js
resources/src/mediawiki.api.category.js [deleted file]
resources/src/mediawiki.api.edit.js [deleted file]
resources/src/mediawiki.api.js [deleted file]
resources/src/mediawiki.api.login.js [deleted file]
resources/src/mediawiki.api.messages.js [deleted file]
resources/src/mediawiki.api.options.js [deleted file]
resources/src/mediawiki.api.parse.js [deleted file]
resources/src/mediawiki.api.rollback.js [deleted file]
resources/src/mediawiki.api.upload.js [deleted file]
resources/src/mediawiki.api.user.js [deleted file]
resources/src/mediawiki.api.watch.js [deleted file]
resources/src/mediawiki.api/category.js [new file with mode: 0644]
resources/src/mediawiki.api/edit.js [new file with mode: 0644]
resources/src/mediawiki.api/index.js [new file with mode: 0644]
resources/src/mediawiki.api/login.js [new file with mode: 0644]
resources/src/mediawiki.api/messages.js [new file with mode: 0644]
resources/src/mediawiki.api/options.js [new file with mode: 0644]
resources/src/mediawiki.api/parse.js [new file with mode: 0644]
resources/src/mediawiki.api/rollback.js [new file with mode: 0644]
resources/src/mediawiki.api/upload.js [new file with mode: 0644]
resources/src/mediawiki.api/user.js [new file with mode: 0644]
resources/src/mediawiki.api/watch.js [new file with mode: 0644]
resources/src/mediawiki.skinning/content.externallinks.css
resources/src/mediawiki.special.preferences.ooui/tabs.js
resources/src/mediawiki.special.preferences.styles.ooui.css
resources/src/mediawiki.special/special.css
resources/src/mediawiki/mediawiki.js
tests/parser/parserTests.txt
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/data/less/module/dependency.less
tests/phpunit/data/less/module/use-import-dir.less [new file with mode: 0644]
tests/phpunit/data/registration/bad_url.json [new file with mode: 0644]
tests/phpunit/data/registration/bad_url2.json [new file with mode: 0644]
tests/phpunit/includes/TestLogger.php
tests/phpunit/includes/collation/CollationFaTest.php [deleted file]
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/password/PasswordPolicyChecksTest.php
tests/phpunit/includes/registration/ExtensionJsonValidatorTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderClientHtmlTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/qunit/QUnitTestResources.php
tests/qunit/data/load.mock.php
tests/qunit/data/styleTest.css.php
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
thumb.php

index d43a281..440adaf 100644 (file)
                <exclude name="MediaWiki.WhiteSpace.SpaceBeforeSingleLineComment.SingleSpaceBeforeSingleLineComment" />
                <exclude name="MediaWiki.Usage.DbrQueryUsage.DbrQueryFound" />
                <exclude name="MediaWiki.Usage.ExtendClassUsage.FunctionVarUsage" />
-               <exclude name="MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals" />
                <exclude name="MediaWiki.Files.ClassMatchesFilename.WrongCase" />
                <exclude name="MediaWiki.Files.ClassMatchesFilename.NotMatch" />
-               <exclude name="Generic.Files.OneObjectStructurePerFile.MultipleFound" />
                <exclude name="MediaWiki.VariableAnalysis.ForbiddenGlobalVariables.ForbiddenGlobal$wgTitle" />
-               <exclude name="MediaWiki.Commenting.FunctionComment.SpacingDocStar" />
-               <exclude name="MediaWiki.Commenting.FunctionComment.SpacingDocTag" />
                <exclude name="Squiz.Scope.MethodScope.Missing" />
                <exclude name="Squiz.Scope.MemberVarScope.Missing" />
                <exclude name="MediaWiki.Commenting.MissingCovers.MissingCovers" />
-               <exclude name="MediaWiki.Usage.AssignmentInReturn.AssignmentInReturn" />
        </rule>
        <rule ref="MediaWiki.NamingConventions.PrefixedGlobalFunctions">
                <properties>
        <rule ref="Generic.Files.LineLength">
                <exclude-pattern>*/languages/messages/Messages*\.php</exclude-pattern>
        </rule>
+       <rule ref="Generic.Files.OneObjectStructurePerFile.MultipleFound">
+               <!--
+                       Whitelist existing violations, but enable the sniff to prevent
+                       any new occurrences.
+               -->
+               <exclude-pattern>*/includes/actions/HistoryAction\.php</exclude-pattern>
+               <exclude-pattern>*/includes/api/ApiErrorFormatter\.php</exclude-pattern>
+               <exclude-pattern>*/includes/api/ApiImport\.php</exclude-pattern>
+               <exclude-pattern>*/includes/api/ApiMessage\.php</exclude-pattern>
+               <exclude-pattern>*/includes/api/ApiOpenSearch\.php</exclude-pattern>
+               <exclude-pattern>*/includes/api/ApiRsd\.php</exclude-pattern>
+               <exclude-pattern>*/includes/api/ApiUsageException\.php</exclude-pattern>
+               <exclude-pattern>*/includes/auth/AuthManagerAuthPlugin\.php</exclude-pattern>
+               <exclude-pattern>*/includes/AuthPlugin\.php</exclude-pattern>
+               <exclude-pattern>*/includes/cache/CacheDependency\.php</exclude-pattern>
+               <exclude-pattern>*/includes/cache/CacheHelper\.php</exclude-pattern>
+               <exclude-pattern>*/includes/deferred/CdnCacheUpdate\.php</exclude-pattern>
+               <exclude-pattern>*/includes/diff/DairikiDiff\.php</exclude-pattern>
+               <exclude-pattern>*/includes/diff/DiffEngine\.php</exclude-pattern>
+               <exclude-pattern>*/includes/exception/LocalizedException\.php</exclude-pattern>
+               <exclude-pattern>*/includes/Feed\.php</exclude-pattern>
+               <exclude-pattern>*/includes/filerepo/file/LocalFile\.php</exclude-pattern>
+               <exclude-pattern>*/includes/gallery/PackedOverlayImageGallery\.php</exclude-pattern>
+               <exclude-pattern>*/includes/HistoryBlob\.php</exclude-pattern>
+               <exclude-pattern>*/includes/htmlform/HTMLFormElement\.php</exclude-pattern>
+               <exclude-pattern>*/includes/jobqueue/aggregator/JobQueueAggregator\.php</exclude-pattern>
+               <exclude-pattern>*/includes/jobqueue/JobQueue\.php</exclude-pattern>
+               <exclude-pattern>*/includes/jobqueue/JobSpecification\.php</exclude-pattern>
+               <exclude-pattern>*/includes/libs/filebackend/FileBackendStore\.php</exclude-pattern>
+               <exclude-pattern>*/includes/libs/filebackend/FSFileBackend\.php</exclude-pattern>
+               <exclude-pattern>*/includes/libs/filebackend/SwiftFileBackend\.php</exclude-pattern>
+               <exclude-pattern>*/includes/logging/LogEntry\.php</exclude-pattern>
+               <exclude-pattern>*/includes/logging/LogFormatter\.php</exclude-pattern>
+               <exclude-pattern>*/includes/media/MediaTransformOutput\.php</exclude-pattern>
+               <exclude-pattern>*/includes/media/SVGMetadataExtractor\.php</exclude-pattern>
+               <exclude-pattern>*/includes/parser/Preprocessor_DOM\.php</exclude-pattern>
+               <exclude-pattern>*/includes/parser/Preprocessor_Hash\.php</exclude-pattern>
+               <exclude-pattern>*/includes/parser/Preprocessor\.php</exclude-pattern>
+               <exclude-pattern>*/includes/PathRouter\.php</exclude-pattern>
+               <exclude-pattern>*/includes/poolcounter/PoolCounter\.php</exclude-pattern>
+               <exclude-pattern>*/includes/PrefixSearch\.php</exclude-pattern>
+               <exclude-pattern>*/includes/profiler/SectionProfiler\.php</exclude-pattern>
+               <exclude-pattern>*/includes/RevisionList\.php</exclude-pattern>
+               <exclude-pattern>*/includes/search/SearchEngine\.php</exclude-pattern>
+               <exclude-pattern>*/includes/specialpage/LoginSignupSpecialPage\.php</exclude-pattern>
+               <exclude-pattern>*/includes/specialpage/RedirectSpecialPage\.php</exclude-pattern>
+               <exclude-pattern>*/includes/specials/SpecialListusers\.php</exclude-pattern>
+               <exclude-pattern>*/includes/specials/SpecialMyRedirectPages\.php</exclude-pattern>
+               <exclude-pattern>*/includes/specials/SpecialUploadStash\.php</exclude-pattern>
+               <exclude-pattern>*/includes/StubObject\.php</exclude-pattern>
+               <exclude-pattern>*/includes/upload/UploadFromChunks\.php</exclude-pattern>
+               <exclude-pattern>*/includes/upload/UploadStash\.php</exclude-pattern>
+               <exclude-pattern>*/includes/utils/AutoloadGenerator\.php</exclude-pattern>
+               <exclude-pattern>*/includes/WebResponse\.php</exclude-pattern>
+               <exclude-pattern>*/maintenance/dumpIterator\.php</exclude-pattern>
+               <exclude-pattern>*/maintenance/Maintenance\.php</exclude-pattern>
+               <exclude-pattern>*/maintenance/findDeprecated\.php</exclude-pattern>
+               <exclude-pattern>*/maintenance/storage/recompressTracked\.php</exclude-pattern>
+               <exclude-pattern>*/maintenance/preprocessorFuzzTest\.php</exclude-pattern>
+               <exclude-pattern>*/maintenance/language/languages.inc</exclude-pattern>
+               <exclude-pattern>*/maintenance/language/StatOutputs\.php</exclude-pattern>
+               <exclude-pattern>*/maintenance/language/checkLanguage.inc</exclude-pattern>
+               <exclude-pattern>*/maintenance/language/generateCollationData\.php</exclude-pattern>
+               <exclude-pattern>*/maintenance/term/MWTerm\.php</exclude-pattern>
+               <!-- Language converters use the pattern of 2 classes in one file -->
+               <exclude-pattern>*/languages/*\.php</exclude-pattern>
+               <!-- We don't care that much about violations in tests -->
+               <exclude-pattern>*/tests/*\.php</exclude-pattern>
+       </rule>
        <rule ref="PSR2.Methods.MethodDeclaration.Underscore">
                <exclude-pattern>*/includes/StubObject\.php</exclude-pattern>
        </rule>
+       <rule ref="MediaWiki.Usage.AssignmentInReturn.AssignmentInReturn">
+               <exclude-pattern>*/tests/phpunit/*\.php</exclude-pattern>
+       </rule>
        <file>.</file>
        <arg name="encoding" value="UTF-8"/>
        <arg name="extensions" value="php,php5,inc,sample"/>
index c06ba91..470b9c3 100644 (file)
@@ -26,6 +26,8 @@ production.
 * (T112474) Generalized the ResourceLoader mechanism for overriding modules
   using a particular page during edit previews.
 * Added 'ApiParseMakeOutputPage' hook.
+* (T174313) Added checkbox on Special:ListUsers to display only users in temporary
+  user groups.
 
 === External library changes in 1.32 ===
 * …
@@ -109,8 +111,18 @@ because of Phabricator reports.
 * Overriding SearchEngine::{searchText,searchTitle,searchArchiveTitle}
   in extending classes is deprecated.  Extend related doSearch* methods
   instead.
+* CollationFa has been removed completely as it's not needed anymore
+* The following 'mediawiki.api' plugin modules were merged into mediawiki.api
+  and deprecated: mediawiki.api.category, mediawiki.api.edit,
+  mediawiki.api.login, mediawiki.api.options, mediawiki.api.parse,
+  mediawiki.api.upload, mediawiki.api.user, mediawiki.api.watch,
+  mediawiki.api.messages, and mediawiki.api.rollback.
 
 === Other changes in 1.32 ===
+* Soft hyphens (U+00AD) are now automatically removed from titles; these
+  characters can accidentally end up in copy-and-pasted titles.
+* Strip Unicode 6.3.0 directional formatting characters (U+061C, U+2066,
+  U+2067, U+2068, U+2069) from the title.
 * …
 
 == Compatibility ==
index c55b931..40ded45 100644 (file)
@@ -280,7 +280,6 @@ $wgAutoloadLocalClasses = [
        'Collation' => __DIR__ . '/includes/collation/Collation.php',
        'CollationCkb' => __DIR__ . '/includes/collation/CollationCkb.php',
        'CollationEt' => __DIR__ . '/includes/collation/CollationEt.php',
-       'CollationFa' => __DIR__ . '/includes/collation/CollationFa.php',
        'CommandLineInc' => __DIR__ . '/maintenance/commandLine.inc',
        'CommandLineInstaller' => __DIR__ . '/maintenance/install.php',
        'CommentStore' => __DIR__ . '/includes/CommentStore.php',
@@ -1446,6 +1445,7 @@ $wgAutoloadLocalClasses = [
        'SpecialPageFactory' => __DIR__ . '/includes/specialpage/SpecialPageFactory.php',
        'SpecialPageLanguage' => __DIR__ . '/includes/specials/SpecialPageLanguage.php',
        'SpecialPagesWithProp' => __DIR__ . '/includes/specials/SpecialPagesWithProp.php',
+       'SpecialPasswordPolicies' => __DIR__ . '/includes/specials/SpecialPasswordPolicies.php',
        'SpecialPasswordReset' => __DIR__ . '/includes/specials/SpecialPasswordReset.php',
        'SpecialPermanentLink' => __DIR__ . '/includes/specials/SpecialPermanentLink.php',
        'SpecialPreferences' => __DIR__ . '/includes/specials/SpecialPreferences.php',
index 75fcff3..35b556d 100644 (file)
@@ -23,6 +23,9 @@
 
 use MediaWiki\MediaWikiServices;
 
+// Use superglobals, but since it's deprecated, it's not worth fixing
+// phpcs:disable MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals
+
 /**
  * @defgroup Ajax Ajax
  */
index 2bae13b..2ce1f3e 100644 (file)
@@ -521,7 +521,7 @@ class Block {
         *
         * @param IDatabase $dbw If you have one available
         * @return bool|array False on failure, assoc array on success:
-        *      ('id' => block ID, 'autoIds' => array of autoblock IDs)
+        *      ('id' => block ID, 'autoIds' => array of autoblock IDs)
         */
        public function insert( $dbw = null ) {
                global $wgBlockDisablesLogin;
index 6d39e3a..67ce1f3 100644 (file)
@@ -938,7 +938,7 @@ class EditPage {
                        if ( $this->incompleteForm ) {
                                # If the form is incomplete, force to preview.
                                wfDebug( __METHOD__ . ": Form data appears to be incomplete\n" );
-                               wfDebug( "POST DATA: " . var_export( $_POST, true ) . "\n" );
+                               wfDebug( "POST DATA: " . var_export( $request->getPostValues(), true ) . "\n" );
                                $this->preview = true;
                        } else {
                                $this->preview = $request->getCheck( 'wpPreview' );
index 7e8df7e..659ac9d 100644 (file)
@@ -1089,7 +1089,8 @@ function wfIsDebugRawPage() {
        if ( $cache !== null ) {
                return $cache;
        }
-       # Check for raw action using $_GET not $wgRequest, since the latter might not be initialised yet
+       // Check for raw action using $_GET not $wgRequest, since the latter might not be initialised yet
+       // phpcs:ignore MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals
        if ( ( isset( $_GET['action'] ) && $_GET['action'] == 'raw' )
                || (
                        isset( $_SERVER['SCRIPT_NAME'] )
@@ -3228,7 +3229,7 @@ function wfRunHooks( $event, array $args = [], $deprecatedVersion = null ) {
  * @param string $format The format string (See php's docs)
  * @param string $data A binary string of binary data
  * @param int|bool $length The minimum length of $data or false. This is to
- *     prevent reading beyond the end of $data. false to disable the check.
+ *     prevent reading beyond the end of $data. false to disable the check.
  *
  * Also be careful when using this function to read unsigned 32 bit integer
  * because php might make it negative.
index 5fc5eb1..5cdbfee 100644 (file)
@@ -1221,9 +1221,9 @@ class Linker {
         * @todo FIXME: Doesn't handle sub-links as in image thumb texts like the main parser
         *
         * @param string $comment Text to format links in. WARNING! Since the output of this
-        *      function is html, $comment must be sanitized for use as html. You probably want
-        *      to pass $comment through Sanitizer::escapeHtmlAllowEntities() before calling
-        *      this function.
+        *      function is html, $comment must be sanitized for use as html. You probably want
+        *      to pass $comment through Sanitizer::escapeHtmlAllowEntities() before calling
+        *      this function.
         * @param Title|null $title An optional title object used to links to sections
         * @param bool $local Whether section links should refer to local page
         * @param string|null $wikiId Id of the wiki to link to (if not the local wiki),
index e6dc0fe..459a7e1 100644 (file)
@@ -636,9 +636,11 @@ class MediaWiki {
 
                if ( $cpIndex > 0 ) {
                        if ( $allowHeaders ) {
-                               $expires = time() + ChronologyProtector::POSITION_TTL;
+                               $now = time();
+                               $expires = $now + ChronologyProtector::POSITION_COOKIE_TTL;
                                $options = [ 'prefix' => '' ];
-                               $request->response()->setCookie( 'cpPosIndex', $cpIndex, $expires, $options );
+                               $value = LBFactory::makeCookieValueFromCPIndex( $cpIndex, $now ); // T190082
+                               $request->response()->setCookie( 'cpPosIndex', $value, $expires, $options );
                        }
 
                        if ( $strategy === 'cookie+url' ) {
index 52dfc11..c7028db 100644 (file)
@@ -2443,7 +2443,7 @@ class OutputPage extends ContextSource {
                if ( $this->mArticleBodyOnly ) {
                        echo $this->mBodytext;
                } else {
-                       // Enable safe mode if requested
+                       // Enable safe mode if requested (T152169)
                        if ( $this->getRequest()->getBool( 'safemode' ) ) {
                                $this->disallowUserJs();
                        }
@@ -2861,6 +2861,17 @@ class OutputPage extends ContextSource {
 
                        $rlClient = new ResourceLoaderClientHtml( $context, [
                                'target' => $this->getTarget(),
+                               'nonce' => $this->getCSPNonce(),
+                               // When 'safemode', disallowUserJs(), or reduceAllowedModules() is used
+                               // to only restrict modules to ORIGIN_CORE (ie. disallow ORIGIN_USER), the list of
+                               // modules enqueud for loading on this page is filtered to just those.
+                               // However, to make sure we also apply the restriction to dynamic dependencies and
+                               // lazy-loaded modules at run-time on the client-side, pass 'safemode' down to the
+                               // StartupModule so that the client-side registry will not contain any restricted
+                               // modules either. (T152169, T185303)
+                               'safemode' => ( $this->getAllowedModules( ResourceLoaderModule::TYPE_COMBINED )
+                                       <= ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL
+                               ) ? '1' : null,
                        ] );
                        $rlClient->setConfig( $this->getJSVars() );
                        $rlClient->setModules( $this->getModules( /*filter*/ true ) );
@@ -2907,7 +2918,7 @@ class OutputPage extends ContextSource {
                }
 
                $pieces[] = Html::element( 'title', null, $this->getHTMLTitle() );
-               $pieces[] = $this->getRlClient()->getHeadHtml( $this->getCSPNonce() );
+               $pieces[] = $this->getRlClient()->getHeadHtml();
                $pieces[] = $this->buildExemptModules();
                $pieces = array_merge( $pieces, array_values( $this->getHeadLinksArray() ) );
                $pieces = array_merge( $pieces, array_values( $this->mHeadItems ) );
index 5cc9a96..2c315a3 100644 (file)
@@ -24,6 +24,8 @@
  * @file
  */
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\LBFactory;
+use Wikimedia\Rdbms\ChronologyProtector;
 
 /**
  * This file is not a valid entry point, perform no further processing unless
@@ -738,9 +740,15 @@ MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->setRequestInfo( [
        'IPAddress' => $wgRequest->getIP(),
        'UserAgent' => $wgRequest->getHeader( 'User-Agent' ),
        'ChronologyProtection' => $wgRequest->getHeader( 'ChronologyProtection' ),
-       // The cpPosIndex cookie has no prefix and is set by MediaWiki::preOutputCommit()
-       'ChronologyPositionIndex' =>
-               $wgRequest->getInt( 'cpPosIndex', (int)$wgRequest->getCookie( 'cpPosIndex', '' ) )
+       'ChronologyPositionIndex' => $wgRequest->getInt(
+               'cpPosIndex',
+               LBFactory::getCPIndexFromCookieValue(
+                       // The cookie has no prefix and is set by MediaWiki::preOutputCommit()
+                       $wgRequest->getCookie( 'cpPosIndex', '' ),
+                       // Mitigate broken client-side cookie expiration handling (T190082)
+                       time() - ChronologyProtector::POSITION_COOKIE_TTL
+               )
+       )
 ] );
 // Make sure that object caching does not undermine the ChronologyProtector improvements
 if ( $wgRequest->getCookie( 'UseDC', '' ) === 'master' ) {
index 7f0dbd7..fd7451c 100644 (file)
@@ -207,8 +207,8 @@ class Title implements LinkTarget {
         * Create a new Title from a prefixed DB key
         *
         * @param string $key The database key, which has underscores
-        *      instead of spaces, possibly including namespace and
-        *      interwiki prefixes
+        *      instead of spaces, possibly including namespace and
+        *      interwiki prefixes
         * @return Title|null Title, or null on an error
         */
        public static function newFromDBkey( $key ) {
index c6ddf81..e0b8de7 100644 (file)
@@ -28,6 +28,9 @@ use MediaWiki\Session\Session;
 use MediaWiki\Session\SessionId;
 use MediaWiki\Session\SessionManager;
 
+// The point of this class is to be a wrapper around super globals
+// phpcs:disable MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals
+
 /**
  * The WebRequest class encapsulates getting at data passed in the
  * URL or via a POSTed form stripping illegal input characters and
@@ -654,6 +657,18 @@ class WebRequest {
                return $_GET;
        }
 
+       /**
+        * Get the values passed via POST.
+        * No transformation is performed on the values.
+        *
+        * @since 1.32
+        * @codeCoverageIgnore
+        * @return array
+        */
+       public function getPostValues() {
+               return $_POST;
+       }
+
        /**
         * Return the contents of the Query with no decoding. Use when you need to
         * know exactly what was sent, e.g. for an OAuth signature over the elements.
index 0988f73..0a4eae8 100644 (file)
@@ -195,9 +195,14 @@ class InfoAction extends FormlessAction {
        }
 
        /**
-        * Returns page information in an easily-manipulated format. Array keys are used so extensions
-        * may add additional information in arbitrary positions. Array values are arrays with one
-        * element to be rendered as a header, arrays with two elements to be rendered as a table row.
+        * Returns an array of info groups (will be rendered as tables), keyed by group ID.
+        * Group IDs are arbitrary and used so that extensions may add additional information in
+        * arbitrary positions (and as message keys for section headers for the tables, prefixed
+        * with 'pageinfo-').
+        * Each info group is a non-associative array of info items (rendered as table rows).
+        * Each info item is an array with two elements: the first describes the type of
+        * information, the second the value for the current page. Both can be strings (will be
+        * interpreted as raw HTML) or messages (will be interpreted as plain text and escaped).
         *
         * @return array
         */
index 5be4703..5d0c27a 100644 (file)
        "apierror-badparameter": "Valor no válido para el parámetro <var>$1</var>.",
        "apierror-badquery": "La consulta no es válida.",
        "apierror-badtimestamp": "Valor no válido \"$2\" para el parámetro de marca de tiempo <var>$1</var>.",
+       "apierror-badtoken": "La ficha CSRF no es válida.",
        "apierror-badupload": "El parámetro de subida de archivo <var>$1</var> no es una subida de archivo. Asegúrate de usar <code>multipart/form-data</code> para tu POST e introduce un nombre de archivo en la cabecera <code>Content-Disposition</code>.",
        "apierror-badurl": "Valor no válido \"$2\" para el parámetro de URL <var>$1</var>.",
        "apierror-baduser": "Valor no válido \"$2\" para el parámetro de usuario <var>$1</var>.",
index 79a33ae..d5ac9e0 100644 (file)
        "api-help-parameters": "{{PLURAL:$1|변수}}:",
        "api-help-param-deprecated": "구식입니다.",
        "api-help-param-required": "이 변수는 필수 입력 사항입니다.",
+       "api-help-param-templated": "이것은 [[Special:ApiHelp/main#main/templatedparams|틀 변수]]입니다. 요청하실 때 $2.",
        "api-help-datatypes-header": "데이터 유형",
        "api-help-datatypes": "API 요청 내 몇몇 매개변수형에 대해 더 자세히 설명해보겠습니다:\n;boolean\n:Boolean 매개변수들은 HTML 체크박스처럼 동작합니다: 만약 매개변수가 지정되었다면, 값에 상관없이 참의 값으로 여겨집니다. 거짓값은 매개변수 전체를 생략하세요.\n;timestamp\n:타임스탬프들은 여러 형식으로 표현될 수 있으나 ISO 8601 날짜와 시간이 추천됩니다. 모든 시간은 UTC이어야 하며, 포함된 시간대는 모두 무시됩니다.\n:* ISO 8601 날짜와 시간, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (구두점과 <kbd>Z</kbd>는 선택입니다.)\n:* ISO 8601 날짜와 시간과 (무시되는) 소수 초, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (대시, 콜론과 <kbd>Z</kbd>는 선택입니다.)\n:* 미디어위키 형식, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* 일반적인 수 형식 <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (<kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, 또는 <kbd>-<var>##</var></kbd>와 같은 선택적 시간대는 무시됩니다)\n:*RFC 2822 형식 (시간대는 생략될 수 있음), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850 형식 (시간대는 생략될 수 있음), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime 형식, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* 1부터 13자리까지의 숫자로 표현된 1970-01-01T00:00:00Z부터 흐른 시간(초) (<kbd>0</kbd>을 제외)\n:* 문자열 <kbd>now</kbd>",
        "api-help-templatedparams-header": "틀 변수",
index 30cae5a..f52dcae 100644 (file)
@@ -63,8 +63,6 @@ abstract class Collation {
                                return new CollationCkb;
                        case 'xx-uca-et':
                                return new CollationEt;
-                       case 'xx-uca-fa':
-                               return new CollationFa;
                        case 'uppercase-ab':
                                return new AbkhazUppercaseCollation;
                        case 'uppercase-ba':
diff --git a/includes/collation/CollationFa.php b/includes/collation/CollationFa.php
deleted file mode 100644 (file)
index 7410886..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-/**
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * Temporary workaround for incorrect collation of Persian language ('fa') in ICU 52 (bug T139110).
- *
- * Replace with other letters that appear in an okish spot in the alphabet
- *
- *  - Characters 'و' 'ا' (often appear at the beginning of words)
- *  - Characters 'ٲ' 'ٳ' (may appear at the beginning of words in loanwords)
- *
- * @since 1.29
- */
-class CollationFa extends IcuCollation {
-
-       // Really hacky - replace with stuff from other blocks.
-       private $override = [
-               // U+0627 ARABIC LETTER ALEF => U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE
-               "\xd8\xa7" => "\xd8\xa3",
-               // U+0648 ARABIC LETTER WAW => U+0649 ARABIC LETTER ALEF MAKSURA
-               "\xd9\x88" => "\xd9\x89",
-               // U+0672 ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE => U+F3001 (private use area)
-               "\xd9\xb2" => "\xF3\xB3\x80\x81",
-               // U+0673 ARABIC LETTER ALEF WITH WAVY HAMZA BELOW => U+F3002 (private use area)
-               "\xd9\xb3" => "\xF3\xB3\x80\x82",
-       ];
-
-       public function __construct() {
-               parent::__construct( 'fa' );
-       }
-
-       public function getSortKey( $string ) {
-               $modified = strtr( $string, $this->override );
-               return parent::getSortKey( $modified );
-       }
-
-       public function getFirstLetter( $string ) {
-               if ( isset( $this->override[substr( $string, 0, 2 )] ) ) {
-                       return substr( $string, 0, 2 );
-               }
-               return parent::getFirstLetter( $string );
-       }
-}
index ff6cfff..043e0f6 100644 (file)
@@ -50,6 +50,9 @@ use Wikimedia\ObjectFactory;
  *                             if 'class' is not specified, this is used as a map
  *                             through HTMLForm::$typeMappings to get the class name.
  *    'default'             -- default value when the form is displayed
+ *    'nodata'              -- if set (to any value, which casts to true), the data
+ *                             for this field will not be loaded from the actual request. Instead,
+ *                             always the default data is set as the value of this field.
  *    'id'                  -- HTML id attribute
  *    'cssclass'            -- CSS class
  *    'csshelpclass'        -- CSS class used to style help text
@@ -1604,9 +1607,10 @@ class HTMLForm extends ContextSource {
         * @param string $legend Legend text for the fieldset
         * @param string $section The section content in plain Html
         * @param array $attributes Additional attributes for the fieldset
+        * @param bool $isRoot Section is at the root of the tree
         * @return string The fieldset's Html
         */
-       protected function wrapFieldSetSection( $legend, $section, $attributes ) {
+       protected function wrapFieldSetSection( $legend, $section, $attributes, $isRoot ) {
                return Xml::fieldset( $legend, $section, $attributes ) . "\n";
        }
 
@@ -1689,7 +1693,9 @@ class HTMLForm extends ContextSource {
                                        if ( $fieldsetIDPrefix ) {
                                                $attributes['id'] = Sanitizer::escapeIdForAttribute( "$fieldsetIDPrefix$key" );
                                        }
-                                       $subsectionHtml .= $this->wrapFieldSetSection( $legend, $section, $attributes );
+                                       $subsectionHtml .= $this->wrapFieldSetSection(
+                                               $legend, $section, $attributes, $fields === $this->mFieldTree
+                                       );
                                } else {
                                        // Just return the inputs, nothing fancy.
                                        $subsectionHtml .= $section;
index ba36888..49cbdee 100644 (file)
@@ -145,7 +145,7 @@ class OOUIHTMLForm extends HTMLForm {
                        [ 'class' => 'mw-htmlform-submit-buttons' ], "\n$buttons" ) . "\n";
        }
 
-       protected function wrapFieldSetSection( $legend, $section, $attributes ) {
+       protected function wrapFieldSetSection( $legend, $section, $attributes, $isRoot ) {
                // to get a user visible effect, wrap the fieldset into a framed panel layout
                $layout = new OOUI\PanelLayout( [
                        'expanded' => false,
index 6eff6c9..c0005c5 100644 (file)
@@ -33,7 +33,7 @@ class Http {
         * @param string $method HTTP method. Usually GET/POST
         * @param string $url Full URL to act on. If protocol-relative, will be expanded to an http:// URL
         * @param array $options Options to pass to MWHttpRequest object.
-        *      Possible keys for the array:
+        *      Possible keys for the array:
         *    - timeout             Timeout length in seconds
         *    - connectTimeout      Timeout for connection, in seconds (curl only)
         *    - postData            An array of key-value pairs or a url-encoded form data
index cc48e2f..44b4e30 100644 (file)
@@ -135,6 +135,7 @@ class MssqlUpdater extends DatabaseUpdater {
                        [ 'modifyfield', 'externallinks', 'el_index_60',
                                'patch-externallinks-el_index_60-drop-default.sql' ],
                        [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
+                       [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
                ];
        }
 
index 9365e98..d70edea 100644 (file)
@@ -355,6 +355,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'modifyfield', 'externallinks', 'el_index_60',
                                'patch-externallinks-el_index_60-drop-default.sql' ],
                        [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
+                       [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
                ];
        }
 
index 34d81a7..965187a 100644 (file)
@@ -152,6 +152,7 @@ class OracleUpdater extends DatabaseUpdater {
                        [ 'addTable', 'change_tag_def', 'patch-change_tag_def.sql' ],
                        [ 'populateExternallinksIndex60' ],
                        [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
+                       [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
 
                        // KEEP THIS AT THE BOTTOM!!
                        [ 'doRebuildDuplicateFunction' ],
index 6263edb..49419ea 100644 (file)
@@ -575,6 +575,13 @@ class PostgresUpdater extends DatabaseUpdater {
                        [ 'populateExternallinksIndex60' ],
                        [ 'dropDefault', 'externallinks', 'el_index_60' ],
                        [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
+                       [ 'addPgField', 'change_tag', 'ct_tag_id', 'INTEGER NULL' ],
+                       [
+                               'addPgIndex',
+                               'change_tag',
+                               'change_tag_tag_id_id',
+                               '( ct_tag_id, ct_rc_id, ct_rev_id, ct_log_id )'
+                       ],
                ];
        }
 
index 961cb84..2b27d37 100644 (file)
@@ -219,6 +219,7 @@ class SqliteUpdater extends DatabaseUpdater {
                        [ 'modifyfield', 'externallinks', 'el_index_60',
                                'patch-externallinks-el_index_60-drop-default.sql' ],
                        [ 'runMaintenance', DeduplicateArchiveRevId::class, 'maintenance/deduplicateArchiveRevId.php' ],
+                       [ 'addField', 'change_tag', 'ct_tag_id', 'patch-change_tag-tag_id.sql' ],
                ];
        }
 
index 8f9e592..b5fc069 100644 (file)
@@ -34,7 +34,8 @@
                        "Dgstranz",
                        "Irus",
                        "Tinss",
-                       "KATRINE1992"
+                       "KATRINE1992",
+                       "MarcoAurelio"
                ]
        },
        "config-desc": "El instalador de MediaWiki",
@@ -93,7 +94,7 @@
        "config-apc": "[http://www.php.net/apc APC] está instalado",
        "config-apcu": "[http://www.php.net/apcu APCu] está instalado",
        "config-wincache": "[https://www.iis.net/download/WinCacheForPhp WinCache] está instalado",
-       "config-no-cache-apcu": "<strong>Advertencia:</strong> No se pudo encontrar [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nEl caché de objetos no está activado.",
+       "config-no-cache-apcu": "<strong>Atención:</strong> no se pudo encontrar [http://www.php.net/apcu APCu] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nEl almacenamiento en antememoria de objetos no está activado.",
        "config-mod-security": "<strong>Advertencia:</strong> tu servidor web tiene activado [https://modsecurity.org/ mod_security]/mod_security2. Muchas de sus configuraciones comunes pueden causar problemas a MediaWiki u otro software que permita a los usuarios publicar contenido arbitrario. De ser posible, deberías desactivarlo. Si no, consulta la [https://modsecurity.org/documentation/ documentación de mod_security] o contacta con el administrador de tu servidor si encuentras errores aleatorios.",
        "config-diff3-bad": "GNU diff3 no se encuentra.",
        "config-git": "Se encontró el software de control de versiones Git: <code>$1</code>.",
        "config-cache-options": "Configuración de la antememoria de objetos:",
        "config-cache-help": "El almacenamiento en caché de objetos se utiliza para mejorar la velocidad de MediaWiki mediante el almacenamiento en caché los datos usados más frecuentemente.\nA los sitios medianos y grandes se les recomienda que permitirlo. También es beneficioso para los sitios pequeños.",
        "config-cache-none": "Sin almacenamiento en caché (no se pierde ninguna funcionalidad, pero la velocidad puede resentirse en sitios grandes)",
-       "config-cache-accel": "Almacenamiento en caché de objetos PHP (APC, APCu, XCache o WinCache)",
+       "config-cache-accel": "Almacenamiento en antememoria de objetos PHP (APC, APCu o WinCache)",
        "config-cache-memcached": "Utilizar Memcached (necesita ser instalado y configurado aparte)",
        "config-memcached-servers": "Servidores Memcached:",
        "config-memcached-help": "Lista de direcciones IP que serán usadas por Memcached.\nDeben especificarse una por cada línea y especificar el puerto a utilizar. Por ejemplo:\n127.0.0.1:11211\n192.168.1.25:1234",
        "config-extension-link": "¿Sabías que tu wiki admite [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nPuedes navegar por las [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category categorías] o visitar el [https://www.mediawiki.org/wiki/Extension_Matrix centro de extensiones] para ver una lista completa.",
        "config-skins-screenshots": "$1 (capturas de pantalla: $2)",
        "config-skins-screenshot": "$1 ($2)",
+       "config-extensions-requires": "$1 (requiere $2)",
        "config-screenshot": "captura de pantalla",
        "mainpagetext": "<strong>MediaWiki se ha instalado.</strong>",
        "mainpagedocfooter": "Consulta la [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents guía] para obtener información sobre el uso del software wiki.\n\n== Primeros pasos ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de publicación de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducir MediaWiki a tu idioma]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprende a combatir el spam en tu wiki]"
index 6d94297..31a3d5a 100644 (file)
@@ -78,7 +78,7 @@
        "config-apc": "[http://www.php.net/apc APC] kurulu",
        "config-apcu": "[http://www.php.net/apcu APCu] yüklendi",
        "config-wincache": "[https://www.iis.net/download/WinCacheForPhp WinCache] kurulu",
-       "config-no-cache-apcu": "<strong>Uyarı:</strong> [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] ya da [http://www.iis.net/download/WinCacheForPhp WinCache] kurulumu bulunamadı.\nNesne önbellekleme etkin değil.",
+       "config-no-cache-apcu": "<strong>Uyarı:</strong> [http://www.php.net/apcu APCu] ya da [http://www.iis.net/download/WinCacheForPhp WinCache] kurulumu bulunamadı.\nNesne önbellekleme etkin değil.",
        "config-mod-security": "<strong>'''Uyarı:'''</strong> Web sunucunuz [https://modsecurity.org/mod_security2 mod_security] etkin. Bunun birçok yaygın yapılandırması bulunur ve eğer yanlış yapılandırılmış ise, bu MediaWiki ve kullanıcılara isteğe bağlı içerik göndermesine izin veren diğer yazılımlar için sorun oluşturabilir.\nMümkünse bu devre dışı bırakılmalıdır. Aksi takdirde rastgele hatalar alırsanız [https://modsecurity.org/documentation/ mod_security belgelemesine] bakın ya da sunucunuzun desteğine başvurun.",
        "config-diff3-bad": "GNU diff3 bulunamadı.",
        "config-git": "Sürüm kontrol yazılımı Git bulundu: <code>$1</code>.",
index 6b3e4a7..c41aab3 100644 (file)
@@ -217,7 +217,7 @@ class CryptHKDF {
         * @param string $ikm The input keying material
         * @param string $salt The salt to add to the ikm, to get the prk
         * @param string $info Optional context (change the output without affecting
-        *      the randomness properties of the output)
+        *      the randomness properties of the output)
         * @param int $L Number of bytes to return
         * @return string Cryptographically secure pseudorandom binary string
         */
index 053a5ff..654b189 100644 (file)
@@ -107,7 +107,7 @@ class MultiHttpClient implements LoggerAwareInterface {
         *   - error     : Any cURL error string
         * The map also stores integer-indexed copies of these values. This lets callers do:
         * @code
-        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $http->run( $req );
+        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $http->run( $req );
         * @endcode
         * @param array $req HTTP request array
         * @param array $opts
index 5695d82..997974e 100644 (file)
@@ -1811,7 +1811,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( $code == 401 ) { // possibly a stale token
                        $this->srvCache->delete( $this->getCredsCacheKey( $this->swiftUser ) );
                }
-               $msg = "HTTP {code} ({desc}) in '{func}' (given '{params}')";
+               $msg = "HTTP {code} ({desc}) in '{func}' (given '{req_params}')";
                $msgParams = [
                        'code'   => $code,
                        'desc'   => $desc,
index 186014b..8b21ede 100644 (file)
@@ -63,6 +63,8 @@ class ChronologyProtector implements LoggerAwareInterface {
 
        /** @var int Seconds to store positions */
        const POSITION_TTL = 60;
+       /** @var int Seconds to store position write index cookies (safely less than POSITION_TTL) */
+       const POSITION_COOKIE_TTL = 60;
        /** @var int Max time to wait for positions to appear */
        const POS_STORE_WAIT_TIMEOUT = 5;
 
index 45e7cbb..16d0e31 100644 (file)
@@ -321,10 +321,10 @@ interface ILBFactory {
         * Note that unlike cookies, this works accross domains
         *
         * @param string $url
-        * @param float $time UNIX timestamp just before shutdown() was called
+        * @param int $index Write counter index
         * @return string
         */
-       public function appendShutdownCPIndexAsQuery( $url, $time );
+       public function appendShutdownCPIndexAsQuery( $url, $index );
 
        /**
         * @param array $info Map of fields, including:
index 955c28d..7f5990d 100644 (file)
@@ -139,6 +139,7 @@ abstract class LBFactory implements ILBFactory {
                        'IPAddress' => isset( $_SERVER[ 'REMOTE_ADDR' ] ) ? $_SERVER[ 'REMOTE_ADDR' ] : '',
                        'UserAgent' => isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT'] : '',
                        'ChronologyProtection' => 'true',
+                       // phpcs:ignore MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals -- library can't use $wgRequest
                        'ChronologyPositionIndex' => isset( $_GET['cpPosIndex'] ) ? $_GET['cpPosIndex'] : null
                ];
 
@@ -640,6 +641,36 @@ abstract class LBFactory implements ILBFactory {
                return strpos( $url, '?' ) === false ? "$url?cpPosIndex=$index" : "$url&cpPosIndex=$index";
        }
 
+       /**
+        * @param int $index Write index
+        * @param int $time UNIX timestamp
+        * @return string Timestamp-qualified write index of the form "<index>.<timestamp>"
+        * @since 1.32
+        */
+       public static function makeCookieValueFromCPIndex( $index, $time ) {
+               return $index . '@' . $time;
+       }
+
+       /**
+        * @param string $value String possibly of the form "<index>" or "<index>@<timestamp>"
+        * @param int $minTimestamp Lowest UNIX timestamp of non-expired values (if present)
+        * @return int|null Write index or null if $value is empty or expired
+        * @since 1.32
+        */
+       public static function getCPIndexFromCookieValue( $value, $minTimestamp ) {
+               if ( !preg_match( '/^(\d+)(?:@(\d+))?$/', $value, $m ) ) {
+                       return null;
+               }
+
+               $index = (int)$m[1];
+
+               if ( isset( $m[2] ) && $m[2] !== '' && (int)$m[2] < $minTimestamp ) {
+                       return null; // expired
+               }
+
+               return ( $index > 0 ) ? $index : null;
+       }
+
        public function setRequestInfo( array $info ) {
                if ( $this->chronProt ) {
                        throw new LogicException( 'ChronologyProtector already initialized.' );
index ac20b6a..4e39537 100644 (file)
@@ -138,6 +138,9 @@ class Parser {
        const TOC_START = '<mw:toc>';
        const TOC_END = '</mw:toc>';
 
+       /** @var int Assume that no output will later be saved this many seconds after parsing */
+       const MAX_TTS = 900;
+
        # Persistent:
        public $mTagHooks = [];
        public $mTransparentTagHooks = [];
@@ -2652,39 +2655,19 @@ class Parser {
                                }
                                break;
                        case 'revisionday':
-                               # Let the edit saving system know we should parse the page
-                               # *after* a revision ID has been assigned. This is for null edits.
-                               $this->mOutput->setFlag( 'vary-revision' );
-                               wfDebug( __METHOD__ . ": {{REVISIONDAY}} used, setting vary-revision...\n" );
-                               $value = intval( substr( $this->getRevisionTimestamp(), 6, 2 ) );
+                               $value = (int)$this->getRevisionTimestampSubstring( 6, 2, self::MAX_TTS, $index );
                                break;
                        case 'revisionday2':
-                               # Let the edit saving system know we should parse the page
-                               # *after* a revision ID has been assigned. This is for null edits.
-                               $this->mOutput->setFlag( 'vary-revision' );
-                               wfDebug( __METHOD__ . ": {{REVISIONDAY2}} used, setting vary-revision...\n" );
-                               $value = substr( $this->getRevisionTimestamp(), 6, 2 );
+                               $value = $this->getRevisionTimestampSubstring( 6, 2, self::MAX_TTS, $index );
                                break;
                        case 'revisionmonth':
-                               # Let the edit saving system know we should parse the page
-                               # *after* a revision ID has been assigned. This is for null edits.
-                               $this->mOutput->setFlag( 'vary-revision' );
-                               wfDebug( __METHOD__ . ": {{REVISIONMONTH}} used, setting vary-revision...\n" );
-                               $value = substr( $this->getRevisionTimestamp(), 4, 2 );
+                               $value = $this->getRevisionTimestampSubstring( 4, 2, self::MAX_TTS, $index );
                                break;
                        case 'revisionmonth1':
-                               # Let the edit saving system know we should parse the page
-                               # *after* a revision ID has been assigned. This is for null edits.
-                               $this->mOutput->setFlag( 'vary-revision' );
-                               wfDebug( __METHOD__ . ": {{REVISIONMONTH1}} used, setting vary-revision...\n" );
-                               $value = intval( substr( $this->getRevisionTimestamp(), 4, 2 ) );
+                               $value = (int)$this->getRevisionTimestampSubstring( 4, 2, self::MAX_TTS, $index );
                                break;
                        case 'revisionyear':
-                               # Let the edit saving system know we should parse the page
-                               # *after* a revision ID has been assigned. This is for null edits.
-                               $this->mOutput->setFlag( 'vary-revision' );
-                               wfDebug( __METHOD__ . ": {{REVISIONYEAR}} used, setting vary-revision...\n" );
-                               $value = substr( $this->getRevisionTimestamp(), 0, 4 );
+                               $value = $this->getRevisionTimestampSubstring( 0, 4, self::MAX_TTS, $index );
                                break;
                        case 'revisiontimestamp':
                                # Let the edit saving system know we should parse the page
@@ -2842,6 +2825,38 @@ class Parser {
                return $value;
        }
 
+       /**
+        * @param int $start
+        * @param int $len
+        * @param int $mtts Max time-till-save; sets vary-revision if result might change by then
+        * @param string $variable Parser variable name
+        * @return string
+        */
+       private function getRevisionTimestampSubstring( $start, $len, $mtts, $variable ) {
+               global $wgContLang;
+
+               # Get the timezone-adjusted timestamp to be used for this revision
+               $resNow = substr( $this->getRevisionTimestamp(), $start, $len );
+               # Possibly set vary-revision if there is not yet an associated revision
+               if ( !$this->getRevisionObject() ) {
+                       # Get the timezone-adjusted timestamp $mtts seconds in the future
+                       $resThen = substr(
+                               $wgContLang->userAdjust( wfTimestamp( TS_MW, time() + $mtts ), '' ),
+                               $start,
+                               $len
+                       );
+
+                       if ( $resNow !== $resThen ) {
+                               # Let the edit saving system know we should parse the page
+                               # *after* a revision ID has been assigned. This is for null edits.
+                               $this->mOutput->setFlag( 'vary-revision' );
+                               wfDebug( __METHOD__ . ": $variable used, setting vary-revision...\n" );
+                       }
+               }
+
+               return $resNow;
+       }
+
        /**
         * initialise the magic variables (like CURRENTMONTHNAME) and substitution modifiers
         *
@@ -2997,7 +3012,7 @@ class Parser {
         *       'expansion-depth-exceeded-category')
         * @param string|int|null $current Current value
         * @param string|int|null $max Maximum allowed, when an explicit limit has been
-        *       exceeded, provide the values (optional)
+        *       exceeded, provide the values (optional)
         */
        public function limitationWarn( $limitationType, $current = '', $max = '' ) {
                # does no harm if $current and $max are present but are unnecessary for the message
index aa015a6..fc36659 100644 (file)
@@ -906,8 +906,7 @@ class ParserOutput extends CacheTime {
         *   * To implement hidden categories, hiding pages from category listings
         *     by storing a property.
         *
-        *   * Overriding the displayed article title.
-        *   @see ParserOutput::setDisplayTitle()
+        *   * Overriding the displayed article title (ParserOutput::setDisplayTitle()).
         *
         *   * To implement image tagging, for example displaying an icon on an
         *     image thumbnail to indicate that it is listed for deletion on
index bf1f8ac..0c52354 100644 (file)
@@ -68,7 +68,7 @@ class UserPasswordPolicy {
         * @param User $user who's policy we are checking
         * @param string $password the password to check
         * @return Status error to indicate the password didn't meet the policy, or fatal to
-        *      indicate the user shouldn't be allowed to login.
+        *      indicate the user shouldn't be allowed to login.
         */
        public function checkUserPassword( User $user, $password ) {
                $effectivePolicy = $this->getPoliciesForUser( $user );
@@ -88,7 +88,7 @@ class UserPasswordPolicy {
         * @param string $password the password to check
         * @param array $groups list of groups to which we assume the user belongs
         * @return Status error to indicate the password didn't meet the policy, or fatal to
-        *      indicate the user shouldn't be allowed to login.
+        *      indicate the user shouldn't be allowed to login.
         */
        public function checkUserPasswordForGroups( User $user, $password, array $groups ) {
                $effectivePolicy = self::getPoliciesForGroups(
index 7e3afaa..564ea6b 100644 (file)
@@ -89,20 +89,34 @@ class ExtensionJsonValidator {
                        );
                }
 
-               $licenseError = false;
+               $extraErrors = [];
                // Check if it's a string, if not, schema validation will display an error
                if ( isset( $data->{'license-name'} ) && is_string( $data->{'license-name'} ) ) {
                        $licenses = new SpdxLicenses();
                        $valid = $licenses->validate( $data->{'license-name'} );
                        if ( !$valid ) {
-                               $licenseError = '[license-name] Invalid SPDX license identifier, '
+                               $extraErrors[] = '[license-name] Invalid SPDX license identifier, '
                                        . 'see <https://spdx.org/licenses/>';
                        }
                }
+               if ( isset( $data->url ) && is_string( $data->url ) ) {
+                       $parsed = wfParseUrl( $data->url );
+                       $mwoUrl = false;
+                       if ( $parsed['host'] === 'www.mediawiki.org' ) {
+                               $mwoUrl = true;
+                       } elseif ( $parsed['host'] === 'mediawiki.org' ) {
+                               $mwoUrl = true;
+                               $extraErrors[] = '[url] Should use www.mediawiki.org domain';
+                       }
+
+                       if ( $mwoUrl && $parsed['scheme'] !== 'https' ) {
+                               $extraErrors[] = '[url] Should use HTTPS for www.mediawiki.org URLs';
+                       }
+               }
 
                $validator = new Validator;
                $validator->check( $data, (object)[ '$ref' => 'file://' . $schemaPath ] );
-               if ( $validator->isValid() && !$licenseError ) {
+               if ( $validator->isValid() && !$extraErrors ) {
                        // All good.
                        return true;
                } else {
@@ -110,8 +124,8 @@ class ExtensionJsonValidator {
                        foreach ( $validator->getErrors() as $error ) {
                                $out .= "[{$error['property']}] {$error['message']}\n";
                        }
-                       if ( $licenseError ) {
-                               $out .= "$licenseError\n";
+                       if ( $extraErrors ) {
+                               $out .= implode( "\n", $extraErrors ) . "\n";
                        }
                        throw new ExtensionJsonValidationError( $out );
                }
index bee3d0c..2274793 100644 (file)
@@ -1503,7 +1503,7 @@ MESSAGE;
         * startup module if the client has adequate support for MediaWiki JavaScript code.
         *
         * @param string $script JavaScript code
-        * @param string $nonce Content-security-policy nonce, from OutputPage::getCSPNonce()
+        * @param string $nonce [optional] Content-Security-Policy nonce (from OutputPage::getCSPNonce)
         * @return WrappedString HTML
         */
        public static function makeInlineScript( $script, $nonce = null ) {
index d0a9c42..3ba63cf 100644 (file)
@@ -57,12 +57,18 @@ class ResourceLoaderClientHtml {
        /**
         * @param ResourceLoaderContext $context
         * @param array $options [optional] Array of options
-        *  - 'target': Custom parameter passed to StartupModule.
+        *  - 'target': Parameter for modules=startup request, see ResourceLoaderStartUpModule.
+        *  - 'safemode': Parameter for modules=startup request, see ResourceLoaderStartUpModule.
+        *  - 'nonce': From OutputPage::getCSPNonce().
         */
        public function __construct( ResourceLoaderContext $context, array $options = [] ) {
                $this->context = $context;
                $this->resourceLoader = $context->getResourceLoader();
-               $this->options = $options;
+               $this->options = $options + [
+                       'target' => null,
+                       'safemode' => null,
+                       'nonce' => null,
+               ];
        }
 
        /**
@@ -139,7 +145,8 @@ class ResourceLoaderClientHtml {
                                'styles' => [],
                                'general' => [],
                        ],
-
+                       // Deprecations for style-only modules
+                       'styledeprecations' => [],
                ];
 
                foreach ( $this->modules as $name ) {
@@ -204,6 +211,10 @@ class ResourceLoaderClientHtml {
                                        $data['styles'][] = $name;
                                }
                        }
+                       $deprecation = $module->getDeprecationInformation();
+                       if ( $deprecation ) {
+                               $data['styledeprecations'][] = $deprecation;
+                       }
                }
 
                foreach ( $this->moduleScripts as $name ) {
@@ -248,10 +259,10 @@ class ResourceLoaderClientHtml {
         * - Inline scripts can't be asynchronous.
         * - For styles, earlier is better.
         *
-        * @param string $nonce From OutputPage::getCSPNonce()
         * @return string|WrappedStringList HTML
         */
-       public function getHeadHtml( $nonce ) {
+       public function getHeadHtml() {
+               $nonce = $this->options['nonce'];
                $data = $this->getData();
                $chunks = [];
 
@@ -307,7 +318,15 @@ class ResourceLoaderClientHtml {
                        );
                }
 
-               // External stylesheets
+               // Deprecations for only=styles modules
+               if ( $data['styledeprecations'] ) {
+                       $chunks[] = ResourceLoader::makeInlineScript(
+                               implode( '', $data['styledeprecations'] ),
+                               $nonce
+                       );
+               }
+
+               // External stylesheets (only=styles)
                if ( $data['styles'] ) {
                        $chunks[] = $this->getLoad(
                                $data['styles'],
@@ -327,9 +346,12 @@ class ResourceLoaderClientHtml {
 
                // Async scripts. Once the startup is loaded, inline RLQ scripts will run.
                // Pass-through a custom 'target' from OutputPage (T143066).
-               $startupQuery = isset( $this->options['target'] )
-                       ? [ 'target' => (string)$this->options['target'] ]
-                       : [];
+               $startupQuery = [];
+               foreach ( [ 'target', 'safemode' ] as $param ) {
+                       if ( $this->options[$param] !== null ) {
+                               $startupQuery[$param] = (string)$this->options[$param];
+                       }
+               }
                $chunks[] = $this->getLoad(
                        'startup',
                        ResourceLoaderModule::TYPE_SCRIPTS,
@@ -379,12 +401,12 @@ class ResourceLoaderClientHtml {
         * @param ResourceLoaderContext $mainContext
         * @param array $modules One or more module names
         * @param string $only ResourceLoaderModule TYPE_ class constant
-        * @param array $extraQuery Array with extra query parameters for the request
-        * @param string $nonce See OutputPage::getCSPNonce() [Since 1.32]
+        * @param array $extraQuery [optional] Array with extra query parameters for the request
+        * @param string $nonce [optional] Content-Security-Policy nonce (from OutputPage::getCSPNonce)
         * @return string|WrappedStringList HTML
         */
        public static function makeLoad( ResourceLoaderContext $mainContext, array $modules, $only,
-               array $extraQuery, $nonce
+               array $extraQuery = [], $nonce = null
        ) {
                $rl = $mainContext->getResourceLoader();
                $chunks = [];
index 6d1529b..a0a4e58 100644 (file)
@@ -139,7 +139,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
         *
         * @return string JavaScript code
         */
-       protected function getDeprecationInformation() {
+       public function getDeprecationInformation() {
                $deprecationInfo = $this->deprecated;
                if ( $deprecationInfo ) {
                        $name = $this->getName();
@@ -318,9 +318,9 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
        }
 
        /**
-        * Get the origin of this module. Should only be overridden for foreign modules.
+        * Get the source of this module. Should only be overridden for foreign modules.
         *
-        * @return string Origin name, 'local' for local modules
+        * @return string Source name, 'local' for local modules
         */
        public function getSource() {
                // Stub, override expected
index 2e3c6fc..0416c85 100644 (file)
  * the ability to vary based extra query parameters, in addition to those
  * from ResourceLoaderContext:
  *
- * - target: Only register modules in the client allowed within this target.
+ * - target: Only register modules in the client intended for this target.
  *   Default: "desktop".
  *   See also: OutputPage::setTarget(), ResourceLoaderModule::getTargets().
+ *
+ * - safemode: Only register modules that have ORIGIN_CORE as their origin.
+ *   This effectively disables ORIGIN_USER modules. (T185303)
+ *   See also: OutputPage::disallowUserJs()
  */
 class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 
@@ -171,10 +175,10 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
         * Optimize the dependency tree in $this->modules.
         *
         * The optimization basically works like this:
-        *      Given we have module A with the dependencies B and C
-        *              and module B with the dependency C.
-        *      Now we don't have to tell the client to explicitly fetch module
-        *              C as that's already included in module B.
+        *      Given we have module A with the dependencies B and C
+        *              and module B with the dependency C.
+        *      Now we don't have to tell the client to explicitly fetch module
+        *              C as that's already included in module B.
         *
         * This way we can reasonably reduce the amount of module registration
         * data send to the client.
@@ -208,6 +212,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                // Future developers: Use WebRequest::getRawVal() instead getVal().
                // The getVal() method performs slow Language+UTF logic. (f303bb9360)
                $target = $context->getRequest()->getRawVal( 'target', 'desktop' );
+               $safemode = $context->getRequest()->getRawVal( 'safemode' ) === '1';
                // Bypass target filter if this request is Special:JavaScriptTest.
                // To prevent misuse in production, this is only allowed if testing is enabled server-side.
                $byPassTargetFilter = $this->getConfig()->get( 'EnableJavaScriptTest' ) && $target === 'test';
@@ -220,7 +225,10 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                foreach ( $resourceLoader->getModuleNames() as $name ) {
                        $module = $resourceLoader->getModule( $name );
                        $moduleTargets = $module->getTargets();
-                       if ( !$byPassTargetFilter && !in_array( $target, $moduleTargets ) ) {
+                       if (
+                               ( !$byPassTargetFilter && !in_array( $target, $moduleTargets ) )
+                               || ( $safemode && $module->getOrigin() > ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL )
+                       ) {
                                continue;
                        }
 
index fdf4d52..b3cb806 100644 (file)
@@ -112,6 +112,7 @@ class SpecialPageFactory {
                'Listbots' => SpecialListBots::class,
                'Userrights' => UserrightsPage::class,
                'EditWatchlist' => SpecialEditWatchlist::class,
+               'PasswordPolicies' => SpecialPasswordPolicies::class,
 
                // Recent changes and logs
                'Newimages' => SpecialNewFiles::class,
index f9c917d..ef05dd1 100644 (file)
@@ -126,7 +126,7 @@ class SpecialAllPages extends IncludableSpecialPage {
                                'id' => 'namespace',
                                'label-message' => 'namespace',
                                'all' => null,
-                               'value' => $namespace,
+                               'default' => $namespace,
                        ],
                        'hideredirects' => [
                                'type' => 'check',
@@ -141,7 +141,9 @@ class SpecialAllPages extends IncludableSpecialPage {
                        unset( $fields['hideredirects'] );
                }
 
-               $form = HTMLForm::factory( 'table', $fields, $this->getContext() );
+               $context = new DerivativeContext( $this->getContext() );
+               $context->setTitle( $this->getPageTitle() ); // Remove subpage
+               $form = HTMLForm::factory( 'table', $fields, $context );
                $form->setMethod( 'get' )
                        ->setWrapperLegendMsg( 'allpages' )
                        ->setSubmitTextMsg( 'allpagessubmit' )
diff --git a/includes/specials/SpecialPasswordPolicies.php b/includes/specials/SpecialPasswordPolicies.php
new file mode 100644 (file)
index 0000000..415f973
--- /dev/null
@@ -0,0 +1,163 @@
+<?php
+/**
+ * Implements Special:PasswordPolicies
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup SpecialPage
+ */
+
+/**
+ * This special page lists the defined password policies for user groups.
+ * See also @ref $wgPasswordPolicy.
+ *
+ * @ingroup SpecialPage
+ * @since 1.32
+ */
+class SpecialPasswordPolicies extends SpecialPage {
+       public function __construct() {
+               parent::__construct( 'PasswordPolicies' );
+       }
+
+       /**
+        * Show the special page
+        * @param string|null $par
+        */
+       public function execute( $par ) {
+               $this->setHeaders();
+               $this->outputHeader();
+
+               $out = $this->getOutput();
+               $out->addModuleStyles( 'mediawiki.special' );
+
+               $this->addHelpLink( 'Help:Password policies' );
+
+               $out->addHTML(
+                       Xml::openElement( 'table', [ 'class' => 'wikitable mw-passwordpolicies-table' ] ) .
+                               '<tr>' .
+                               Xml::element( 'th', null, $this->msg( 'passwordpolicies-group' )->text() ) .
+                               Xml::element( 'th', null, $this->msg( 'passwordpolicies-policies' )->text() ) .
+                               '</tr>'
+               );
+
+               $config = $this->getConfig();
+               $policies = $config->get( 'PasswordPolicy' );
+
+               $groupPermissions = $config->get( 'GroupPermissions' );
+               $revokePermissions = $config->get( 'RevokePermissions' );
+               $addGroups = $config->get( 'AddGroups' );
+               $removeGroups = $config->get( 'RemoveGroups' );
+               $groupsAddToSelf = $config->get( 'GroupsAddToSelf' );
+               $groupsRemoveFromSelf = $config->get( 'GroupsRemoveFromSelf' );
+               $allGroups = array_unique( array_merge(
+                       array_keys( $groupPermissions ),
+                       array_keys( $revokePermissions ),
+                       array_keys( $addGroups ),
+                       array_keys( $removeGroups ),
+                       array_keys( $groupsAddToSelf ),
+                       array_keys( $groupsRemoveFromSelf )
+               ) );
+               asort( $allGroups );
+
+               $linkRenderer = $this->getLinkRenderer();
+
+               foreach ( $allGroups as $group ) {
+                       if ( $group == '*' ) {
+                               continue;
+                       }
+
+                       $groupnameLocalized = UserGroupMembership::getGroupName( $group );
+
+                       $grouppageLocalizedTitle = UserGroupMembership::getGroupPage( $group )
+                               ?: Title::newFromText( MWNamespace::getCanonicalName( NS_PROJECT ) . ':' . $group );
+
+                       $grouppage = $linkRenderer->makeLink(
+                               $grouppageLocalizedTitle,
+                               $groupnameLocalized
+                       );
+
+                       if ( $group === 'user' ) {
+                               // Link to Special:listusers for implicit group 'user'
+                               $grouplink = '<br />' . $linkRenderer->makeKnownLink(
+                                       SpecialPage::getTitleFor( 'Listusers' ),
+                                       $this->msg( 'listgrouprights-members' )->text()
+                               );
+                       } elseif ( !in_array( $group, $config->get( 'ImplicitGroups' ) ) ) {
+                               $grouplink = '<br />' . $linkRenderer->makeKnownLink(
+                                       SpecialPage::getTitleFor( 'Listusers' ),
+                                       $this->msg( 'listgrouprights-members' )->text(),
+                                       [],
+                                       [ 'group' => $group ]
+                               );
+                       } else {
+                               // No link to Special:listusers for other implicit groups as they are unlistable
+                               $grouplink = '';
+                       }
+
+                       $out->addHTML( Html::rawElement( 'tr', [ 'id' => Sanitizer::escapeIdForAttribute( $group ) ], "
+                               <td>$grouppage$grouplink</td>
+                               <td>" . $this->formatPolicies( $policies, $group ) . '</td>
+                               '
+                       ) );
+
+               }
+
+               $out->addHTML( Xml::closeElement( 'table' ) );
+       }
+
+       /**
+        * Create a HTML list of password policies for $group
+        *
+        * @param array $policies Original $wgPasswordPolicy array
+        * @param array $group Group to format password policies for
+        *
+        * @return string HTML list of all applied password policies
+        */
+       private function formatPolicies( $policies, $group ) {
+               $groupPolicies = UserPasswordPolicy::getPoliciesForGroups(
+                       $policies['policies'],
+                       [ $group ],
+                       $policies['policies']['default']
+               );
+
+               $ret = [];
+               foreach ( $groupPolicies as $gp => $val ) {
+                       if ( $val === false ) {
+                               // Policy isn't enabled, so no need to dislpay it
+                               continue;
+                       } elseif ( $val === true ) {
+                               $msg = $this->msg( 'passwordpolicies-policy-' . strtolower( $gp ) );
+                       } else {
+                               $msg = $this->msg( 'passwordpolicies-policy-' . strtolower( $gp ) )->numParams( $val );
+                       }
+                       $ret[] = $this->msg(
+                               'passwordpolicies-policy-display',
+                               $msg,
+                               '<span class="mw-passwordpolicies-policy-name">' . $gp . '</span>'
+                       )->parse();
+               }
+               if ( !count( $ret ) ) {
+                       return '';
+               } else {
+                       return '<ul><li>' . implode( "</li>\n<li>", $ret ) . '</li></ul>';
+               }
+       }
+
+       protected function getGroupName() {
+               return 'users';
+       }
+}
index 1cfcffa..7a4cde9 100644 (file)
@@ -73,6 +73,7 @@ class SpecialPreferences extends SpecialPage {
                if ( $this->oouiEnabled ) {
                        $out->addModules( 'mediawiki.special.preferences.ooui' );
                        $out->addModuleStyles( 'mediawiki.special.preferences.styles.ooui' );
+                       $out->addModuleStyles( 'oojs-ui-widgets.styles' );
                } else {
                        $out->addModules( 'mediawiki.special.preferences' );
                        $out->addModuleStyles( 'mediawiki.special.preferences.styles' );
@@ -118,9 +119,6 @@ class SpecialPreferences extends SpecialPage {
                                ];
                        }
                        $out->addJsConfigVars( 'wgPreferencesTabs', $prefTabs );
-
-                       // TODO: Render fake tabs here to avoid FOUC.
-                       // $out->addHTML( $fakeTabs );
                } else {
 
                        $prefTabs = '';
index 2f285c9..3ca3a85 100644 (file)
@@ -128,7 +128,7 @@ class SpecialPrefixindex extends SpecialAllPages {
                ];
                $context = new DerivativeContext( $this->getContext() );
                $context->setTitle( $this->getPageTitle() ); // Remove subpage
-               $htmlForm = new HTMLForm( $formDescriptor, $context );
+               $htmlForm = HTMLForm::factory( 'ooui', $formDescriptor, $context );
                $htmlForm
                        ->setMethod( 'get' )
                        ->setWrapperLegendMsg( 'prefixindex' )
index e503d92..3ee7cea 100644 (file)
@@ -41,7 +41,7 @@ class SpecialTrackingCategories extends SpecialPage {
                $this->outputHeader();
                $this->getOutput()->allowClickjacking();
                $this->getOutput()->addHTML(
-                       Html::openElement( 'table', [ 'class' => 'mw-datatable',
+                       Html::openElement( 'table', [ 'class' => 'mw-datatable sortable',
                                'id' => 'mw-trackingcategories-table' ] ) . "\n" .
                        "<thead><tr>
                        <th>" .
index 3080fbf..5677ac8 100644 (file)
@@ -208,8 +208,16 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                                        if ( $hidelinks || $hidetrans || $hideredirs || $hideimages ) {
                                                $out->addHTML( $this->getFilterPanel() );
                                        }
-                                       $errMsg = is_int( $namespace ) ? 'nolinkshere-ns' : 'nolinkshere';
-                                       $out->addWikiMsg( $errMsg, $this->target->getPrefixedText() );
+                                       $msgKey = is_int( $namespace ) ? 'nolinkshere-ns-2' : 'nolinkshere-2';
+                                       $link = $this->getLinkRenderer()->makeKnownLink(
+                                               $this->target,
+                                               null,
+                                               [],
+                                               $this->target->isRedirect() ? [ 'redirect' => 'no' ] : []
+                                       );
+
+                                       $errMsg = $this->msg( $msgKey )->rawParams( $link )->parseAsBlock();
+                                       $out->addHTML( $errMsg );
                                        $out->setStatusCode( 404 );
                                }
                        }
@@ -273,7 +281,16 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                        if ( !$this->including() ) {
                                $out->addHTML( $this->whatlinkshereForm() );
                                $out->addHTML( $this->getFilterPanel() );
-                               $out->addWikiMsg( 'linkshere', $this->target->getPrefixedText() );
+
+                               $link = $this->getLinkRenderer()->makeKnownLink(
+                                       $this->target,
+                                       null,
+                                       [],
+                                       $this->target->isRedirect() ? [ 'redirect' => 'no' ] : []
+                               );
+
+                               $msg = $this->msg( 'linkshere-2' )->rawParams( $link )->parseAsBlock();
+                               $out->addHTML( $msg );
 
                                $prevnext = $this->getPrevNext( $prevId, $nextId );
                                $out->addHTML( $prevnext );
index a781254..3a5adbb 100644 (file)
@@ -114,12 +114,108 @@ class PreferencesFormOOUI extends OOUIHTMLForm implements PreferencesForm {
                return $data;
        }
 
+       protected function wrapFieldSetSection( $legend, $section, $attributes, $isRoot ) {
+               // to get a user visible effect, wrap the fieldset into a framed panel layout
+               if ( $isRoot ) {
+                       // Mimic TabPanelLayout
+                       $wrapper = new OOUI\PanelLayout( [
+                               'expanded' => false,
+                               'scrollable' => true,
+                               // Framed and padded for no-JS, frame hidden with CSS
+                               'framed' => true,
+                               'infusable' => false,
+                               'classes' => [ 'oo-ui-stackLayout oo-ui-indexLayout-stackLayout' ]
+                       ] );
+                       $layout = new OOUI\PanelLayout( [
+                               'expanded' => false,
+                               'scrollable' => true,
+                               'infusable' => false,
+                               'classes' => [ 'oo-ui-tabPanelLayout' ]
+                       ] );
+                       $wrapper->appendContent( $layout );
+               } else {
+                       $wrapper = $layout = new OOUI\PanelLayout( [
+                               'expanded' => false,
+                               'padded' => true,
+                               'framed' => true,
+                               'infusable' => false,
+                       ] );
+               }
+
+               $layout->appendContent(
+                       new OOUI\FieldsetLayout( [
+                               'label' => $legend,
+                               'infusable' => false,
+                               'items' => [
+                                       new OOUI\Widget( [
+                                               'content' => new OOUI\HtmlSnippet( $section )
+                                       ] ),
+                               ],
+                       ] + $attributes )
+               );
+               return $wrapper;
+       }
+
        /**
         * Get the whole body of the form.
         * @return string
         */
        function getBody() {
-               return $this->displaySection( $this->mFieldTree, '', 'mw-prefsection-' );
+               // Construct fake tabs to avoid FOUC. The structure mimics OOUI's tabPanelLayout.
+               // TODO: Consider creating an infusable TabPanelLayout in OOUI-PHP.
+               $fakeTabs = [];
+               foreach ( $this->getPreferenceSections() as $i => $key ) {
+                       $fakeTabs[] =
+                               Html::rawElement(
+                                       'div',
+                                       [
+                                               'class' =>
+                                                       'oo-ui-widget oo-ui-widget-enabled oo-ui-optionWidget '.
+                                                       'oo-ui-tabOptionWidget oo-ui-labelElement' .
+                                                       ( $i === 0 ? ' oo-ui-optionWidget-selected' : '' )
+                                       ],
+                                       Html::element(
+                                               'a',
+                                               [
+                                                       'class' => 'oo-ui-labelElement-label',
+                                                       // Make this a usable link instead of a span so the tabs
+                                                       // can be used before JS runs
+                                                       'href' => '#mw-prefsection-' . $key
+                                               ],
+                                               $this->getLegend( $key )
+                                       )
+                               );
+               }
+               $fakeTabsHtml = Html::rawElement(
+                       'div',
+                       [ 'class' => 'oo-ui-layout oo-ui-panelLayout oo-ui-indexLayout-tabPanel' ],
+                       Html::rawElement(
+                               'div',
+                               [ 'class' => 'oo-ui-widget oo-ui-widget-enabled oo-ui-selectWidget '.
+                                       'oo-ui-selectWidget-depressed oo-ui-tabSelectWidget' ],
+                               implode( $fakeTabs )
+                       )
+               );
+
+               return Html::rawElement(
+                       'div',
+                       [ 'class' => 'oo-ui-layout oo-ui-panelLayout oo-ui-panelLayout-framed mw-prefs-faketabs' ],
+                       Html::rawElement(
+                               'div',
+                               [ 'class' => 'oo-ui-layout oo-ui-menuLayout oo-ui-menuLayout-static ' .
+                                       'oo-ui-menuLayout-top oo-ui-menuLayout-showMenu oo-ui-indexLayout' ],
+                               Html::rawElement(
+                                       'div',
+                                       [ 'class' => 'oo-ui-menuLayout-menu' ],
+                                       $fakeTabsHtml
+                               ) .
+                               Html::rawElement(
+                                       'div',
+                                       [ 'class' => 'oo-ui-menuLayout-content' ],
+                                       $this->displaySection( $this->mFieldTree, '', 'mw-prefsection-' )
+                               )
+                       )
+               );
        }
 
        /**
index 09d4b5e..d17332f 100644 (file)
@@ -70,6 +70,7 @@ class UsersPager extends AlphabeticPager {
                        $this->requestedGroup = '';
                }
                $this->editsOnly = $request->getBool( 'editsOnly' );
+               $this->temporaryGroupsOnly = $request->getBool( 'temporaryGroupsOnly' );
                $this->creationSort = $request->getBool( 'creationSort' );
                $this->including = $including;
                $this->mDefaultDirection = $request->getBool( 'desc' )
@@ -110,9 +111,13 @@ class UsersPager extends AlphabeticPager {
 
                $options = [];
 
+               if ( $this->requestedGroup != '' || $this->temporaryGroupsOnly ) {
+                       $conds[] = 'ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ) .
+                       ( !$this->temporaryGroupsOnly ? ' OR ug_expiry IS NULL' : '' );
+               }
+
                if ( $this->requestedGroup != '' ) {
                        $conds['ug_group'] = $this->requestedGroup;
-                       $conds[] = 'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() );
                }
 
                if ( $this->requestedUser != '' ) {
@@ -296,6 +301,13 @@ class UsersPager extends AlphabeticPager {
                                'id' => 'editsOnly',
                                'default' => $this->editsOnly
                        ],
+                       'temporaryGroupsOnly' => [
+                               'type' => 'check',
+                               'label' => $this->msg( 'listusers-temporarygroupsonly' )->text(),
+                               'name' => 'temporaryGroupsOnly',
+                               'id' => 'temporaryGroupsOnly',
+                               'default' => $this->temporaryGroupsOnly
+                       ],
                        'creationSort' => [
                                'type' => 'check',
                                'label' => $this->msg( 'listusers-creationsort' )->text(),
index 890a870..7c2d393 100644 (file)
@@ -275,10 +275,15 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                        'user_case_dbkey' => $dbkey,
                ];
 
-               # Strip Unicode bidi override characters.
+               # Strip soft hyphens (U+00AD) and Unicode directional formatting characters (U+061C, U+200E,
+               # U+200F, U+202A. U+202B, U+202C, U+202D, U+202E, U+2066, U+2067, U+2068, U+2069).
                # Sometimes they slip into cut-n-pasted page titles, where the
-               # override chars get included in list displays.
-               $dbkey = preg_replace( '/\xE2\x80[\x8E\x8F\xAA-\xAE]/S', '', $dbkey );
+               # soft hyphens or override chars get included in list displays.
+               $dbkey = preg_replace(
+                       '/\xC2\xAD|\xD8\x9C|\xE2\x80[\x8E\x8F\xAA-\xAE]|\xE2\x81[\xA6-\xA9]/S',
+                       '',
+                       $dbkey
+               );
 
                # Clean up whitespace
                # Note: use of the /u option on preg_replace here will cause
index 9da0370..89cdc5f 100644 (file)
@@ -230,9 +230,8 @@ class UserGroupMembership {
        public function isExpired() {
                if ( !$this->expiry ) {
                        return false;
-               } else {
-                       return wfTimestampNow() > $this->expiry;
                }
+               return wfTimestampNow() > $this->expiry;
        }
 
        /**
@@ -354,9 +353,8 @@ class UserGroupMembership {
                $ugm = self::newFromRow( $row );
                if ( !$ugm->isExpired() ) {
                        return $ugm;
-               } else {
-                       return false;
                }
+               return false;
        }
 
        /**
@@ -419,9 +417,8 @@ class UserGroupMembership {
                        }
                        return $context->msg( 'group-membership-link-with-expiry' )
                                ->params( $groupLink, $expiryDT, $expiryD, $expiryT )->text();
-               } else {
-                       return $groupLink;
                }
+               return $groupLink;
        }
 
        /**
index 1c8d486..d0fe6cc 100644 (file)
@@ -67,7 +67,7 @@ class MWCryptHKDF {
         * @param string $ikm The input keying material
         * @param string $salt The salt to add to the ikm, to get the prk
         * @param string $info Optional context (change the output without affecting
-        *      the randomness properties of the output)
+        *      the randomness properties of the output)
         * @param int $L Number of bytes to return
         * @return string Cryptographically secure pseudorandom binary string
         */
index d750f7d..705c728 100644 (file)
@@ -792,11 +792,11 @@ class Language {
        /**
         * Get an array of language names, indexed by code.
         * @param null|string $inLanguage Code of language in which to return the names
-        *              Use null for autonyms (native names)
+        *              Use null for autonyms (native names)
         * @param string $include One of:
-        *              'all' all available languages
-        *              'mw' only if the language is defined in MediaWiki or wgExtraLanguageNames (default)
-        *              'mwfile' only if the language is in 'mw' *and* has a message file
+        *              'all' all available languages
+        *              'mw' only if the language is defined in MediaWiki or wgExtraLanguageNames (default)
+        *              'mwfile' only if the language is in 'mw' *and* has a message file
         * @return array Language code => language name
         * @since 1.20
         */
@@ -3485,7 +3485,7 @@ class Language {
         * @param int $length Maximum length (including ellipsis)
         * @param string $ellipsis String to append to the truncated text
         * @param bool $adjustLength Subtract length of ellipsis from $length.
-        *      $adjustLength was introduced in 1.18, before that behaved as if false.
+        *      $adjustLength was introduced in 1.18, before that behaved as if false.
         * @return string
         */
        function truncate( $string, $length, $ellipsis = '...', $adjustLength = true ) {
index f611358..d11838a 100644 (file)
@@ -967,11 +967,11 @@ class LanguageConverter {
         * Parse the conversion table stored in the cache.
         *
         * The tables should be in blocks of the following form:
-        *              -{
-        *                      word => word ;
-        *                      word => word ;
-        *                      ...
-        *              }-
+        *              -{
+        *                      word => word ;
+        *                      word => word ;
+        *                      ...
+        *              }-
         *
         * To make the tables more manageable, subpages are allowed
         * and will be parsed recursively if $recursive == true.
index 0185a03..2269009 100644 (file)
@@ -52,28 +52,28 @@ class LanguageKsh extends Language {
         * Word order is irrelevant.
         *
         * Possible values specifying the grammatical case are:
-        *      1, Nominative
-        *      2, Genitive
-        *      3, Dative
-        *      4, Accusative, -omitted-
+        *      1, Nominative
+        *      2, Genitive
+        *      3, Dative
+        *      4, Accusative, -omitted-
         *
         * Possible values specifying the article type are:
-        *      Betoont               focussed or stressed article
-        *      -omitted-             unstressed or unfocussed article
+        *      Betoont               focussed or stressed article
+        *      -omitted-             unstressed or unfocussed article
         *
         * Possible values for the type of genitive are:
-        *      Sing, Iehr            prepositioned genitive = possessive dative
-        *      Vun, Fon, -omitted-   postpositioned genitive = preposition "vun" with dative
+        *      Sing, Iehr            prepositioned genitive = possessive dative
+        *      Vun, Fon, -omitted-   postpositioned genitive = preposition "vun" with dative
         *
         * Values of case overrides & prepositions, in the order of preceedence:
-        *      Sing, Iehr            possessive dative = prepositioned genitive
-        *      Vun, Fon              preposition "vun" with dative = postpositioned genitive
-        *      En, em                preposition "en" with dative
+        *      Sing, Iehr            possessive dative = prepositioned genitive
+        *      Vun, Fon              preposition "vun" with dative = postpositioned genitive
+        *      En, em                preposition "en" with dative
         *
         * Values for object gender specifiers of the possessive dative, or
         * prepositioned genitive, evaluated with "Sing, Iehr" of above only:
-        *      Male                  a singular male object follows
-        *      -omitted-             a non-male or plural object follows
+        *      Male                  a singular male object follows
+        *      -omitted-             a non-male or plural object follows
         *
         * We currently handle definite articles of the singular only.
         * There is a full set of test cases at:
index 9943212..40c9f65 100644 (file)
@@ -271,7 +271,7 @@ class Names {
                'li' => 'Limburgs', # Limburgian
                'lij' => 'Ligure', # Ligurian
                'liv' => 'Līvõ kēļ', # Livonian
-               'lki' => 'لەکی', # Laki
+               'lki' => 'لەکی', # Laki
                'lmo' => 'lumbaart', # Lombard
                'ln' => 'lingála', # Lingala
                'lo' => 'ລາວ', # Laotian
index f3ff0f8..eb17346 100644 (file)
        "sp-contributions-submit": "Cari",
        "whatlinkshere-title": "Kintal yang ada pranala ka \"$1\"",
        "whatlinkshere-page": "Kintal",
-       "nolinkshere": "Seng ada halaman yang taika par <strong>[[:$1]]</strong>.",
+       "nolinkshere-2": "Seng ada halaman yang taika par <strong>$1</strong>.",
        "isredirect": "kintal voor pengalihan",
        "istemplate": "tranklusi",
        "whatlinkshere-prev": "{{PLURAL:$1|sabalong $1}}",
index b08ae3a..52d4caf 100644 (file)
        "whatlinkshere": "Peunawôt balék",
        "whatlinkshere-title": "Laman nyang mupawôt u $1",
        "whatlinkshere-page": "Miëng:",
-       "linkshere": "Laman-laman nyoë meupawôt u '''[[:$1]]''':",
-       "nolinkshere": "Hana halaman nyang teukaw'et u '''[[:$1]]'''.",
+       "linkshere-2": "Laman-laman nyoë meupawôt u '''$1''':",
+       "nolinkshere-2": "Hana halaman nyang teukaw'et u '''$1'''.",
        "isredirect": "laman peuninah",
        "istemplate": "ngön seunaleuëk",
        "isimage": "peunawôt beureukaih",
        "redirect-file": "Nan beureukaih",
        "fileduplicatesearch-submit": "Mita",
        "specialpages": "Miëng kusuih",
+       "specialpages-note-restricted": "* Laman kusuih biasa.\n* <span class=\"mw-specialpagerestricted\">Laman kusuih geutheun.</span>",
        "specialpages-group-maintenance": "Beuneuri thèë plara",
        "specialpages-group-other": "La'én-la'én",
        "specialpages-group-login": "Tamöng / dapeuta",
index 264a16d..0cd04d9 100644 (file)
        "whatlinkshere": "Мы нэкӀубгъом къэзыщэрэ зэпыщэхэр",
        "whatlinkshere-title": "\"$1\"-м къэзыщэрэ нэкӀубгъохэр",
        "whatlinkshere-page": "НэкӀубгъо:",
-       "linkshere": "Мы нэкӀубгъомэ зэпыщэр мыщ къащэ <strong>[[:$1]]</strong>:",
+       "linkshere-2": "Мы нэкӀубгъомэ зэпыщэр мыщ къащэ <strong>$1</strong>:",
        "isredirect": "езгъэкӀокӀырэ нэкӀубгъо",
        "istemplate": "хэлъхьаныгъэ",
        "isimage": "файл зэпыщэ",
index ece84d8..2ab8104 100644 (file)
        "sp-contributions-toponly": "أظهر أعلى المراجعات فقط",
        "whatlinkshere-title": "الصفحات التي تصل إلى \"$1\"",
        "whatlinkshere-page": "الپاج:",
-       "linkshere": "الصفحات التالية تصل إلى '''[[:$1]]''':",
-       "nolinkshere": "لا توجد صفحات تصل إلى '''[[:$1]]'''.",
+       "linkshere-2": "الصفحات التالية تصل إلى '''$1''':",
+       "nolinkshere-2": "لا توجد صفحات تصل إلى '''$1'''.",
        "isredirect": "صفحة تحويل",
        "istemplate": "مضمن",
        "isimage": "وصلة ملف",
index 43c9a62..89b4959 100644 (file)
        "whatlinkshere": "Skakels hierheen",
        "whatlinkshere-title": "Bladsye wat na \"$1\" skakel",
        "whatlinkshere-page": "Bladsy:",
-       "linkshere": "Die volgende bladsye skakel na '''[[:$1]]''':",
-       "nolinkshere": "Geen bladsye skakel na '''[[:$1]]'''.",
-       "nolinkshere-ns": "Geen bladsye skakel na '''[[:$1]]''' in die verkose naamruimte nie.",
+       "linkshere-2": "Die volgende bladsye skakel na '''$1''':",
+       "nolinkshere-2": "Geen bladsye skakel na '''$1'''.",
+       "nolinkshere-ns-2": "Geen bladsye skakel na '''$1''' in die verkose naamruimte nie.",
        "isredirect": "aanstuurblad",
        "istemplate": "insluiting",
        "isimage": "lêerskakel",
        "fileduplicatesearch-noresults": "Daar is nie 'n lêer met die naam \"$1\" nie.",
        "specialpages": "Spesiale bladsye",
        "specialpages-note-top": "Sleutel",
+       "specialpages-note-restricted": "!!FUZZY!!* Normale spesiale bladsye.\n* <span class=\"mw-specialpagerestricted\">Spesiale bladsye met beperkte toegang.</span>\n* <span class=\"mw-specialpagecached\">Spesiale bladsye met gegewens uit die kas (kan verouderd wees).</span>",
        "specialpages-group-maintenance": "Onderhoud verslae",
        "specialpages-group-other": "Ander spesiale bladsye",
        "specialpages-group-login": "Meld aan / registreer",
index e008069..57fd482 100644 (file)
        "whatlinkshere": "masasiket katukuh uyniyay a kasabelih",
        "whatlinkshere-title": "masasiket tayza \"$1\" a kasabelih",
        "whatlinkshere-page": "Kasabelih:",
-       "linkshere": "isasaay a kasabelih masasiket tazuma tu <strong>[[:$1]]</strong>:",
-       "nolinkshere": "No pages link to <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "mapili’ay a pangangananay a salaedan inayi’ kasabelih  masasiket tu [[:$1]].",
+       "linkshere-2": "isasaay a kasabelih masasiket tazuma tu <strong>$1</strong>:",
+       "nolinkshere-2": "No pages link to <strong>$1</strong>.",
+       "nolinkshere-ns-2": "mapili’ay a pangangananay a salaedan inayi’ kasabelih  masasiket tu $1.",
        "isredirect": "miliyaw patatuzu’",
        "istemplate": "palaculen tu kasabelih",
        "isimage": "tangan-tangan misiket",
index 9b570e5..4989c5d 100644 (file)
        "whatlinkshere": "Vegzat me këtu",
        "whatlinkshere-title": "Faqe që lidhen me \"$1\"",
        "whatlinkshere-page": "Faqja:",
-       "linkshere": "Faqet e mâposhtme lidhen në '''[[:$1]]''':",
+       "linkshere-2": "Faqet e mâposhtme lidhen në '''$1''':",
        "isredirect": "faqe përcjellëse",
        "istemplate": "përfshirë",
        "isimage": "vegëz në figurë",
index 65159b8..f9f475d 100644 (file)
        "whatlinkshere": "ወዲህ የሚያያዝ",
        "whatlinkshere-title": "ከ «$1» ጋር የሚያያዙ ገጾች",
        "whatlinkshere-page": "ለገጽ (አርዕስት)፦",
-       "linkshere": "የሚከተሉት ገጾች ወደ '''[[:$1]]''' ተያይዘዋል።",
-       "nolinkshere": "ወደ '''[[:$1]]''' የተያያዘ ገጽ የለም።",
-       "nolinkshere-ns": "ባመለከቱት ክፍለ-ዊኪ ወደ '''[[:$1]]''' የተያያዘ ገጽ የለም።",
+       "linkshere-2": "የሚከተሉት ገጾች ወደ '''$1''' ተያይዘዋል።",
+       "nolinkshere-2": "ወደ '''$1''' የተያያዘ ገጽ የለም።",
+       "nolinkshere-ns-2": "ባመለከቱት ክፍለ-ዊኪ ወደ '''$1''' የተያያዘ ገጽ የለም።",
        "isredirect": "መምሪያ መንገድ",
        "istemplate": "የተሰካ",
        "isimage": "የምስል ማያያዣ",
index 88ab47a..b1157f0 100644 (file)
        "whatlinkshere": "Pachinas que enlazan con ista",
        "whatlinkshere-title": "Pachinas que tienen vinclos ta $1",
        "whatlinkshere-page": "Pachina:",
-       "linkshere": "As siguients pachinas tienen vinclos enta '''[[:$1]]''':",
-       "nolinkshere": "Garra pachina tiene vinclos ta '''[[:$1]]'''.",
-       "nolinkshere-ns": "Garra pachina d'o espacio de nombres trigato tiene vinclos ta '''[[:$1]]'''.",
+       "linkshere-2": "As siguients pachinas tienen vinclos enta '''$1''':",
+       "nolinkshere-2": "Garra pachina tiene vinclos ta '''$1'''.",
+       "nolinkshere-ns-2": "Garra pachina d'o espacio de nombres trigato tiene vinclos ta '''$1'''.",
        "isredirect": "pachina reendrezata",
        "istemplate": "incluyida",
        "isimage": "Vinclo ta un fichero",
        "fileduplicatesearch-result-n": "O fichero \"$1\" tiene {{PLURAL:$2|1 duplicau identico|$2 duplicaus identicos}}.",
        "fileduplicatesearch-noresults": "No s'ha trobau garra fichero con o nombre «$1».",
        "specialpages": "Pachinas especials",
+       "specialpages-note-restricted": "!!FUZZY!!* Pachinas especials normals.\n* <strong class=\"mw-specialpagerestricted\">Pachinas especials restrinchitas.</strong>",
        "specialpages-group-maintenance": "Informes de mantenimiento",
        "specialpages-group-other": "Atras pachinas especials",
        "specialpages-group-login": "Inicio de sesión / rechistro",
index 84eaa79..e833c1b 100644 (file)
        "whatlinkshere": "Hwæt hæfþ hlencan hider",
        "whatlinkshere-title": "Trametas þā habbaþ hlencan tō \"$1\"",
        "whatlinkshere-page": "Tramet:",
-       "linkshere": "Þā folgiendan trametas habbaþ hlencan tō: '''[[:$1]]'''",
-       "nolinkshere": "Nǣnge trametas habbaþ hlencan tō '''[[:$1]]'''.",
+       "linkshere-2": "Þā folgiendan trametas habbaþ hlencan tō: '''$1'''",
+       "nolinkshere-2": "Nǣnge trametas habbaþ hlencan tō '''$1'''.",
        "isredirect": "edlǣdunge tramet",
        "istemplate": "bysene nytt",
        "isimage": "ymelan hlenca",
index 2958327..8382f17 100644 (file)
        "whatlinkshere": "एन्जां की जुड़तै",
        "whatlinkshere-title": "$1 सं॑ जुड़लऽ पन्ना",
        "whatlinkshere-page": "पन्ना:",
-       "linkshere": "नीचे के सब पन्ना '''[[:$1]]''' स॑ जुड़लऽ:",
-       "nolinkshere": "<strong>[[:$1]]</strong> स॑ कोय भी पन्ना नै जुड़लऽ छै।",
+       "linkshere-2": "नीचे के सब पन्ना '''$1''' स॑ जुड़लऽ:",
+       "nolinkshere-2": "<strong>$1</strong> स॑ कोय भी पन्ना नै जुड़लऽ छै।",
        "isredirect": "पुन: निर्दिष्ट पन्ना",
        "istemplate": "मिलाबऽ",
        "isimage": "फाइल लिंक",
index 6dc121f..d190aa5 100644 (file)
        "whatlinkshere": "ماذا يصل هنا",
        "whatlinkshere-title": "الصفحات التي تصل إلى \"$1\"",
        "whatlinkshere-page": "الصفحة:",
-       "linkshere": "الصفحات التالية تصل إلى '''[[:$1]]''':",
-       "nolinkshere": "لا توجد صفحات تصل إلى '''[[:$1]]'''.",
-       "nolinkshere-ns": "لا تصل أي صفحة إلى '''[[:$1]]''' في النطاق المختار.",
+       "linkshere-2": "الصفحات التالية تصل إلى '''$1''':",
+       "nolinkshere-2": "لا توجد صفحات تصل إلى '''$1'''.",
+       "nolinkshere-ns-2": "لا تصل أي صفحة إلى '''$1''' في النطاق المختار.",
        "isredirect": "صفحة تحويل",
        "istemplate": "مضمن",
        "isimage": "وصلة ملف",
index 1997c9a..15b1e3e 100644 (file)
        "whatlinkshere": "ܡܐ ܐܣܪ ܠܗܪܟܐ",
        "whatlinkshere-title": "ܦܐܬܬ̈ܐ ܕܐܣܝܪܝܢ ܥܡ \"$1\"",
        "whatlinkshere-page": "ܦܐܬܐ:",
-       "linkshere": "ܦܐܬܬ̈ܐ ܗܠܝܢ ܐܣܝܪܝܢ ܥܡ '''[[:$1]]''':",
-       "nolinkshere": "ܠܝܬ ܦܐܬܬ̈ܐ ܐܣܪܝܢ ܥܡ '''[[:$1]]'''.",
-       "nolinkshere-ns": "ܠܝܬ ܦܐܬܬ̈ܐ ܐܣܪܝܢ ܥܡ '''[[:$1]]''' ܒܚܩܠܐ ܓܒܝܐ.",
+       "linkshere-2": "ܦܐܬܬ̈ܐ ܗܠܝܢ ܐܣܝܪܝܢ ܥܡ '''$1''':",
+       "nolinkshere-2": "ܠܝܬ ܦܐܬܬ̈ܐ ܐܣܪܝܢ ܥܡ '''$1'''.",
+       "nolinkshere-ns-2": "ܠܝܬ ܦܐܬܬ̈ܐ ܐܣܪܝܢ ܥܡ '''$1''' ܒܚܩܠܐ ܓܒܝܐ.",
        "isredirect": "ܦܐܬܐ ܕܨܘܝܒܐ",
        "istemplate": "ܚܒܝܫܬܐ",
        "isimage": "ܐܣܘܪܐ ܕܠܦܦܐ",
        "fileduplicatesearch-submit": "ܒܨܝ",
        "fileduplicatesearch-info": "$1 × $2 ܦܩܣܠ<br /> ܥܓܪܐ ܕܠܦܦܐ: $3<br /> ܐܕܫܐ ܕ MIME: $4",
        "specialpages": "ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ",
+       "specialpages-note-restricted": "* ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ ܥܝܕ̈ܝܬܐ.\n* <span class=\"mw-specialpagerestricted\">ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ ܕܩܝܘܡ̈ܐ.</span>",
        "specialpages-group-maintenance": "ܬܫܪܪ̈ܐ ܕܚܕܬܘܬܐ",
        "specialpages-group-other": "ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ ܐܚܪ̈ܢܝܬܐ",
        "specialpages-group-login": "ܥܘܠ / ܒܪܝ ܚܘܫܒܢܐ",
index 41d8dce..1ca78c1 100644 (file)
        "whatlinkshere": "Lasulu faw püle",
        "whatlinkshere-title": "Wülngiñ nülkükawlelu \"$1\"",
        "whatlinkshere-page": "Pakina:",
-       "linkshere": "Tüfachi wülngiñ nülkükawley '''[[:$1]]''':",
-       "nolinkshere": "Chem wülngiñ no rume nülkükawlelu '''[[:$1]]'''.",
+       "linkshere-2": "Tüfachi wülngiñ nülkükawley '''$1''':",
+       "nolinkshere-2": "Chem wülngiñ no rume nülkükawlelu '''$1'''.",
        "isredirect": "wüñongünen wülngiñ",
        "istemplate": "yomtukudungu",
        "isimage": "Adentun lasun",
index df8fa58..0367678 100644 (file)
        "whatlinkshere": "شنوّ يوصّل ل هنا",
        "whatlinkshere-title": "الباجات اللي تقين في \"$1\"",
        "whatlinkshere-page": "الباجه:",
-       "linkshere": "هاذ الباجات يوصلو إلى '''[[:$1]]''':",
-       "nolinkshere": "ما كانش  باجه فيها وصيله ل'''[[:$1]]'''.",
+       "linkshere-2": "هاذ الباجات يوصلو إلى '''$1''':",
+       "nolinkshere-2": "ما كانش  باجه فيها وصيله ل'''$1'''.",
        "isredirect": "باجت تحويل",
        "istemplate": "تضمين",
        "isimage": "وصيلة ملف",
index 6e82115..4ec5193 100644 (file)
        "whatlinkshere": "Ṣefḫaṫ mlaqyin",
        "whatlinkshere-title": "Ṣ-Ṣefḫaṫ li mlaqyin mĝa \"$1\"",
        "whatlinkshere-page": "ṣfḫa:",
-       "linkshere": "Had ṣ-ṣefḫaṫ kayddiw le '''[[:$1]]''':",
-       "nolinkshere": "ḫṫa ċi ṣfḫa ma ka-twṣṣel l-'''[[:$1]]'''.",
-       "nolinkshere-ns": "ḫṫṫĝ ṣfḫa ma ka-twṣṣal l-'''[[:$1]]''' f-nnitaq lli ĥṫariṫi",
+       "linkshere-2": "Had ṣ-ṣefḫaṫ kayddiw le '''$1''':",
+       "nolinkshere-2": "ḫṫa ċi ṣfḫa ma ka-twṣṣel l-'''$1'''.",
+       "nolinkshere-ns-2": "ḫṫṫĝ ṣfḫa ma ka-twṣṣal l-'''$1''' f-nnitaq lli ĥṫariṫi",
        "isredirect": "Ṫeḫwil ṣ-ṣefḫa",
        "istemplate": "Daĥel",
        "isimage": "wṣlṫ l-milef",
index 841b6e8..08829b9 100644 (file)
        "whatlinkshere": "ايه بيوصل هنا",
        "whatlinkshere-title": "الصفحات اللى بتوصل لـ \"$1\"",
        "whatlinkshere-page": "الصفحة:",
-       "linkshere": "الصفحات دى فيها وصله ل '''[[:$1]]''':",
-       "nolinkshere": "مافيش صفحات بتوصل ل '''[[:$1]]'''.",
-       "nolinkshere-ns": "مافيش صفحات بتوصل لـ '''[[:$1]]''' فى النطاق اللى انت اختارته.",
+       "linkshere-2": "الصفحات دى فيها وصله ل '''$1''':",
+       "nolinkshere-2": "مافيش صفحات بتوصل ل '''$1'''.",
+       "nolinkshere-ns-2": "مافيش صفحات بتوصل لـ '''$1''' فى النطاق اللى انت اختارته.",
        "isredirect": "صفحة تحويل",
        "istemplate": "متضمن",
        "isimage": "وصلة ملف",
        "fileduplicatesearch-result-1": "الملف \"$1\" ما لهو ش تكرار متطابق.",
        "fileduplicatesearch-result-n": "الملف \"$1\" فيه {{PLURAL:$2|1 تكرار متطابق|$2 تكرار متطابق}}.",
        "specialpages": "صفح مخصوصه",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* صفحات خاصة عادية.\n* <strong class=\"mw-specialpagerestricted\">صفحات خاصة للناس اللى مسموح لهم.</strong>",
        "specialpages-group-maintenance": "تقارير الصيانة",
        "specialpages-group-other": "صفحات خاصه تا نيه",
        "specialpages-group-login": "ادخل / سجل",
index e118a0c..3223f06 100644 (file)
        "whatlinkshere": "ইয়ালৈ থকা সংযোগসমূহ",
        "whatlinkshere-title": "\"$1\"লৈ সংযোজিত পৃষ্ঠাসমূহ",
        "whatlinkshere-page": "পৃষ্ঠা:",
-       "linkshere": "এই পৃষ্ঠাটো '''[[:$1]]''' ৰ লগত সংযোজিত:",
-       "nolinkshere": "'''[[:$1]]''' ৰ লগত কোনো পৃষ্ঠা সংযোজিত নহয়।",
-       "nolinkshere-ns": "নিৰ্বাচিত নামস্থানৰ কোনো পৃষ্ঠাৰ পৰা [[:$1]]লৈ সংযোগ নাই ।",
+       "linkshere-2": "এই পৃষ্ঠাটো '''$1''' ৰ লগত সংযোজিত:",
+       "nolinkshere-2": "'''$1''' ৰ লগত কোনো পৃষ্ঠা সংযোজিত নহয়।",
+       "nolinkshere-ns-2": "নিৰ্বাচিত নামস্থানৰ কোনো পৃষ্ঠাৰ পৰা $1লৈ সংযোগ নাই ।",
        "isredirect": "পুনঃনিৰ্দেশনা পৃষ্ঠা",
        "istemplate": "অন্তৰ্ভুক্ত কৰক",
        "isimage": "নথিৰ সংযোগ",
        "fileduplicatesearch-noresults": "কোনো \"$1\" নামৰ নথিৰ সন্ধান পোৱা নগ’ল ।",
        "specialpages": "বিশেষ পৃষ্ঠাসমূহ",
        "specialpages-note-top": "ব্যাখ্যা",
+       "specialpages-note-restricted": "* সাধাৰণ বিশেষ পৃষ্ঠাসমূহ।\n* <span class=\"mw-specialpagerestricted\">সীমাবদ্ধ বিশেষ পৃষ্ঠাসমূহ।</span>",
        "specialpages-group-maintenance": "তত্বাৱধানৰ কাৰ্যবিৱৰণীসমূহ",
        "specialpages-group-other": "অন্যান্য বিশেষ পৃষ্ঠাসমূহ",
        "specialpages-group-login": "প্ৰৱেশ/একাউণ্ট সৃষ্টি কৰক",
index 911a627..1a15227 100644 (file)
        "apisandbox-dynamic-parameters-add-label": "Amestar parámetru:",
        "apisandbox-dynamic-parameters-add-placeholder": "Nome del parámetru",
        "apisandbox-dynamic-error-exists": "Yá existe un parámetru llamáu «$1».",
+       "apisandbox-templated-parameter-reason": "Esti [[Special:ApiHelp/main#main/templatedparams|parámetru dende plantía]] úfrese basándose {{PLURAL:$1|nel valor|nos valores}} de $2.",
        "apisandbox-deprecated-parameters": "Parámetros anticuaos",
        "apisandbox-fetch-token": "Rellenu automáticu del pase",
        "apisandbox-add-multi": "Amestar",
        "whatlinkshere": "Lo qu'enllaza equí",
        "whatlinkshere-title": "Páxines qu’enllacien a «$1»",
        "whatlinkshere-page": "Páxina:",
-       "linkshere": "Les páxines siguientes enllacien a '''[[:$1]]''':",
-       "nolinkshere": "Nenguna páxina enllaza a '''[[:$1]]'''.",
-       "nolinkshere-ns": "Nenguna páxina enllaza con <strong>[[:$1]]</strong> nel espaciu de nomes escoyíu.",
+       "linkshere-2": "Les páxines siguientes enllacien a '''$1''':",
+       "nolinkshere-2": "Nenguna páxina enllaza a '''$1'''.",
+       "nolinkshere-ns-2": "Nenguna páxina enllaza con <strong>$1</strong> nel espaciu de nomes escoyíu.",
        "isredirect": "páxina de redireición",
        "istemplate": "tresclusión",
        "isimage": "enllaz al ficheru",
index 578221c..185574b 100644 (file)
        "whatlinkshere": "Kaskina ickwemakina ka witci acteki",
        "whatlinkshere-title": "Masinahikan nte mia ka ici tapitik \"$1\"",
        "whatlinkshere-page": "Masinahikan:",
-       "linkshere": "Masinhikan ka ici tapitik <strong>[[:$1]]</strong>:",
+       "linkshere-2": "Masinhikan ka ici tapitik <strong>$1</strong>:",
        "isredirect": "masinhikan ke kweskiticohemikok",
        "istemplate": "ka ki acotcipitcikatek",
        "isimage": "e ici tapitik masinahikaniwoc",
index 39b2b30..92939aa 100644 (file)
        "whatlinkshere": "Gluyarakiraf bueem",
        "whatlinkshere-title": "Bu gluyasu va \"$1\"",
        "whatlinkshere-page": "Bu :",
-       "linkshere": "Van batu bu vlevef bueem va gluyasiki ruldar : '''[[:$1]]'''",
-       "nolinkshere": "Van batu bu nedoyu bu va gluyasiki ruldar : '''[[:$1]]'''",
-       "nolinkshere-ns": "Koe kiblayano yoltxo meku bu gluyasikikirafu gu '''[[:$1]]'''.",
+       "linkshere-2": "Van batu bu vlevef bueem va gluyasiki ruldar : '''$1'''",
+       "nolinkshere-2": "Van batu bu nedoyu bu va gluyasiki ruldar : '''$1'''",
+       "nolinkshere-ns-2": "Koe kiblayano yoltxo meku bu gluyasikikirafu gu '''$1'''.",
        "isredirect": "graskarabu",
        "istemplate": "kodoplekura",
        "isimage": "skedasiki va ewava",
index ddcfbc4..db933ef 100644 (file)
        "whatlinkshere": "हिँया का जोडान अहै",
        "whatlinkshere-title": "$1 से जोडान पन्ना",
        "whatlinkshere-page": "पन्ना:",
-       "linkshere": "नीचे दिहा पन्ना '''[[:$1]]''' से जोडान है:",
-       "nolinkshere": "'''[[:$1]]''' से कुछ नाइ जोडान् है।",
-       "nolinkshere-ns": "चुनल नामस्थानसे '''[[:$1]]''' से कवनो पन्ना नाइ जोडान् है।",
+       "linkshere-2": "नीचे दिहा पन्ना '''$1''' से जोडान है:",
+       "nolinkshere-2": "'''$1''' से कुछ नाइ जोडान् है।",
+       "nolinkshere-ns-2": "चुनल नामस्थानसे '''$1''' से कवनो पन्ना नाइ जोडान् है।",
        "isredirect": "पुनर्निर्देशन पन्ना",
        "istemplate": "मिलावा जाय",
        "isimage": "फ़ाइल कय कड़ी",
        "fileduplicatesearch-noresults": "कवनो \"$1\" फाइल नाइ मिला।",
        "specialpages": "खाश पन्ना",
        "specialpages-note-top": "कुंजी",
+       "specialpages-note-restricted": "* साधारण विशेष पन्ना।\n* <span class=\"mw-specialpagerestricted\">प्रतिबंधित विशेष पन्ना।</span>",
        "specialpages-group-maintenance": "अनुरक्षण रिपोर्ट",
        "specialpages-group-other": "अउर खाश पन्ना",
        "specialpages-group-login": "लाग इन / खाता खोला जाय",
index 1b15090..c7afe94 100644 (file)
        "whatlinkshere": "Bu səhifəyə bağlantılar",
        "whatlinkshere-title": "\"$1\" məqaləsinə keçid verən səhifələr",
        "whatlinkshere-page": "Səhifə:",
-       "linkshere": "'''[[:$1]]''' səhifəsinə keçid verən səhifələr:",
-       "nolinkshere": "<strong>[[:$1]]</strong> səhifəsinə keçid verən səhifə yoxdur.",
-       "nolinkshere-ns": "Seçilmiş ad aralığında heç bir səhifə '''[[:$1]]''' səhifəsinə keçid vermir.",
+       "linkshere-2": "'''$1''' səhifəsinə keçid verən səhifələr:",
+       "nolinkshere-2": "<strong>$1</strong> səhifəsinə keçid verən səhifə yoxdur.",
+       "nolinkshere-ns-2": "Seçilmiş ad aralığında heç bir səhifə '''$1''' səhifəsinə keçid vermir.",
        "isredirect": "İstiqamətləndirmə səhifəsi",
        "istemplate": "daxil olmuş",
        "isimage": "şəkil üçün keçid",
index d6fb716..4ec9935 100644 (file)
        "whatlinkshere": "بۇ صفحه‌‌يه باغلانتیلار",
        "whatlinkshere-title": "«$1»-ه باغلانان صفحه‌لر",
        "whatlinkshere-page": "صفحه:",
-       "linkshere": "آشاغیداکی صفحه‌لر '''[[:$1]]'''-ه باغلانیب:",
-       "nolinkshere": "<strong>[[:$1]]</strong>-ه هئچ بیر صفحه باغلانماییب‌دیر.",
-       "nolinkshere-ns": "سئچیلمیش آدفضاسیندا، هئچ صحیفه '''[[:$1]]'''-ه باغلانتی‌سی یوخدور.",
+       "linkshere-2": "آشاغیداکی صفحه‌لر '''$1'''-ه باغلانیب:",
+       "nolinkshere-2": "<strong>$1</strong>-ه هئچ بیر صفحه باغلانماییب‌دیر.",
+       "nolinkshere-ns-2": "سئچیلمیش آدفضاسیندا، هئچ صحیفه '''$1'''-ه باغلانتی‌سی یوخدور.",
        "isredirect": "یوللاندیرما صفحه‌سی",
        "istemplate": "داخیل اولموش",
        "isimage": "فایلا باغلانتی",
        "fileduplicatesearch-result-n": "«$1» فایلینین، {{PLURAL:$2|بیر|$2}} عینی کوپیسی واردیر.",
        "fileduplicatesearch-noresults": "\"$1\" آدیندا فایل تاپیلمادی.",
        "specialpages": "اؤزل صفحه‌لر",
+       "specialpages-note-restricted": "* نورمال اؤزل صفحه‌لر.\n* <span class=\"mw-specialpagerestricted\">محدودلاشدیریلمیش اؤزل صفحه‌لر.</span>",
        "specialpages-group-maintenance": "ساخلانیش گوزاریشلری",
        "specialpages-group-other": "آیری اؤزل صفحه‌لر",
        "specialpages-group-login": "گیریش / حساب یارات",
index 00540ea..033c601 100644 (file)
        "whatlinkshere": "Бында һылтанмалар",
        "whatlinkshere-title": "«$1» битенә һылтанған биттәр",
        "whatlinkshere-page": "Бит:",
-       "linkshere": "'''[[:$1]]''' битенә киләһе биттәр һылтана:",
-       "nolinkshere": "'''[[:$1]]''' битенә бер бит тә һылтанмай.",
-       "nolinkshere-ns": "'''[[:$1]]''' битенә һайланған исемдәр арауығынан бер бит тә һылтанмай.",
+       "linkshere-2": "'''$1''' битенә киләһе биттәр һылтана:",
+       "nolinkshere-2": "'''$1''' битенә бер бит тә һылтанмай.",
+       "nolinkshere-ns-2": "'''$1''' битенә һайланған исемдәр арауығынан бер бит тә һылтанмай.",
        "isredirect": "йүнәлтеү бите",
        "istemplate": "ҡушылған",
        "isimage": "файл һылтанмаһы",
index 143531c..4378f7f 100644 (file)
        "whatlinkshere": "Links af de Seitn",
        "whatlinkshere-title": "Seitn, wo af „$1“ valinka",
        "whatlinkshere-page": "Seitn:",
-       "linkshere": "De foigandn Seitn valinka af '''„[[:$1]]“''':",
-       "nolinkshere": "Koa Seitn valinkt af '''„[[:$1]]“'''.",
+       "linkshere-2": "De foigandn Seitn valinka af '''„$1“''':",
+       "nolinkshere-2": "Koa Seitn valinkt af '''„$1“'''.",
        "isredirect": "Weidaloatungsseitn",
        "istemplate": "Vorlogneinbindung",
        "isimage": "Dateilink",
        "fileduplicatesearch-info": "$1 × $2 Pixel<br />Daateigress: $3<br />MIME-Typ: $4",
        "fileduplicatesearch-result-1": "Dé Daatei „$1“ hod koane identischen Duplikaate.",
        "specialpages": "Spezialseitn",
+       "specialpages-note-restricted": "!!FUZZY!!* Reguläre Speziaalseiten\n* <span class=\"mw-specialpagerestricted\">Zuagrifsbschränkde Speziaalseiten</span>\n* <span class=\"mw-specialpagecached\">Cachegenerrirde Speziaalseiten (Da Inhoid is méglicherweis vaoiterd)</span>",
        "specialpages-group-maintenance": "Wartungslisten",
        "specialpages-group-other": "Åndre Speziaalseiten",
        "specialpages-group-login": "Åmöden",
index e1037ac..953f43e 100644 (file)
        "whatlinkshere": "ای لینکی که ادا هست",
        "whatlinkshere-title": "صفحاتی که لینگ بوتگنت په \"$1\"",
        "whatlinkshere-page": "صفحه:",
-       "linkshere": "جهلیگی صفحات لینک بوت '''[[:$1]]''':",
-       "nolinkshere": "هچ لینک صفحه ای په '''[[:$1]]'''.",
-       "nolinkshere-ns": "هج صفحه ای لینک نهنت په '''[[:$1]]''' ته ای انتخابی نام فضا",
+       "linkshere-2": "جهلیگی صفحات لینک بوت '''$1''':",
+       "nolinkshere-2": "هچ لینک صفحه ای په '''$1'''.",
+       "nolinkshere-ns-2": "هج صفحه ای لینک نهنت په '''$1''' ته ای انتخابی نام فضا",
        "isredirect": "صفحه غیر مستقیم",
        "istemplate": "همراهی",
        "isimage": "لینک عکس",
        "fileduplicatesearch-result-1": " \"$1\" فایل هچ مشحصین دوبلی نیست.",
        "fileduplicatesearch-result-n": "فایل \"$1\" has {{PLURAL:$2|1 identical duplication|$2 مشخصین کپی بوتن}}.",
        "specialpages": "حاصین صفحات",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* نرمال صفحات حاص.\n*  <strong class=\"mw-specialpagerestricted\">محدودین صفحات حاص.</strong>",
        "specialpages-group-maintenance": "گزارشات دارگ",
        "specialpages-group-other": "دگر حاصین صفحات",
        "specialpages-group-login": "ورود/ثبت نام",
index 427ccdb..a839c35 100644 (file)
        "whatlinkshere": "Ano an mga makasugpon digde",
        "whatlinkshere-title": "Mga pahina na nakasugpon sa \"$1\"",
        "whatlinkshere-page": "Pahina:",
-       "linkshere": "An mga minasunod na pahina isinusugpon sa '''[[:$1]]''':",
-       "nolinkshere": "Mayong mga pahinang kasugpon sa '''[[:$1]]'''.",
-       "nolinkshere-ns": "Mayong pahina na nakatakod sa '''[[:$1]]''' sa piniling ngaran-espacio.",
+       "linkshere-2": "An mga minasunod na pahina isinusugpon sa '''$1''':",
+       "nolinkshere-2": "Mayong mga pahinang kasugpon sa '''$1'''.",
+       "nolinkshere-ns-2": "Mayong pahina na nakatakod sa '''$1''' sa piniling ngaran-espacio.",
        "isredirect": "palikwaton an pahina",
        "istemplate": "pinagkabalihan",
        "isimage": "kasugpon nin sagunson",
        "fileduplicatesearch-noresults": "Mayong sagunson na pinagngaranan na \"$1\" an nanagboan.",
        "specialpages": "Mga espesyal na pahina",
        "specialpages-note-top": "Balaynan",
+       "specialpages-note-restricted": "* Normal sa espesyal na mga pahina.\n* <span class=\"mw-specialpagerestricted\"> Restriktadong espesyal na mga pahina.</span>",
        "specialpages-group-maintenance": "Mga talaan nin pagpangataman",
        "specialpages-group-other": "Iba pang mga espesyal na pahina",
        "specialpages-group-login": "Maglaog / magmukna nin panindog",
index d6730e8..37f2117 100644 (file)
        "protectedtitles-submit": "Паказаць загалоўкі",
        "listusers": "Сьпіс удзельнікаў і ўдзельніц",
        "listusers-editsonly": "Паказаць толькі ўдзельнікаў, якія маюць рэдагаваньні",
+       "listusers-temporarygroupsonly": "Паказваць толькі ўдзельнікаў у часовых групах удзельнікаў",
        "listusers-creationsort": "Адсартаваць па даце стварэньня",
        "listusers-desc": "Сартаваць па зьмяншэньні",
        "usereditcount": "$1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}",
        "whatlinkshere": "Спасылкі на старонку",
        "whatlinkshere-title": "Старонкі, якія спасылаюцца на $1",
        "whatlinkshere-page": "Старонка:",
-       "linkshere": "Наступныя старонкі спасылаюцца на <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Ніводная старонка не спасылаецца на <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "Ніводная старонка не спасылаецца на '''[[:$1]]''' з выбранай прасторы назваў.",
+       "linkshere-2": "Наступныя старонкі спасылаюцца на <strong>$1</strong>:",
+       "nolinkshere-2": "Ніводная старонка не спасылаецца на <strong>$1</strong>.",
+       "nolinkshere-ns-2": "Ніводная старонка не спасылаецца на '''$1''' з выбранай прасторы назваў.",
        "isredirect": "старонка-перанакіраваньне",
        "istemplate": "уключэньне",
        "isimage": "спасылка на файл",
index c7d9bf6..71c2d94 100644 (file)
        "whatlinkshere": "Сюды спасылаюцца",
        "whatlinkshere-title": "Старонкі, якія спасылаюцца на \"$1\"",
        "whatlinkshere-page": "Старонка:",
-       "linkshere": "Наступныя старонкі спасылаюцца на <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Няма старонак, якія б спасылаліся на '''[[:$1]]'''.",
-       "nolinkshere-ns": "Няма старонак, якія б спасылаліся на '''[[:$1]]''' у гэтай прасторы назваў.",
+       "linkshere-2": "Наступныя старонкі спасылаюцца на <strong>$1</strong>:",
+       "nolinkshere-2": "Няма старонак, якія б спасылаліся на '''$1'''.",
+       "nolinkshere-ns-2": "Няма старонак, якія б спасылаліся на '''$1''' у гэтай прасторы назваў.",
        "isredirect": "старонка-перасылка",
        "istemplate": "уключэнне",
        "isimage": "Спасылка на выяву",
        "fileduplicatesearch-noresults": "Не знойдзены файл з іменем «$1».",
        "specialpages": "Адмысловыя старонкі",
        "specialpages-note-top": "Легенда",
+       "specialpages-note-restricted": "* Звычайныя адмысловыя старонкі.\n* <span class=\"mw-specialpagerestricted\">Адмысловыя старонкі з абмежаваным доступам.</span>\n* <span class=\"mw-specialpagecached\">Закэшаваныя адмысловыя старонкі (могуць быць састарэлымі).</span>",
        "specialpages-group-maintenance": "Звесткі аб працы",
        "specialpages-group-other": "Іншыя адмысловыя старонкі",
        "specialpages-group-login": "Прадстаўленне / рэгістрацыя",
index 4fc42bc..40b3be4 100644 (file)
        "whatlinkshere": "Какво сочи насам",
        "whatlinkshere-title": "Страници, които сочат към „$1“",
        "whatlinkshere-page": "Страница:",
-       "linkshere": "Следните страници сочат към <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Няма страници, сочещи към <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "Няма страници, сочещи към [[:$1]] в избраното именно пространство.",
+       "linkshere-2": "Следните страници сочат към <strong>$1</strong>:",
+       "nolinkshere-2": "Няма страници, сочещи към <strong>$1</strong>.",
+       "nolinkshere-ns-2": "Няма страници, сочещи към $1 в избраното именно пространство.",
        "isredirect": "пренасочваща страница",
        "istemplate": "включване",
        "isimage": "препратка към файла",
index 6c17aac..bbf7078 100644 (file)
        "whatlinkshere": "لینک په ای تاکدیما",
        "whatlinkshere-title": "تاکدیمان که گو  «$1» لینک دارنت",
        "whatlinkshere-page": "تاکدیم:",
-       "linkshere": "جهلگین دیم بئ  '''[[:$1]]''' ئا لینک داریت:",
-       "nolinkshere": "هیچ دیمی بئ  '''[[:$1]]''' ئا لینک نه داریت.",
-       "nolinkshere-ns": "هیچ دیمی شه انتخاب بوته ئین نامی فضائان بئ  '''[[:$1]]''' ئا لینک نداریت.",
+       "linkshere-2": "جهلگین دیم بئ  '''$1''' ئا لینک داریت:",
+       "nolinkshere-2": "هیچ دیمی بئ  '''$1''' ئا لینک نه داریت.",
+       "nolinkshere-ns-2": "هیچ دیمی شه انتخاب بوته ئین نامی فضائان بئ  '''$1''' ئا لینک نداریت.",
        "isredirect": "تاکدیمی تغییرمسیر داتین",
        "istemplate": "تراگنجانش‌هان",
        "isimage": "فایل لینک",
        "fileduplicatesearch-noresults": "فایلئ گو «$1» ئی ناما ودئ نه بوت.",
        "specialpages": "خاصین تاکدیمان",
        "specialpages-note-top": "شرح علائم",
+       "specialpages-note-restricted": "* عادی ئین خاصین تاکدیمان.\n* <span class=\"mw-specialpagerestricted\">خاصین تاکدیمان محدود بوته انت.</span>",
        "specialpages-group-maintenance": "ساتیتینئ راپور",
        "specialpages-group-other": "دیگه خاصین تاکدیمان",
        "specialpages-group-login": "داخل بوتین  / حسابي جوڑ کورتین",
index 5f90062..0468272 100644 (file)
        "whatlinkshere": "इहाँ का जुड़ल बा",
        "whatlinkshere-title": "पन्ना जेवन \"$1\" से जुड़ल बा",
        "whatlinkshere-page": "पन्ना:",
-       "linkshere": "<strong>[[:$1]]</strong> से नीचे दिहल पन्ना जुड़ल बाने:",
-       "nolinkshere": "'''[[:$1]]''' से कौनो पन्ना नइखे जुड़ल।",
-       "nolinkshere-ns": "चुनल गईल सन्दर्भ में '''[[:$1]]''' से कौनो पन्ना ना जुड़ेला।",
+       "linkshere-2": "<strong>$1</strong> से नीचे दिहल पन्ना जुड़ल बाने:",
+       "nolinkshere-2": "'''$1''' से कौनो पन्ना नइखे जुड़ल।",
+       "nolinkshere-ns-2": "चुनल गईल सन्दर्भ में '''$1''' से कौनो पन्ना ना जुड़ेला।",
        "isredirect": "अनुप्रेषित पन्ना",
        "istemplate": "ट्रांस्क्लूजन",
        "isimage": "फाइल कड़ी",
index 2615119..4a22b36 100644 (file)
        "whatlinkshere": "Tautan apa di sia",
        "whatlinkshere-title": "Tungkaran-tungkaran nang batautan ka ''$1''",
        "whatlinkshere-page": "Tungkaran:",
-       "linkshere": "Tungkaran-tungkaran barikut batautan ka '''[[:$1]]''':",
-       "nolinkshere": "Kadada tutungkaran tataut ka '''[[:$1]]'''.",
-       "nolinkshere-ns": "Kadada tutungkaran tataut ka '''[[:$1]]''' dalam ruang-ngaran nang dipilih.",
+       "linkshere-2": "Tungkaran-tungkaran barikut batautan ka '''$1''':",
+       "nolinkshere-2": "Kadada tutungkaran tataut ka '''$1'''.",
+       "nolinkshere-ns-2": "Kadada tutungkaran tataut ka '''$1''' dalam ruang-ngaran nang dipilih.",
        "isredirect": "tungkaran paugahan",
        "istemplate": "transklusi",
        "isimage": "tautan barakas",
        "fileduplicatesearch-result-n": "Barakas ''$1'' baisi {{PLURAL:$2|1 panggandaan parsis|$2 papanggandaan parsis}}.",
        "fileduplicatesearch-noresults": "Kadada barakas bangaran ''$1'' taugai.",
        "specialpages": "Tungkaran istimiwa",
+       "specialpages-note-restricted": "!!FUZZY!!* Tutungkaran istimiwa normal\n* <span class=\"mw-specialpagerestricted\">Tutungkaran istimiwa tabatas.</span>\n* <span class=\"mw-specialpagecached\">Tutungkaran istimiwa timbuluk (pinanya bakulat).</span>",
        "specialpages-group-maintenance": "Lapuran pamaliharaan",
        "specialpages-group-other": "Tungkaran istimiwa lainnya",
        "specialpages-group-login": "Babuat log / mandaptar",
index ccb1fb2..5f2c954 100644 (file)
        "whatlinkshere": "সংযোগকারী পাতাসমূহ",
        "whatlinkshere-title": "যে পাতাগুলি থেকে \"$1\"-এর প্রতি সংযোগ আছে",
        "whatlinkshere-page": "পাতা:",
-       "linkshere": "নিচের পাতাসমূহ '''[[:$1]]''' পাতায় সংযুক্ত আছে:",
-       "nolinkshere": "কোনো পাতা থেকে '''[[:$1]]''' পাতায় সংযোগ নেই।",
-       "nolinkshere-ns": "নির্বাচিত নামস্থানে '''[[:$1]]'''-এর প্রতি কোন পাতা থেকে সংযোগ নেই।",
+       "linkshere-2": "নিচের পাতাসমূহ '''$1''' পাতায় সংযুক্ত আছে:",
+       "nolinkshere-2": "কোনো পাতা থেকে '''$1''' পাতায় সংযোগ নেই।",
+       "nolinkshere-ns-2": "নির্বাচিত নামস্থানে '''$1'''-এর প্রতি কোন পাতা থেকে সংযোগ নেই।",
        "isredirect": "পুনর্নির্দেশ",
        "istemplate": "অন্তর্ভুক্তি",
        "isimage": "ফাইল সংযোগ",
index 33a3f39..97cbed7 100644 (file)
        "whatlinkshere": "གང་དང་སྦྲེལ་བ།",
        "whatlinkshere-title": "\"$1\" ལ སྦྲེལ་ཡོད་པའི་ཤོག་ངོས།",
        "whatlinkshere-page": "ཤོག་ངོས།",
-       "linkshere": "གཤམ་གྱི་ཤོག་ངོས་རྣམས་ '''[[:$1]]''': ལ་སྦྲེལ་ཡོད།",
-       "nolinkshere": "<strong>[[:$1]]</strong> ཤོག་ངོས་གཅིག་ཀྱང་སྦྲེལ་མཐུད་མི་འདུག།",
+       "linkshere-2": "གཤམ་གྱི་ཤོག་ངོས་རྣམས་ '''$1''': ལ་སྦྲེལ་ཡོད།",
+       "nolinkshere-2": "<strong>$1</strong> ཤོག་ངོས་གཅིག་ཀྱང་སྦྲེལ་མཐུད་མི་འདུག།",
        "isimage": "ཡིག་རིས་སྦྲེལ་མཐུད།",
        "whatlinkshere-links": "← སྦྲེལ་མཐུད།",
        "whatlinkshere-hideredirs": "$1 ཁ་ཕྱོགས་བསྐྱར་སྟོན།",
index 476c3a2..f048f56 100644 (file)
        "whatlinkshere": "যে পাতাহানিত্ত এহানাত মিলাপ আসে",
        "whatlinkshere-title": "পাতাহানি $1 -ত মিলাপ আসে",
        "whatlinkshere-page": "পাতা:",
-       "linkshere": "থাঙনার পাতাহানি '''[[:$1]]'''র লগে মিলাপ আসে:",
-       "nolinkshere": "পাতা '''[[:$1]]'''হানাত কোন মিলাপ নেই।",
+       "linkshere-2": "থাঙনার পাতাহানি '''$1'''র লগে মিলাপ আসে:",
+       "nolinkshere-2": "পাতা '''$1'''হানাত কোন মিলাপ নেই।",
        "isredirect": "বুলনদের পাতা",
        "istemplate": "বরানি",
        "isimage": "ফাইল মিলাপ",
index 9fcfa2f..c59dffa 100644 (file)
        "whatlinkshere": "لینک های ای صفحه",
        "whatlinkshere-title": "صفحات آن لینک به \"$1\"",
        "whatlinkshere-page": "بألگە",
-       "linkshere": "لینک صفحات ذیل الذکر به '''[[:$1]]''':",
-       "nolinkshere": "هیچ صفحه ای پیوند نداردبه '''[[:$1]]'''.",
+       "linkshere-2": "لینک صفحات ذیل الذکر به '''$1''':",
+       "nolinkshere-2": "هیچ صفحه ای پیوند نداردبه '''$1'''.",
        "isredirect": "صفحه تغییر مسیر",
        "istemplate": "استفاده‌ وابیده داخل صفحه",
        "isimage": "جانیا هوم پیوند",
index a935884..48547d4 100644 (file)
        "whatlinkshere": "Pajennoù liammet",
        "whatlinkshere-title": "Pajennoù liammet ouzh \"$1\"",
        "whatlinkshere-page": "Pajenn :",
-       "linkshere": "Ar pajennoù a-is zo enno ul liamm a gas war-du '''[[:$1]]''':",
-       "nolinkshere": "N'eus pajenn ebet enni ul liamm war-du '''[[:$1]]'''.",
-       "nolinkshere-ns": "Pajenn ebet n'eo liammet ouzh '''[[:$1]]''' en esaouenn anv dibabet.",
+       "linkshere-2": "Ar pajennoù a-is zo enno ul liamm a gas war-du '''$1''':",
+       "nolinkshere-2": "N'eus pajenn ebet enni ul liamm war-du '''$1'''.",
+       "nolinkshere-ns-2": "Pajenn ebet n'eo liammet ouzh '''$1''' en esaouenn anv dibabet.",
        "isredirect": "pajenn adkas",
        "istemplate": "enframmet",
        "isimage": "Liamm war-zu ar restr",
        "fileduplicatesearch-noresults": "N'eus bet kavet restr ebet anvet \"$1\".",
        "specialpages": "Pajennoù dibar",
        "specialpages-note-top": "Alc'hwez",
+       "specialpages-note-restricted": "* Pajennoù dibar ordinal.\n* <span class=\"mw-specialpagerestricted\">Pajennoù dibar miret strizh.</span>",
        "specialpages-group-maintenance": "Rentaoù-kont trezalc'h",
        "specialpages-group-other": "Pajennoù dibar all",
        "specialpages-group-login": "Kevreañ / krouiñ ur gont",
index 125e3cb..f97f35a 100644 (file)
        "whatlinkshere": "Šta vodi ovamo",
        "whatlinkshere-title": "Stranice koje vode na \"$1\"",
        "whatlinkshere-page": "Stranica:",
-       "linkshere": "Sljedeće stranice vode na <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Nijedna stranica nije povezana sa <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "Nijedna stranica nije povezana sa <strong>[[:$1]]</strong> u izabranom imenskom prostoru.",
+       "linkshere-2": "Sljedeće stranice vode na <strong>$1</strong>:",
+       "nolinkshere-2": "Nijedna stranica nije povezana sa <strong>$1</strong>.",
+       "nolinkshere-ns-2": "Nijedna stranica nije povezana sa <strong>$1</strong> u izabranom imenskom prostoru.",
        "isredirect": "preusmjerenje",
        "istemplate": "uključivanje",
        "isimage": "veza na datoteku",
        "fileduplicatesearch-noresults": "Nije pronađena datoteka s imenom \"$1\".",
        "specialpages": "Posebne stranice",
        "specialpages-note-top": "Legenda",
+       "specialpages-note-restricted": "* Normalne posebne stranice.\n* <strong class=\"mw-specialpagerestricted\">Zaštićene posebne stranice.</strong>",
        "specialpages-group-maintenance": "Izvještaji za održavanje",
        "specialpages-group-other": "Ostale posebne stranice",
        "specialpages-group-login": "Prijava / otvaranje računa",
index a8a60d5..fb10a20 100644 (file)
@@ -58,7 +58,8 @@
                        "Syum90",
                        "Xð",
                        "Abella",
-                       "Pierpao"
+                       "Pierpao",
+                       "Amire80"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "prefs-watchlist-edits": "Nombre màxim de modificacions a mostrar en la llista de seguiment:",
        "prefs-watchlist-edits-max": "Nombre màxim: 1000",
        "prefs-watchlist-token": "Testimoni de llista de seguiment:",
+       "prefs-watchlist-managetokens": "Dirigeix testimonis",
        "prefs-misc": "Altres preferències",
        "prefs-resetpass": "Canvia la contrasenya",
        "prefs-changeemail": "Canvia o elimina l’adreça electrònica",
        "whatlinkshere": "Què hi enllaça",
        "whatlinkshere-title": "Pàgines que enllacen amb «$1»",
        "whatlinkshere-page": "Pàgina:",
-       "linkshere": "Les següents pàgines enllacen amb '''[[:$1]]''':",
-       "nolinkshere": "Cap pàgina no enllaça amb '''[[:$1]]'''.",
-       "nolinkshere-ns": "No s'enllaça cap pàgina a '''[[:$1]]''' en l'espai de noms triat.",
+       "linkshere-2": "Les següents pàgines enllacen amb '''$1''':",
+       "nolinkshere-2": "Cap pàgina no enllaça amb '''$1'''.",
+       "nolinkshere-ns-2": "No s'enllaça cap pàgina a '''$1''' en l'espai de noms triat.",
        "isredirect": "pàgina redirigida",
        "istemplate": "inclusió",
        "isimage": "enllaç a fitxer",
index c14d9f5..68ae1a1 100644 (file)
        "whatlinkshere": "Diē-nē̤ lièng gáu cē̤-nē̤",
        "whatlinkshere-title": "鏈接遘$1其頁面",
        "whatlinkshere-page": "頁面:",
-       "linkshere": "下底其頁面鏈接遘'''[[:$1]]''':",
-       "nolinkshere": "無頁鏈接遘'''[[:$1]]'''。",
+       "linkshere-2": "下底其頁面鏈接遘'''$1''':",
+       "nolinkshere-2": "無頁鏈接遘'''$1'''。",
        "isredirect": "重定向頁面",
        "isimage": "文件鏈接",
        "whatlinkshere-prev": "{{PLURAL:$1|前|前$1}}",
index 3de2d00..0a9db04 100644 (file)
        "whatlinkshere": "Кхуза хьажоргаш",
        "whatlinkshere-title": "«$1» тӀе хьажоргаш йолу агӀонаш",
        "whatlinkshere-page": "АгӀо:",
-       "linkshere": "ТӀаьхьайогӀу агӀонаш оцу '''[[:$1]]''': хьажоргца ю",
-       "nolinkshere": "ХӀокху '''[[:$1]]''' агӀона тӀе кхечу агӀонашкахь хьажоргаш яц.",
-       "nolinkshere-ns": "Хаьржинчу меттигехь яц '''[[:$1]]''' цӀе йолу агӀонаш",
+       "linkshere-2": "ТӀаьхьайогӀу агӀонаш оцу '''$1''': хьажоргца ю",
+       "nolinkshere-2": "ХӀокху '''$1''' агӀона тӀе кхечу агӀонашкахь хьажоргаш яц.",
+       "nolinkshere-ns-2": "Хаьржинчу меттигехь яц '''$1''' цӀе йолу агӀонаш",
        "isredirect": "агӀо-дӀасахьажорг",
        "istemplate": "юкъаялийнарш",
        "isimage": "Файлан хьажорг",
index 519f21e..415ae14 100644 (file)
        "whatlinkshere": "Unsay mga misumpay dinhi",
        "whatlinkshere-title": "Mga panid nga misumpay ngadto sa \"$1\"",
        "whatlinkshere-page": "Panid:",
-       "linkshere": "Ang mosunod nga mga panid misumpay sa '''[[:$1]]''':",
+       "linkshere-2": "Ang mosunod nga mga panid misumpay sa '''$1''':",
        "isredirect": "panid sa redirekta",
        "istemplate": "transklusyon",
        "isimage": "sumpay sa payl",
index 21c7ea1..138554b 100644 (file)
        "whatlinkshere": "Håfa ha na'chetton guini",
        "whatlinkshere-title": "I påhina siha ni mana'chetton yan \"$1\"",
        "whatlinkshere-page": "Påhina:",
-       "linkshere": "Umachetton i sigienten påhina siha yan '''[[:$1]]''':",
-       "nolinkshere": "Taya' umachetton yan '''[[:$1]]'''.",
+       "linkshere-2": "Umachetton i sigienten påhina siha yan '''$1''':",
+       "nolinkshere-2": "Taya' umachetton yan '''$1'''.",
        "isredirect": "dirihi i påhina",
        "istemplate": "sinaonao",
        "whatlinkshere-prev": "{{PLURAL:$1|ni må'pos|$1 ni manmå'pos}}",
index b23fbab..c0f78de 100644 (file)
        "whatlinkshere": "بەستەرەکان بە ئێرەوە",
        "whatlinkshere-title": "ئەو پەڕانەی بەستەریان ھەیە بۆ «$1»",
        "whatlinkshere-page": "پەڕە:",
-       "linkshere": "پەڕەکانی ژێرەوە بەستەر دراون بۆ <strong>[[:$1]]</strong>:",
-       "nolinkshere": "ھیچ پەڕەیەک بەستەری نییە بۆ <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "ھیچ پەڕەیەک بەستەری نییە بۆ <strong>[[:$1]]</strong> لە بۆشایی ناوی هەڵبژێرراودا.",
+       "linkshere-2": "پەڕەکانی ژێرەوە بەستەر دراون بۆ <strong>$1</strong>:",
+       "nolinkshere-2": "ھیچ پەڕەیەک بەستەری نییە بۆ <strong>$1</strong>.",
+       "nolinkshere-ns-2": "ھیچ پەڕەیەک بەستەری نییە بۆ <strong>$1</strong> لە بۆشایی ناوی هەڵبژێرراودا.",
        "isredirect": "پەڕەی ڕەوانەکەر",
        "istemplate": "بەکارھێنراو",
        "isimage": "بەستەری پەڕگە",
        "fileduplicatesearch-result-n": "پەڕگەی «$1» {{PLURAL:$2|١ دووپاتکراوەی کوتوموتی|$2 دووپاتکراوەی کوتوموتی}} ھەیە.",
        "fileduplicatesearch-noresults": "پەڕگەیەک بە ناوی «$1» نەدۆزرایەوە.",
        "specialpages": "پەڕە تایبەتەکان",
+       "specialpages-note-restricted": "* پەڕە تایبەتە ئاساییەکان.\n* <span class=\"mw-specialpagerestricted\">پەڕە تایبەتە بەرگریلێکراوەکان.</span>",
        "specialpages-group-maintenance": "ڕاپۆرتەکانی چاکسازی",
        "specialpages-group-other": "پەڕە تایبەتەکانی دیکە",
        "specialpages-group-login": "چوونەژوورەوە / دروستکردنی ھەژمار",
index 56d36cd..360b865 100644 (file)
        "sp-contributions-submit": "Circà",
        "whatlinkshere": "Pagine chì leganu quì",
        "whatlinkshere-title": "Pagine ligate à \"$1\"",
-       "linkshere": "E seguente pagine sò culligate à '''[[:$1]]''':",
+       "linkshere-2": "E seguente pagine sò culligate à '''$1''':",
        "istemplate": "inclusione",
        "whatlinkshere-prev": "{{PLURAL:$1|precidente|precidenti $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|seguente|seguenti $1}}",
index 5e568a8..214edc4 100644 (file)
        "whatlinkshere": "Ang nagatabid diri",
        "whatlinkshere-title": "Mga pahina nga naga-link sa $1",
        "whatlinkshere-page": "Pahina:",
-       "linkshere": "Ang mga gasunod nga pahina ga-link sa '''[[:$1]]''':",
+       "linkshere-2": "Ang mga gasunod nga pahina ga-link sa '''$1''':",
        "isredirect": "pahina pangdirekta",
        "istemplate": "transklusyon",
        "isimage": "Link sang litrato",
index df4f8fd..27ff8ba 100644 (file)
        "whatlinkshere": "Бу саифеге багълантылар",
        "whatlinkshere-title": "«$1» саифесине багъланты олгъан саифелер",
        "whatlinkshere-page": "Саифе:",
-       "linkshere": "'''[[:$1]]''' саифесине багъланты берген саифелер:",
-       "nolinkshere": "'''[[:$1]]''' саифесине багъланты берген саифе ёкъ.",
-       "nolinkshere-ns": "Сайлангъан исим фезасында '''[[:$1]]''' саифесине багълангъан саифе ёкътыр.",
+       "linkshere-2": "'''$1''' саифесине багъланты берген саифелер:",
+       "nolinkshere-2": "'''$1''' саифесине багъланты берген саифе ёкъ.",
+       "nolinkshere-ns-2": "Сайлангъан исим фезасында '''$1''' саифесине багълангъан саифе ёкътыр.",
        "isredirect": "Ёллама саифеси",
        "istemplate": "кирсетильме",
        "isimage": "файл багълантысы",
index 7db085b..cd350ed 100644 (file)
        "whatlinkshere": "Bu saifege bağlantılar",
        "whatlinkshere-title": "“$1” saifesine bağlantı bergen saifeler",
        "whatlinkshere-page": "Saife:",
-       "linkshere": "'''[[:$1]]''' saifesine bağlantı bergen saifeler:",
-       "nolinkshere": "'''[[:$1]]''' saifesine bağlantı bergen saife yoq.",
-       "nolinkshere-ns": "Saylanğan isim fezasında '''[[:$1]]''' saifesine bağlanğan saife yoqtır.",
+       "linkshere-2": "'''$1''' saifesine bağlantı bergen saifeler:",
+       "nolinkshere-2": "'''$1''' saifesine bağlantı bergen saife yoq.",
+       "nolinkshere-ns-2": "Saylanğan isim fezasında '''$1''' saifesine bağlanğan saife yoqtır.",
        "isredirect": "Yollama saifesi",
        "istemplate": "kirsetilme",
        "isimage": "fayl bağlantısı",
index 113a994..d4734d2 100644 (file)
        "whatlinkshere": "Odkazuje sem",
        "whatlinkshere-title": "Stránky odkazující na „$1“",
        "whatlinkshere-page": "Strana:",
-       "linkshere": "Na '''[[:$1]]''' odkazují tyto stránky:",
-       "nolinkshere": "Žádná stránka na '''[[:$1]]''' neodkazuje.",
-       "nolinkshere-ns": "Ve zvoleném jmenném prostoru na '''[[:$1]]''' neodkazuje žádná stránka.",
+       "linkshere-2": "Na '''$1''' odkazují tyto stránky:",
+       "nolinkshere-2": "Žádná stránka na '''$1''' neodkazuje.",
+       "nolinkshere-ns-2": "Ve zvoleném jmenném prostoru na '''$1''' neodkazuje žádná stránka.",
        "isredirect": "přesměrování",
        "istemplate": "vložení",
        "isimage": "vložení souboru",
index d441b53..3620a0b 100644 (file)
        "whatlinkshere": "Lënkùjącé",
        "whatlinkshere-title": "Starnë lënkùjącé do \"$1\"",
        "whatlinkshere-page": "Starna:",
-       "linkshere": "Do '''[[:$1]]''' lënkùją hewòtné starnë:",
-       "nolinkshere": "Niżódnô starna nie lënkùje do '''[[:$1]]'''.",
+       "linkshere-2": "Do '''$1''' lënkùją hewòtné starnë:",
+       "nolinkshere-2": "Niżódnô starna nie lënkùje do '''$1'''.",
        "isredirect": "starna przeczerowaniô",
        "istemplate": "doparłãczony",
        "isimage": "lënk do lopka",
index 4343b61..c490c2a 100644 (file)
        "whatlinkshere": "дос҄ьдєщьнѩ съвѧꙁиѥ",
        "whatlinkshere-title": "страницѧ ижє съ ⁖ $1 ⁖ съвѧꙁи имѫтъ",
        "whatlinkshere-page": "страница :",
-       "linkshere": "сѩ страницѧ съ <strong>[[:$1]]</strong> съвѧꙁи имѫтъ :",
+       "linkshere-2": "сѩ страницѧ съ <strong>$1</strong> съвѧꙁи имѫтъ :",
        "isredirect": "прѣнаправлѥниѥ",
        "istemplate": "внѫтри страницѧ",
        "isimage": "дѣла съвѧꙁь",
index 4de9d8c..4c3dc08 100644 (file)
        "sp-contributions-submit": "Шыра",
        "whatlinkshere": "Кунта каçаканнисем",
        "whatlinkshere-title": "\"$1\" çине каçакан страницăсем",
-       "linkshere": "<strong>[[:$1]]</strong> çине каçакан страницăсем:",
-       "nolinkshere": "'''[[:$1]]''' страница çине ытти страницăсенчен килме пулмасть.",
+       "linkshere-2": "<strong>$1</strong> çине каçакан страницăсем:",
+       "nolinkshere-2": "'''$1''' страница çине ытти страницăсенчен килме пулмасть.",
        "whatlinkshere-prev": "{{PLURAL:$1|унчченхи|унчченхи $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|урăххи|урăххисем $1}}",
        "whatlinkshere-links": "← каçаканнисем",
index d6fb2bf..fc7cf59 100644 (file)
        "whatlinkshere": "Beth sy'n cysylltu yma",
        "whatlinkshere-title": "Tudalennau sy'n cysylltu â \"$1\"",
        "whatlinkshere-page": "Tudalen:",
-       "linkshere": "Mae'r tudalennau isod yn cysylltu â '''[[:$1]]''':",
-       "nolinkshere": "Nid oes cyswllt ar unrhyw dudalen arall syn arwain at '''[[:$1]]'''.",
-       "nolinkshere-ns": "Nid oes cyswllt ar unrhyw dudalen yn y parth dewisedig sy'n arwain at '''[[:$1]]'''.",
+       "linkshere-2": "Mae'r tudalennau isod yn cysylltu â '''$1''':",
+       "nolinkshere-2": "Nid oes cyswllt ar unrhyw dudalen arall syn arwain at '''$1'''.",
+       "nolinkshere-ns-2": "Nid oes cyswllt ar unrhyw dudalen yn y parth dewisedig sy'n arwain at '''$1'''.",
        "isredirect": "tudalen ailgyfeirio",
        "istemplate": "cynhwysiad",
        "isimage": "cyswllt ffeil",
index 652e426..067c6fc 100644 (file)
        "whatlinkshere": "Hvad henviser hertil",
        "whatlinkshere-title": "Sider der linker til \"$1\"",
        "whatlinkshere-page": "Side:",
-       "linkshere": "De følgende sider henviser til '''„[[:$1]]“''':",
-       "nolinkshere": "Ingen sider henviser til '''„[[:$1]]“'''.",
-       "nolinkshere-ns": "Ingen side henviser til '''„[[:$1]]“''' i det valgte navnerum.",
+       "linkshere-2": "De følgende sider henviser til '''„$1“''':",
+       "nolinkshere-2": "Ingen sider henviser til '''„$1“'''.",
+       "nolinkshere-ns-2": "Ingen side henviser til '''„$1“''' i det valgte navnerum.",
        "isredirect": "omdirigeringsside",
        "istemplate": "indlejring",
        "isimage": "filhenvisning",
        "fileduplicatesearch-noresults": "Ingen fil med navnet \"$1\" blev fundet.",
        "specialpages": "Specialsider",
        "specialpages-note-top": "Forklaring",
+       "specialpages-note-restricted": "* Normale specialsider.\n* <span class=\"mw-specialpagerestricted\">Specialsider med begrænset adgang.</span>",
        "specialpages-group-maintenance": "Vedligeholdelsesside",
        "specialpages-group-other": "Andre specialsider",
        "specialpages-group-login": "Log på / opret bruger",
index 98438c2..2718774 100644 (file)
        "blanknamespace": "(Seiten)",
        "contributions-title": "Benutzerbeiträge von «$1»",
        "whatlinkshere-title": "Seiten, die auf «$1» verlinken",
-       "linkshere": "Die folgenden Seiten verlinken auf '''«[[:$1]]»''':",
-       "nolinkshere": "Keine Seite verlinkt auf '''«[[:$1]]»'''.",
-       "nolinkshere-ns": "Keine Seite verlinkt auf '''«[[:$1]]»''' im gewählten Namensraum.",
+       "linkshere-2": "Die folgenden Seiten verlinken auf '''«$1»''':",
+       "nolinkshere-2": "Keine Seite verlinkt auf '''«$1»'''.",
+       "nolinkshere-ns-2": "Keine Seite verlinkt auf '''«$1»''' im gewählten Namensraum.",
        "ipb-confirmhideuser": "Du bist gerade dabei, einen Benutzer im Modus «Benutzer verstecken» zu sperren. Dies führt dazu, dass der Benutzername in allen Listen und Logbüchern unterdrückt wird. Möchtest du das wirklich tun?",
        "ipb-unblock-addr": "«$1» freigeben",
        "ipb-blocklist-contribs": "Benutzerbeiträge von «$1»",
index 6b212c9..bbc8a08 100644 (file)
        "protectedtitles-submit": "Titel anzeigen",
        "listusers": "Benutzerverzeichnis",
        "listusers-editsonly": "Zeige nur Benutzer mit Beiträgen",
+       "listusers-temporarygroupsonly": "Nur Benutzer in temporären Benutzergruppen anzeigen",
        "listusers-creationsort": "Nach Erstelldatum sortieren",
        "listusers-desc": "In absteigender Reihenfolge sortieren",
        "usereditcount": "$1 {{PLURAL:$1|Bearbeitung|Bearbeitungen}}",
        "whatlinkshere": "Links auf diese Seite",
        "whatlinkshere-title": "Seiten, die auf „$1“ verlinken",
        "whatlinkshere-page": "Seite:",
-       "linkshere": "Die folgenden Seiten verlinken auf <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Keine Seite verlinkt auf '''„[[:$1]]“'''.",
-       "nolinkshere-ns": "Keine Seite verlinkt auf '''„[[:$1]]“''' im gewählten Namensraum.",
+       "linkshere-2": "Die folgenden Seiten verlinken auf <strong>$1</strong>:",
+       "nolinkshere-2": "Keine Seite verlinkt auf '''„$1“'''.",
+       "nolinkshere-ns-2": "Keine Seite verlinkt auf '''„$1“''' im gewählten Namensraum.",
        "isredirect": "Weiterleitungsseite",
        "istemplate": "Vorlageneinbindung",
        "isimage": "Dateilink",
        "pagedata-text": "Diese Seite stellt eine Datenschnittstelle für Seiten zur Verfügung. Bitte gib mithilfe der Unterseitensyntax den Seitentitel in der URL an.\n* Übertragungen von Inhalten werden basierend auf dem Accept-Header deines Clients ausgeführt. Das bedeutet, dass die Seitendaten in dem Format zur Verfügung gestellt werden, das von deinem Client bevorzugt wird.",
        "pagedata-not-acceptable": "Kein passendes Format gefunden. Unterstützte MIME-Typen: $1",
        "pagedata-bad-title": "Ungültiger Titel: $1.",
-       "unregistered-user-config": "Aus Sicherheitsgründen können JavaScript-, CSS- und JSON-Benutzerunterseiten nicht für unangemeldete Benutzer geladen werden."
+       "unregistered-user-config": "Aus Sicherheitsgründen können JavaScript-, CSS- und JSON-Benutzerunterseiten nicht für unangemeldete Benutzer geladen werden.",
+       "passwordpolicies": "Passwortrichtlinien",
+       "passwordpolicies-summary": "Dies ist eine Liste der wirksamen Passwortrichtlinien für die in diesem Wiki definierten Benutzergruppen.",
+       "passwordpolicies-group": "Gruppe",
+       "passwordpolicies-policies": "Richtlinien",
+       "passwordpolicies-policy-minimalpasswordlength": "Ein Passwort muss mindestens {{PLURAL:$1|ein|$1}} Zeichen lang sein",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "Ein Passwort muss mindestens {{PLURAL:$1|ein|$1}} Zeichen zur Anmeldung lang sein",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Ein Passwort kann nicht mit dem Benutzernamen identisch sein",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "Ein Passwort kann nicht mit speziellen schwarzgelisteten Passwörtern übereinstimmen",
+       "passwordpolicies-policy-maximalpasswordlength": "Ein Passwort muss weniger als {{PLURAL:$1|ein|$1}} Zeichen lang sein",
+       "passwordpolicies-policy-passwordcannotbepopular": "Ein Passwort kann nicht {{PLURAL:$1|das beliebteste Passwort|in der Liste der $1 beliebtesten Passwörter}} sein"
 }
index 1a80395..f80e87f 100644 (file)
        "whatlinkshere": "Linkê tedeestey",
        "whatlinkshere-title": "Wesiqe da \"$1\" rê gıre dayen perri",
        "whatlinkshere-page": "Pele:",
-       "linkshere": "Pera <strong>[[:$1]]</strong> rê gıre dayen perri",
-       "nolinkshere": "Per da '''[[:$1]]''' rê pera ke gıre dana çıniya.",
-       "nolinkshere-ns": "Cayo ke namey rê weçinayo de qet perre '''[[:$1]]''' rê link nêbena.",
+       "linkshere-2": "Pera <strong>$1</strong> rê gıre dayen perri",
+       "nolinkshere-2": "Per da '''$1''' rê pera ke gıre dana çıniya.",
+       "nolinkshere-ns-2": "Cayo ke namey rê weçinayo de qet perre '''$1''' rê link nêbena.",
        "isredirect": "pera hetenayışi",
        "istemplate": "Açarnayene",
        "isimage": "gırey dosye",
        "fileduplicatesearch-noresults": "Ebe namey \"$1\" ra dosya nêdiyayê.",
        "specialpages": "Perrê xısusiy",
        "specialpages-note-top": "Kıtabek",
+       "specialpages-note-restricted": "* Pelê xasê normali.\n* <span class=\"mw-specialpagerestricted\">Pelê xasê nımıtey.</span>",
        "specialpages-group-maintenance": "Raporê pawıtışi",
        "specialpages-group-other": "Pelê xısusiyê bini",
        "specialpages-group-login": "Dekew / hesab vıraz",
index 1cffbde..2b8e205 100644 (file)
        "whatlinkshere": "Wótkaze na toś ten bok",
        "whatlinkshere-title": "Boki, kótarež wótkazuju na \"$1\"",
        "whatlinkshere-page": "bok:",
-       "linkshere": "Toś te boki wótkazuju na '''„[[:$1]]“''':",
-       "nolinkshere": "Žedne boki njewótkazuju na '''[[:$1]]'''.",
-       "nolinkshere-ns": "Žedne boki we wubranem mjenjowem rumje njewótkazuju na '''[[:$1]]'''.",
+       "linkshere-2": "Toś te boki wótkazuju na '''„$1“''':",
+       "nolinkshere-2": "Žedne boki njewótkazuju na '''$1'''.",
+       "nolinkshere-ns-2": "Žedne boki we wubranem mjenjowem rumje njewótkazuju na '''$1'''.",
        "isredirect": "dalejpósrědnjujucy bok",
        "istemplate": "zawězanje pśedłogi",
        "isimage": "datajowy wótkaz",
        "fileduplicatesearch-noresults": "Žedna dataja z mjenim \"$1\" namakana.",
        "specialpages": "Specialne boki",
        "specialpages-note-top": "Legenda",
+       "specialpages-note-restricted": "* Normalne specialne boki.\n* <span class=\"mw-specialpagerestricted\">Specialne boki z wobgranicowanym pśistupom.</span>",
        "specialpages-group-maintenance": "Wótwardowańske lisćiny",
        "specialpages-group-other": "Druge specialne boki",
        "specialpages-group-login": "Pśizjawiś/Konto załožyś",
index 64052ed..00b5f14 100644 (file)
        "whatlinkshere": "Nunu poingoput hiti",
        "whatlinkshere-title": "Bolikon di poingoput id \"$1\"",
        "whatlinkshere-page": "Bolikon:",
-       "linkshere": "Bolikon diti poingoput kumaa id  '''[[:$1]]''':",
-       "nolinkshere": "Ingaa bolikon poingoput id '''[[:$1]]'''.",
+       "linkshere-2": "Bolikon diti poingoput kumaa id  '''$1''':",
+       "nolinkshere-2": "Ingaa bolikon poingoput id '''$1'''.",
        "isredirect": "bolikon pinotilombus",
        "istemplate": "alanai",
        "isimage": "noputan do upa",
index b1ed3d9..99021a1 100644 (file)
        "whatlinkshere": "याँखाइ कि जोणीन्छ",
        "whatlinkshere-title": "$1 सित जोडियाऽ पन्नाअन",
        "whatlinkshere-page": "पानो",
-       "linkshere": "निम्न पानाहरू '''[[:$1]]''' मी जुडन्छ :",
-       "nolinkshere-ns": "चुनियाको नामस्थानमी '''[[:$1]]''' सित जुड्न्या पानाहरू नाइथिन्।",
+       "linkshere-2": "निम्न पानाहरू '''$1''' मी जुडन्छ :",
+       "nolinkshere-ns-2": "चुनियाको नामस्थानमी '''$1''' सित जुड्न्या पानाहरू नाइथिन्।",
        "isredirect": "अनुप्रेषित पानो",
        "istemplate": "पारदर्शिता",
        "isimage": "फाइल लिङ्क",
        "redirect-revision": "पन्ना संशोधन",
        "redirect-file": "फाइलनाउँ",
        "specialpages": "खास पन्नाअन",
+       "specialpages-note-restricted": "* साधारण खास पानाहरू।\n* <span class=\"mw-specialpagerestricted\">निषेधित खास पानाहरू।</span>",
        "specialpages-group-changes": "अल्लैका परिवर्तन लगहरू",
        "tags": "मान्य परिवर्तन ट्यागहरू",
        "tag-filter": "[[Special:Tags|पुछड]] छानिन्या",
index 2e187cc..e8cbc3f 100644 (file)
        "whatlinkshere": "A pûnten ché",
        "whatlinkshere-title": "Pàgini che pûnten a \"$1\"",
        "whatlinkshere-page": "Pàgina:",
-       "linkshere": "Al pàgini segvèinti a gh'àn di colegamèint a '''[[:$1]]'''.",
-       "nolinkshere": "Nisóna pàgina la gh'à dèinter colegamèint che pûnten a '''[[:$1]]'''.",
+       "linkshere-2": "Al pàgini segvèinti a gh'àn di colegamèint a '''$1'''.",
+       "nolinkshere-2": "Nisóna pàgina la gh'à dèinter colegamèint che pûnten a '''$1'''.",
        "isredirect": "Pàgina redirect",
        "istemplate": "uniòun",
        "isimage": "Colegamèint vêrs al file",
index f54ef28..ec816d5 100644 (file)
        "subject-preview": "Προεπισκόπηση θέματος:",
        "previewerrortext": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια για να κάνετε προεπισκόπηση των αλλαγών σας.",
        "blockedtitle": "Ο χρήστης έχει υποστεί φραγή.",
-       "blockedtext": "'''Το όνομα χρήστη σας ή η διεύθυνση IP σας έχει υποστεί φραγή.'''\n\nΗ φραγή έγινε από τον/την $1.\nΗ αιτιολογία που δόθηκε είναι: ''$2''.\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Η φραγή προορίζεται για το χρήστη: $7\n\nΜπορείτε να απευθυνθείτε στον/στην $1 ή σε κάποιον άλλον [[{{MediaWiki:Grouppage-sysop}}|διαχειριστή]] για να συζητήσετε τη φραγή.\nΔεν μπορείτε να χρησιμοποιήσετε την δυνατότητα «αποστολή e-mail σε αυτό το χρήστη» εκτός αν μια έγκυρη ηλεκτρονική διεύθυνση έχει οριστεί στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\nΗ τρέχουσα διεύθυνση IP σας είναι $3, και ο αριθμός αναγνώρισης της φραγής είναι #$5.\nΠαρακαλούμε περιλαμβάνετε οποιοδήποτε ή και τα δύο από αυτά σε οποιαδήποτε ερωτήματα σας.",
+       "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Να σημειωθεί ότι δεν μπορείτε να χρησιμοποιήσετε τη λειτουργία «αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου σε αυτόν τον χρήστη» εκτός αν έχετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου καταχωρισμένη στις [[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Παρακαλούμε να συμπεριλάβετε όλα τα παραπάνω στοιχεία σε τυχόν απορίες σας.",
        "blockednoreason": "δεν δόθηκε λόγος",
        "sp-deletedcontributions-contribs": "συνεισφορές",
        "linksearch": "Αναζήτηση εξωτερικών συνδέσμων",
        "linksearch-pat": "Μοτίβο αναζήτησης:",
-       "linksearch-ns": "ΠεÏ\81ιοÏ\87ή:",
+       "linksearch-ns": "Î\9fνομαÏ\84οÏ\87Ï\8eÏ\81οÏ\82:",
        "linksearch-ok": "Αναζήτηση",
        "linksearch-text": "Μπορούν να χρησιμοποιηθούν χαρακτήρες μπαλαντέρ όπως \"*.wikipedia.org\". \nΧρειάζεται τουλάχιστον μια κατάληξη ανωτάτου επιπέδου, για παράδειγμα \"*.org\".<br />\n{{PLURAL:$2|Υποστηριζόμενο πρωτόκολλο|Υποστηριζόμενα πρωτόκολλα}}: $1 (αν δεν οριστεί πρωτόκολλο η προεπιλογή είναι http://).",
        "linksearch-line": "Η σελίδα $1 συνδέεται από την $2",
        "whatlinkshere": "Τι συνδέει εδώ",
        "whatlinkshere-title": "Σελίδες που συνδέουν στη σελίδα «$1»",
        "whatlinkshere-page": "Σελίδα:",
-       "linkshere": "Οι ακόλουθες σελίδες συνδέουν στη σελίδα '''[[:$1]]''':",
-       "nolinkshere": "Δεν υπάρχουν σελίδες που να συνδέουν στη σελίδα '''[[:$1]]'''.",
-       "nolinkshere-ns": "Καμία σελίδα δεν συνδέει στο '''[[:$1]]''' στον επιλεγμένο ονοματοχώρο.",
+       "linkshere-2": "Οι ακόλουθες σελίδες συνδέουν στη σελίδα '''$1''':",
+       "nolinkshere-2": "Δεν υπάρχουν σελίδες που να συνδέουν στη σελίδα '''$1'''.",
+       "nolinkshere-ns-2": "Καμία σελίδα δεν συνδέει στο '''$1''' στον επιλεγμένο ονοματοχώρο.",
        "isredirect": "σελίδα ανακατεύθυνσης",
        "istemplate": "ενσωμάτωση",
        "isimage": "σύνδεσμος αρχείου",
        "fileduplicatesearch-noresults": "Δεν βρέθηκε κανένα αρχείο με το όνομα «$1».",
        "specialpages": "Ειδικές σελίδες",
        "specialpages-note-top": "Υπόμνημα",
+       "specialpages-note-restricted": "* Κανονικές ειδικές σελίδες.\n* <span class=\"mw-specialpagerestricted\">Ειδικές σελίδες με περιορισμούς.</span>",
        "specialpages-group-maintenance": "Αναφορές συντήρησης",
        "specialpages-group-other": "Άλλες ειδικές σελίδες",
        "specialpages-group-login": "Σύνδεση / δημιουργία λογαριασμού",
index 236d6e5..f36c8ed 100644 (file)
        "listusers": "User list",
        "listusers-summary": "",
        "listusers-editsonly": "Show only users with edits",
+       "listusers-temporarygroupsonly": "Show only users in temporary user groups",
        "listusers-creationsort": "Sort by creation date",
        "listusers-desc": "Sort in descending order",
        "usereditcount": "$1 {{PLURAL:$1|edit|edits}}",
        "whatlinkshere-title": "Pages that link to \"$1\"",
        "whatlinkshere-summary": "",
        "whatlinkshere-page": "Page:",
-       "linkshere": "The following pages link to <strong>[[:$1]]</strong>:",
-       "nolinkshere": "No pages link to <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "No pages link to <strong>[[:$1]]</strong> in the chosen namespace.",
+       "linkshere-2": "The following pages link to <strong>$1</strong>:",
+       "nolinkshere-2": "No pages link to <strong>$1</strong>.",
+       "nolinkshere-ns-2": "No pages link to <strong>$1</strong> in the chosen namespace.",
        "isredirect": "redirect page",
        "istemplate": "transclusion",
        "isimage": "file link",
        "pagedata-text": "This page provides a data interface to pages. Please provide the page title in the URL, using subpage syntax.\n* Content negotiation applies based on your client's Accept header. This means that the page data will be provided in the format preferred by your client.",
        "pagedata-not-acceptable": "No matching format found. Supported MIME types: $1",
        "pagedata-bad-title": "Invalid title: $1.",
-       "unregistered-user-config": "For security reasons JavaScript, CSS and JSON user subpages cannot be loaded for unregistered users."
+       "unregistered-user-config": "For security reasons JavaScript, CSS and JSON user subpages cannot be loaded for unregistered users.",
+       "passwordpolicies": "Password policies",
+       "passwordpolicies-summary": "This is a list of the effective password policies for the user groups defined in this wiki.",
+       "passwordpolicies-helppage": "Manual:$wgPasswordPolicy",
+       "passwordpolicies-group": "Group",
+       "passwordpolicies-policies": "Policies",
+       "passwordpolicies-policy-display": "<span class=\"passwordpolicies-policy\">$1 <code>($2)</code></span>",
+       "passwordpolicies-policy-minimalpasswordlength": "Password must be at least $1 {{PLURAL:$1|character|characters}} long",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "Password must be at least $1 {{PLURAL:$1|character|characters}} long to be able to login",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Password cannot be the same as username",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "Password cannot match specifically blacklisted passwords",
+       "passwordpolicies-policy-maximalpasswordlength": "Password must be less than $1 {{PLURAL:$1|character|characters}} long",
+       "passwordpolicies-policy-passwordcannotbepopular": "Password cannot be {{PLURAL:$1|the popular password|in the list of $1 popular passwords}}"
 }
index 58cf7dd..844f0f0 100644 (file)
        "whatlinkshere": "Ligiloj ĉi tien",
        "whatlinkshere-title": "Paĝoj ligantaj al \"$1\"",
        "whatlinkshere-page": "Paĝo:",
-       "linkshere": "La jenaj paĝoj ligas al '''[[:$1]]''':",
-       "nolinkshere": "Neniu paĝo ligas al '''[[:$1]]'''.",
-       "nolinkshere-ns": "Neniuj paĝoj ligas al '''[[:$1]]''' en la elektita nomspaco.",
+       "linkshere-2": "La jenaj paĝoj ligas al '''$1''':",
+       "nolinkshere-2": "Neniu paĝo ligas al '''$1'''.",
+       "nolinkshere-ns-2": "Neniuj paĝoj ligas al '''$1''' en la elektita nomspaco.",
        "isredirect": "alidirektilo",
        "istemplate": "inkludo",
        "isimage": "ligilo al dosiero",
        "fileduplicatesearch-noresults": "Neniu dosiero nomita \"$1\" troviĝis.",
        "specialpages": "Specialaj paĝoj",
        "specialpages-note-top": "Klarigo",
+       "specialpages-note-restricted": "* Normaj specialaj paĝoj.\n* <span class=\"mw-specialpagerestricted\">Limigitaj specialaj paĝoj.</span>",
        "specialpages-group-maintenance": "Raportoj pri prizorgado",
        "specialpages-group-other": "Aliaj specialaj paĝoj",
        "specialpages-group-login": "Ensaluti /  registriĝi",
index 8360c61..dd22634 100644 (file)
        "right-edituserjson": "Editar archivos JSON de otros usuarios",
        "right-edituserjs": "Editar las páginas de JavaScript de otros usuarios",
        "right-editmyusercss": "Editar tus archivos CSS",
+       "right-editmyuserjson": "Editar tus propias páginas en formato JSON",
        "right-editmyuserjs": "Editar tus archivos JavaScript",
        "right-viewmywatchlist": "Ver su propia lista de seguimiento",
        "right-editmywatchlist": "Editar su propia lista de seguimiento (algunas acciones seguirán añadiendo páginas aun sin este permiso).",
        "grant-createaccount": "Crear cuentas",
        "grant-createeditmovepage": "Crear, editar y trasladar páginas",
        "grant-delete": "Borrar páginas, revisiones y entradas del registro",
-       "grant-editinterface": "Editar el espacio de nombres MediaWiki y el CSS/JavaScript de usuarios",
+       "grant-editinterface": "Editar el espacio de nombres MediaWiki y el CSS/JSON/JavaScript de los usuarios",
        "grant-editmycssjs": "Editar tu CSS/JSON/JavaScript",
        "grant-editmyoptions": "Editar tus preferencias de usuario",
        "grant-editmywatchlist": "Editar tu lista de seguimiento",
        "rcfilters-filter-humans-label": "Ser humano (no robot)",
        "rcfilters-filter-humans-description": "Ediciones realizadas por editores humanos.",
        "rcfilters-filtergroup-reviewstatus": "Estado de revisión",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Ediciones no marcadas como revisadas manual o automáticamente.",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "No patrulladas",
+       "rcfilters-filter-reviewstatus-manual-description": "Ediciones manualmente marcadas como revisadas.",
        "rcfilters-filter-reviewstatus-manual-label": "Verificado manualmente",
        "rcfilters-filter-reviewstatus-auto-description": "Ediciones por usuarios avanzados cuyo trabajo se marca automáticamente como verificado.",
        "rcfilters-filter-reviewstatus-auto-label": "Autoverificado",
        "recentchangeslinked-feed": "Cambios relacionados",
        "recentchangeslinked-toolbox": "Cambios relacionados",
        "recentchangeslinked-title": "Cambios relacionados con «$1»",
-       "recentchangeslinked-summary": "Escribe el nombre de una página para ver cambios realizados en páginas con enlaces entrantes o salientes a esa página. (Para ver lo que pertenece a una categoría, escribe «Categoría:Nombre de la categoría»). Los cambios en páginas de tu [[Special:Watchlist|lista de seguimiento]] aparecen en <strong>negrita</strong>.",
+       "recentchangeslinked-summary": "Introduce el nombre de una página para ver los cambios en las páginas enlazadas. (Para ver miembros de una categoría, introduce {{ns:category}}:Nombre de la categoría). Los cambios realizados a la páginas que tengas en tu [[Special:Watchlist|lista de seguimiento]] se resaltarán en <strong>negritas</strong>.",
        "recentchangeslinked-page": "Nombre de la página:",
        "recentchangeslinked-to": "Mostrar los cambios en páginas enlazadas con la página seleccionada",
        "recentchanges-page-added-to-category": "[[:$1]] añadida a la categoría",
        "protectedpages-params": "Parámetros de protección",
        "protectedpages-reason": "Motivo",
        "protectedpages-submit": "Mostrar páginas",
-       "protectedpages-unknown-timestamp": "Desconocido",
+       "protectedpages-unknown-timestamp": "Desconocidas",
        "protectedpages-unknown-performer": "Usuario desconocido",
        "protectedtitles": "Títulos protegidos",
        "protectedtitles-summary": "Esta página enumera títulos que actualmente están protegidos desde su creación. Para una lista de las páginas existentes que están protegidas, véase [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitles-submit": "Mostrar títulos",
        "listusers": "Lista de usuarios",
        "listusers-editsonly": "Muestra sólo usuarios con ediciones",
+       "listusers-temporarygroupsonly": "Mostrar solo usuarios en grupos de usuario temporales",
        "listusers-creationsort": "Ordenado por fecha de creación",
        "listusers-desc": "Ordenar de forma descendente",
        "usereditcount": "$1 {{PLURAL:$1|edición|ediciones}}",
        "apisandbox-dynamic-parameters-add-placeholder": "Nombre del parámetro",
        "apisandbox-dynamic-error-exists": "Ya existe un parámetro llamado \"$1\".",
        "apisandbox-deprecated-parameters": "Parámetros desaconsejados",
-       "apisandbox-fetch-token": "Auto-llenar el token",
+       "apisandbox-fetch-token": "Rellenar la ficha automáticamente",
        "apisandbox-add-multi": "Añadir",
        "apisandbox-submit-invalid-fields-title": "Algunos campos no son válidos",
        "apisandbox-submit-invalid-fields-message": "Corrige los campos señalados e inténtalo de nuevo.",
        "restriction-move": "Trasladar",
        "restriction-create": "Crear",
        "restriction-upload": "Subir",
-       "restriction-level-sysop": "completamente protegida",
-       "restriction-level-autoconfirmed": "semiprotegida",
+       "restriction-level-sysop": "protección completa",
+       "restriction-level-autoconfirmed": "semiprotección",
        "restriction-level-all": "cualquier nivel",
        "undelete": "Ver páginas borradas",
        "undeletepage": "Ver y restaurar páginas borradas",
        "whatlinkshere": "Lo que enlaza aquí",
        "whatlinkshere-title": "Páginas que enlazan con «$1»",
        "whatlinkshere-page": "Página:",
-       "linkshere": "Las siguientes páginas enlazan a <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Ninguna página enlaza con <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "Ninguna página enlaza con <strong>[[:$1]]</strong> en el espacio de nombres elegido.",
+       "linkshere-2": "Las siguientes páginas enlazan a <strong>$1</strong>:",
+       "nolinkshere-2": "Ninguna página enlaza con <strong>$1</strong>.",
+       "nolinkshere-ns-2": "Ninguna página enlaza con <strong>$1</strong> en el espacio de nombres elegido.",
        "isredirect": "página redirigida",
        "istemplate": "inclusión",
        "isimage": "enlace de archivo",
        "group-bot.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Robots */",
        "group-sysop.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Administradores */",
        "group-bureaucrat.css": "/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios del grupo Burócratas */",
+       "common.json": "/* Cualquier esquema JSON escrito aquí se cargará para todos los usuarios en cada carga de página. */",
        "common.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada carga de página */",
        "group-autoconfirmed.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios del grupo Usuarios autoconfirmados */",
        "group-user.js": "/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios registrados */",
        "authform-nosession-login": "La autenticación fue exitosa, pero tu navegador no «recuerda» haber accedido a la cuenta.\n\n$1",
        "authform-nosession-signup": "Se ha creado la cuenta, pero tu navegador no «recuerda» haber accedido a ella.\n\n$1",
        "authform-newtoken": "Falta token. $1",
-       "authform-notoken": "Falta token",
-       "authform-wrongtoken": "Token incorrecto",
+       "authform-notoken": "Falta la ficha",
+       "authform-wrongtoken": "Ficha incorrecta",
        "specialpage-securitylevel-not-allowed-title": "No está permitido",
        "specialpage-securitylevel-not-allowed": "No puedes utilizar esta página porque no se pudo verificar tu identidad.",
        "authpage-cannot-login": "No se puede iniciar la sesión.",
        "pagedata-title": "Datos de la página",
        "pagedata-text": "Esta página provee una interfaz de datos a otras páginas. Por favor proporcione el título de la página en la URL usando la sintaxis de subpáginas.\n* La negociación del contenido se aplica en base a la cabecera Accept de su cliente. Esto significa que los datos de la página se proporcionarán en su formato de preferencia.",
        "pagedata-not-acceptable": "No se ha encontrado un formato coincidente. Tipos MIME admitidos: $1",
-       "pagedata-bad-title": "El título «$1» no es válido."
+       "pagedata-bad-title": "El título «$1» no es válido.",
+       "unregistered-user-config": "Por razones de seguridad, no se pueden cargar los códigos JavaScript, CSS o JSON localizados en subpáginas de usuarios no registrados.",
+       "passwordpolicies": "Normativas para contraseñas",
+       "passwordpolicies-group": "Grupo",
+       "passwordpolicies-policies": "Normativas",
+       "passwordpolicies-policy-passwordcannotmatchusername": "La contraseña no puede ser la misma que el nombre de usuario"
 }
index 9969926..abffdb9 100644 (file)
        "whatlinkshere": "Lingid siia",
        "whatlinkshere-title": "Leheküljed, mis viitavad lehele \"$1\"",
        "whatlinkshere-page": "Lehekülg:",
-       "linkshere": "Lehele '''[[:$1]]''' viitavad järgmised leheküljed:",
-       "nolinkshere": "Lehele '''[[:$1]]''' ei viita ükski lehekülg.",
-       "nolinkshere-ns": "Leheküljele <strong>[[:$1]]</strong> ei ole valitud nimeruumis linke.",
+       "linkshere-2": "Lehele '''$1''' viitavad järgmised leheküljed:",
+       "nolinkshere-2": "Lehele '''$1''' ei viita ükski lehekülg.",
+       "nolinkshere-ns-2": "Leheküljele <strong>$1</strong> ei ole valitud nimeruumis linke.",
        "isredirect": "ümbersuunamislehekülg",
        "istemplate": "kasutamine mallina",
        "isimage": "faililink",
index 3933655..2a01b48 100644 (file)
        "whatlinkshere": "Honanzko lotura duten orriak",
        "whatlinkshere-title": "$1(e)ra lotura duten orriak",
        "whatlinkshere-page": "Orria:",
-       "linkshere": "Hauek dute '''[[:$1]]''' orrialderako lotura:",
-       "nolinkshere": "Ez dago '''[[:$1]]''' lotura duen orrialderik.",
-       "nolinkshere-ns": "Hautatutako izen-tartean ez dago '''[[:$1]]''' orrialderako lotura duenik.",
+       "linkshere-2": "Hauek dute '''$1''' orrialderako lotura:",
+       "nolinkshere-2": "Ez dago '''$1''' lotura duen orrialderik.",
+       "nolinkshere-ns-2": "Hautatutako izen-tartean ez dago '''$1''' orrialderako lotura duenik.",
        "isredirect": "birbideratze orrialdea",
        "istemplate": "erabilpena",
        "isimage": "fitxategi lotura",
index 59a32c5..73086be 100644 (file)
        "whatlinkshere": "Lo que atija aquina",
        "whatlinkshere-title": "Páhinas que atihan a $1",
        "whatlinkshere-page": "Páhina:",
-       "linkshere": "Las siguientis páhinas atihan a '''[[:$1]]''':",
-       "nolinkshere": "Denguna páhina atiha a '''[[:$1]]'''.",
-       "nolinkshere-ns": "Nu ai denguna páhina qu´atihi a '''[[:$1]]''' nel espaciu e nombris lihiu.",
+       "linkshere-2": "Las siguientis páhinas atihan a '''$1''':",
+       "nolinkshere-2": "Denguna páhina atiha a '''$1'''.",
+       "nolinkshere-ns-2": "Nu ai denguna páhina qu´atihi a '''$1''' nel espaciu e nombris lihiu.",
        "isredirect": "Rederihil páhina",
        "istemplate": "inclusión",
        "isimage": "atihu la imahin",
index 9a3dee6..1d17909 100644 (file)
        "whatlinkshere": "پیوندها به این صفحه",
        "whatlinkshere-title": "صفحه‌هایی که به «$1» پیوند دارند",
        "whatlinkshere-page": "صفحه:",
-       "linkshere": "صفحه‌های زیر به '''[[:$1]]''' پیوند دارند:",
-       "nolinkshere": "هیچ صفحه‌ای به '''[[:$1]]''' پیوند ندارد.",
-       "nolinkshere-ns": "هیچ صفحه‌ای از فضای نام انتخاب شده به '''[[:$1]]''' پیوند ندارد.",
+       "linkshere-2": "صفحه‌های زیر به '''$1''' پیوند دارند:",
+       "nolinkshere-2": "هیچ صفحه‌ای به '''$1''' پیوند ندارد.",
+       "nolinkshere-ns-2": "هیچ صفحه‌ای از فضای نام انتخاب شده به '''$1''' پیوند ندارد.",
        "isredirect": "صفحهٔ تغییرمسیر",
        "istemplate": "تراگنجانش‌ها",
        "isimage": "پیوند به پرونده",
index 7a24fe7..099fd67 100644 (file)
        "botpasswords-existing": "Olemassaolevat bottisalasanat",
        "botpasswords-createnew": "Luo uusi bottisalasana",
        "botpasswords-editexisting": "Muokkaa olemassaolevaa bottisalasanaa",
+       "botpasswords-label-needsreset": "(salasanat täytyy nollata)",
        "botpasswords-label-appid": "Botin nimi:",
        "botpasswords-label-create": "Luo",
        "botpasswords-label-update": "Päivitä",
        "whatlinkshere": "Tänne viittaavat sivut",
        "whatlinkshere-title": "Sivut, jotka viittaavat sivulle $1",
        "whatlinkshere-page": "Sivu:",
-       "linkshere": "Seuraavilta sivuilta on linkki sivulle <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Sivulle <strong>[[:$1]]</strong> ei ole linkkejä.",
-       "nolinkshere-ns": "Sivulle <strong>[[:$1]]</strong> ei ole linkkejä valitussa nimiavaruudessa.",
+       "linkshere-2": "Seuraavilta sivuilta on linkki sivulle <strong>$1</strong>:",
+       "nolinkshere-2": "Sivulle <strong>$1</strong> ei ole linkkejä.",
+       "nolinkshere-ns-2": "Sivulle <strong>$1</strong> ei ole linkkejä valitussa nimiavaruudessa.",
        "isredirect": "ohjaussivu",
        "istemplate": "sisällytetty",
        "isimage": "tiedostolinkki",
index 9c39499..34b3a95 100644 (file)
        "whatlinkshere": "Hvat slóðar higar",
        "whatlinkshere-title": "Síður sum slóða til \"$1\"",
        "whatlinkshere-page": "Síða:",
-       "linkshere": "Hesar síður slóða til '''[[:$1]]''':",
-       "nolinkshere": "Ongar síður slóða til '''[[:$1]]'''.",
-       "nolinkshere-ns": "Ongar síður slóða til '''[[:$1]]''' í tí valda navnarúminum.",
+       "linkshere-2": "Hesar síður slóða til '''$1''':",
+       "nolinkshere-2": "Ongar síður slóða til '''$1'''.",
+       "nolinkshere-ns-2": "Ongar síður slóða til '''$1''' í tí valda navnarúminum.",
        "isredirect": "ávísingarsíða",
        "istemplate": "leggjast innan í",
        "isimage": "fílu slóð",
index cd80060..504bd2b 100644 (file)
        "protectedtitles-submit": "Afficher les titres",
        "listusers": "Liste des utilisateurs",
        "listusers-editsonly": "Ne montrer que les utilisateurs ayant fait des modifications.",
+       "listusers-temporarygroupsonly": "N'afficher que les utilisateurs des groupes d'utilisateurs temporaires",
        "listusers-creationsort": "Trier par date de création",
        "listusers-desc": "Trier par ordre décroissant",
        "usereditcount": "$1 modification{{PLURAL:$1||s}}",
        "whatlinkshere": "Pages liées",
        "whatlinkshere-title": "Pages qui pointent vers « $1 »",
        "whatlinkshere-page": "Page :",
-       "linkshere": "Les pages ci-dessous contiennent un lien vers <strong>[[:$1]]</strong> :",
-       "nolinkshere": "Aucune page ne contient de lien vers <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "Aucune page ne contient de lien vers <strong>[[:$1]]</strong> dans l'espace de noms choisi.",
+       "linkshere-2": "Les pages ci-dessous contiennent un lien vers <strong>$1</strong> :",
+       "nolinkshere-2": "Aucune page ne contient de lien vers <strong>$1</strong>.",
+       "nolinkshere-ns-2": "Aucune page ne contient de lien vers <strong>$1</strong> dans l'espace de noms choisi.",
        "isredirect": "page de redirection",
        "istemplate": "inclusion",
        "isimage": "lien vers le fichier",
        "pagedata-text": "Cette page fournit une interface de données aux pages. Veuillez fournir le titre de la page dans l’URL en utilisant la syntaxe de sous-page.\n* La négociation de contenu s’applique d’après l’entête Accept de votre client. Cela veut dire que les données de la page seront fournies dans le format préféré par votre client.",
        "pagedata-not-acceptable": "Aucun format correspondant trouvé. Types MIME pris en charge : $1",
        "pagedata-bad-title": "Titre non valide : $1.",
-       "unregistered-user-config": "Pour des raisons de sécurité, les sous-pages utilisateur JavaScript, CSS et JSON ne peuvent pas être chargées pour des utilisateurs non inscrits."
+       "unregistered-user-config": "Pour des raisons de sécurité, les sous-pages utilisateur JavaScript, CSS et JSON ne peuvent pas être chargées pour des utilisateurs non inscrits.",
+       "passwordpolicies": "Règles concernant le mot de passe",
+       "passwordpolicies-summary": "Voici une liste des politiques des mots de passe effectifs pour les groupes d'utilisateurs de ce wiki.",
+       "passwordpolicies-group": "Groupe",
+       "passwordpolicies-policies": "Politiques",
+       "passwordpolicies-policy-minimalpasswordlength": "Les mots de passe doivent avoir au moins $1 caractère{{PLURAL:$1||s}} de long",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "Les mots de passe doivent avoir au moins $1 caractère{{PLURAL:$1||s}} de long pour autoriser la connextion",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Le mot de passe ne peut pas être le même que le nom d'utilisateur",
+       "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"
 }
index 3794fb1..9607106 100644 (file)
        "whatlinkshere": "Pâges liyêes",
        "whatlinkshere-title": "Pâges que pouentont vers « $1 »",
        "whatlinkshere-page": "Pâge :",
-       "linkshere": "Cetes pâges contegnont un lim de vers <strong>[[:$1]]</strong> :",
-       "nolinkshere": "Niona pâge contint de lim de vers <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "Niona pâge contint de lim de vers <strong>[[:$1]]</strong> dedens l’èspâço de noms chouèsi.",
+       "linkshere-2": "Cetes pâges contegnont un lim de vers <strong>$1</strong> :",
+       "nolinkshere-2": "Niona pâge contint de lim de vers <strong>$1</strong>.",
+       "nolinkshere-ns-2": "Niona pâge contint de lim de vers <strong>$1</strong> dedens l’èspâço de noms chouèsi.",
        "isredirect": "pâge de redirèccion",
        "istemplate": "transcllusion",
        "isimage": "lim de vers lo fichiér",
        "fileduplicatesearch-noresults": "Nion fichiér apelâ « $1 » est étâ trovâ.",
        "specialpages": "Pâges spèciâles",
        "specialpages-note-top": "Lègenda",
+       "specialpages-note-restricted": "* Pâges spèciâles normales.\n* <span class=\"mw-specialpagerestricted\">Pâges spèciâles rètrentes.</span>",
        "specialpages-group-maintenance": "Rapôrts d’entretin",
        "specialpages-group-other": "Ôtres pâges spèciâles",
        "specialpages-group-login": "Sè branchiér / fâre un comptio",
index 467b8dd..f4b889d 100644 (file)
        "whatlinkshere": "Ferwisangen üüb detdiar sidj",
        "whatlinkshere-title": "Sidjen, diar üüb \"$1\" ferwise",
        "whatlinkshere-page": "Sidj:",
-       "linkshere": "Jodiar sidjen ferwise üüb '''„[[:$1]]“''':",
-       "nolinkshere": "Nian sidj ferwiset üüb [[:$1]]",
-       "nolinkshere-ns": "Nian sidj ferwiset üüb '''„[[:$1]]“''' uun di ütjsoocht nöömrüm.",
+       "linkshere-2": "Jodiar sidjen ferwise üüb '''„$1“''':",
+       "nolinkshere-2": "Nian sidj ferwiset üüb $1",
+       "nolinkshere-ns-2": "Nian sidj ferwiset üüb '''„$1“''' uun di ütjsoocht nöömrüm.",
        "isredirect": "widjerfeerang",
        "istemplate": "iinbünjen föörlaagen",
        "isimage": "Dateilink",
        "fileduplicatesearch-noresults": "Nian datei mä di nööm „$1“ fünjen.",
        "specialpages": "Spezial-sidjen",
        "specialpages-note-top": "Legend",
+       "specialpages-note-restricted": "* Normool spezial-sidjen\n* <span class=\"mw-specialpagerestricted\">Spezial-sidjen mä tugripsrochten</span>",
        "specialpages-group-maintenance": "Werksteedsidjen",
        "specialpages-group-other": "Ööder spezial-sidjen",
        "specialpages-group-login": "Melde di uun of skriiw di iin",
index e0f5aea..ccabad1 100644 (file)
        "whatlinkshere": "Leams a cheste vôs",
        "whatlinkshere-title": "Pagjinis che a son leadis a \"$1\"",
        "whatlinkshere-page": "Pagjine:",
-       "linkshere": "Lis pagjinis ca sot a son leadis a '''[[:$1]]''':",
-       "nolinkshere": "Nissune pagjine e à leams a '''[[:$1]]'''.",
-       "nolinkshere-ns": "No son pagjine leadis a '''[[:$1]]''' intal spazi dai nons sielt.",
+       "linkshere-2": "Lis pagjinis ca sot a son leadis a '''$1''':",
+       "nolinkshere-2": "Nissune pagjine e à leams a '''$1'''.",
+       "nolinkshere-ns-2": "No son pagjine leadis a '''$1''' intal spazi dai nons sielt.",
        "isredirect": "pagjine di reindirizament",
        "istemplate": "includude",
        "isimage": "leam a figure",
        "fileduplicatesearch-filename": "Non dal file:",
        "fileduplicatesearch-submit": "Cîr",
        "specialpages": "Pagjinis speciâls",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* Pagjinis speciâls no riservadis.\n* <strong class=\"mw-specialpagerestricted\">Pagjinis speciâls a ciertis categoriis di utents.</strong>",
        "specialpages-group-maintenance": "Rapuarts di manutenzion",
        "specialpages-group-other": "Altris pagjinis speciâls",
        "specialpages-group-login": "Jentrade / regjistrazion",
index e7fae5e..faa6728 100644 (file)
        "whatlinkshere": "Wat is hjirmei keppele?",
        "whatlinkshere-title": "Siden dy't keppele binne mei \"$1\"",
        "whatlinkshere-page": "Side:",
-       "linkshere": "Dizze siden binne keppele oan '''[[:$1]]''':",
-       "nolinkshere": "Der binne gjin siden oan '''[[:$1]]''' keppele.",
-       "nolinkshere-ns": "Gjin siden yn de keazen nammeromte keppelje nei '''[[:$1]]'''.",
+       "linkshere-2": "Dizze siden binne keppele oan '''$1''':",
+       "nolinkshere-2": "Der binne gjin siden oan '''$1''' keppele.",
+       "nolinkshere-ns-2": "Gjin siden yn de keazen nammeromte keppelje nei '''$1'''.",
        "isredirect": "synonym",
        "istemplate": "opnaam",
        "isimage": "triemkeppeling",
        "fileduplicatesearch-result-n": "De triem \"$1\" hat {{PLURAL:$2|1 duplikaat|$2 duplikaten}}.",
        "specialpages": "Bysûndere siden",
        "specialpages-note-top": "Leginda",
+       "specialpages-note-restricted": "!!FUZZY!!* Normale bysûndere siden.\n* <strong class=\"mw-specialpagerestricted\">Beheinde bysûndere siden.</strong>",
        "specialpages-group-maintenance": "Underhâld siden",
        "specialpages-group-other": "Oare bysûndere siden",
        "specialpages-group-login": "Oanmelde / registrearje",
index ea20a63..f59930b 100644 (file)
        "whatlinkshere": "Naisc leis an lch seo",
        "whatlinkshere-title": "Naisc le $1",
        "whatlinkshere-page": "Leathanach:",
-       "linkshere": "Tá nasc chuig '''[[:$1]]''' ar na leathanaigh seo a leanas:",
-       "nolinkshere": "Níl leathanach ar bith ann a bhfuil nasc chuig '''[[:$1]]''' air.",
-       "nolinkshere-ns": "Níl leathanach ar bith ann san ainmspás roghnaithe a bhfuil nasc chuig '''[[:$1]]''' air.",
+       "linkshere-2": "Tá nasc chuig '''$1''' ar na leathanaigh seo a leanas:",
+       "nolinkshere-2": "Níl leathanach ar bith ann a bhfuil nasc chuig '''$1''' air.",
+       "nolinkshere-ns-2": "Níl leathanach ar bith ann san ainmspás roghnaithe a bhfuil nasc chuig '''$1''' air.",
        "isredirect": "Leathanach athsheolaidh",
        "istemplate": "iniamh",
        "isimage": "nasc comhad",
index 2998314..00bf854 100644 (file)
        "whatlinkshere": "Baalantılar sayfaa",
        "whatlinkshere-title": "$1 baalantısı olan sayfalar",
        "whatlinkshere-page": "Yaprak:",
-       "linkshere": "Buraya baalantısı var olan sayfalar '''[[:$1]]''':",
-       "nolinkshere": "Yok buraya baalanan sayfa '''[[:$1]]'''.",
+       "linkshere-2": "Buraya baalantısı var olan sayfalar '''$1''':",
+       "nolinkshere-2": "Yok buraya baalanan sayfa '''$1'''.",
        "isredirect": "yönnendirmäk sayfası",
        "istemplate": "eklemää",
        "isimage": "fayl baalantısı",
index 86c5fa0..64ddae7 100644 (file)
        "whatlinkshere": "有什哩连到个首",
        "whatlinkshere-title": "连到 $1 𠮶页面",
        "whatlinkshere-page": "页面:",
-       "linkshere": "下底𠮶页面链接到[[:$1]]:",
-       "nolinkshere": "冇页面链接到[[:$1]]。",
-       "nolinkshere-ns": "选正𠮶空间名内冇页面链接到[[:$1]]。",
+       "linkshere-2": "下底𠮶页面链接到$1:",
+       "nolinkshere-2": "冇页面链接到$1。",
+       "nolinkshere-ns-2": "选正𠮶空间名内冇页面链接到$1。",
        "isredirect": "重定向页面",
        "istemplate": "含到",
        "isimage": "档案连结",
index 96da964..944d037 100644 (file)
        "whatlinkshere": "有什哩連到箇首",
        "whatlinkshere-title": "連到 $1 嗰頁面",
        "whatlinkshere-page": "頁面:",
-       "linkshere": "下底嗰頁面連結到[[:$1]]:",
-       "nolinkshere": "冇頁面連結到[[:$1]]。",
-       "nolinkshere-ns": "選正嗰空間名內冇頁面連結到[[:$1]]。",
+       "linkshere-2": "下底嗰頁面連結到$1:",
+       "nolinkshere-2": "冇頁面連結到$1。",
+       "nolinkshere-ns-2": "選正嗰空間名內冇頁面連結到$1。",
        "isredirect": "重定向頁",
        "istemplate": "含到",
        "isimage": "檔案連結",
index 3fb3cb6..2efd559 100644 (file)
        "whatlinkshere": "Paj lyé",
        "whatlinkshere-title": "Paj ki ka pwenté bò'd « $1 »",
        "whatlinkshere-page": "Paj :",
-       "linkshere": "Paj-ya ki anba ka kontni roun lyen vèr <strong>[[:$1]]</strong> :",
-       "nolinkshere": "Pyès paj pa gen kontni dé lyen vèr <strong>[[:$1]]</strong>.",
+       "linkshere-2": "Paj-ya ki anba ka kontni roun lyen vèr <strong>$1</strong> :",
+       "nolinkshere-2": "Pyès paj pa gen kontni dé lyen vèr <strong>$1</strong>.",
        "isredirect": "paj di roudirèksyon",
        "istemplate": "enklizyon",
        "isimage": "Lyen vèr fiché-a",
index 8d345f0..e5a0161 100644 (file)
        "whatlinkshere": "Na tha a' ceangal a-nall an-seo",
        "whatlinkshere-title": "Duilleagan a tha a' ceangal ri \"$1\"",
        "whatlinkshere-page": "Duilleag:",
-       "linkshere": "Tha na duilleagan a leanas a' ceangal ri <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Chan eil ceangal air duilleag sam bith a tha a' dol gu <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "Chan eil ceangal gu <strong>[[:$1]]</strong> ann an duilleag sam bith san ainm-spàs a thagh thu.",
+       "linkshere-2": "Tha na duilleagan a leanas a' ceangal ri <strong>$1</strong>:",
+       "nolinkshere-2": "Chan eil ceangal air duilleag sam bith a tha a' dol gu <strong>$1</strong>.",
+       "nolinkshere-ns-2": "Chan eil ceangal gu <strong>$1</strong> ann an duilleag sam bith san ainm-spàs a thagh thu.",
        "isredirect": "duilleag ath-sheòlaidh",
        "istemplate": "transclusion",
        "isimage": "ceangal faidhle",
        "fileduplicatesearch-noresults": "Cha deach faidhle air a bheil \"$1\" a lorg.",
        "specialpages": "Duilleagan sònraichte",
        "specialpages-note-top": "Treòir",
+       "specialpages-note-restricted": "* Duilleagan sònraichte coitcheann.\n* <span class=\"mw-specialpagerestricted\">Duilleagan sònraichte cuingichte.</span>",
        "specialpages-group-maintenance": "Aithrisean na h-obrach-glèidhidh",
        "specialpages-group-other": "Duilleagan sònraichte eile",
        "specialpages-group-login": "Log a-steach / cruthaich cunntas",
index 4fb87e7..f584af6 100644 (file)
        "whatlinkshere": "Páxinas que ligan con esta",
        "whatlinkshere-title": "Páxinas que ligan con \"$1\"",
        "whatlinkshere-page": "Páxina:",
-       "linkshere": "As seguintes páxinas ligan con \"'''[[:$1]]'''\":",
-       "nolinkshere": "Ningunha páxina liga con \"'''[[:$1]]'''\".",
-       "nolinkshere-ns": "Ningunha páxina liga con \"'''[[:$1]]'''\" no espazo de nomes elixido.",
+       "linkshere-2": "As seguintes páxinas ligan con \"'''$1'''\":",
+       "nolinkshere-2": "Ningunha páxina liga con \"'''$1'''\".",
+       "nolinkshere-ns-2": "Ningunha páxina liga con \"'''$1'''\" no espazo de nomes elixido.",
        "isredirect": "páxina redirixida",
        "istemplate": "inclusión",
        "isimage": "ligazón ao ficheiro",
index 1981d76..f65948d 100644 (file)
        "whatlinkshere": "هرچي خال ببؤ ائره",
        "whatlinkshere-title": "ولگؤني گه «$1»ˇ أمرأ خال دأنن",
        "whatlinkshere-page": "ولگ:",
-       "linkshere": "جيري ولگؤن '''[[:$1]]'''ˇ أمرأ خال دأنن:",
+       "linkshere-2": "جيري ولگؤن '''$1'''ˇ أمرأ خال دأنن:",
        "isredirect": "تغييرمسيرˇ ولگ",
        "isimage": "فاىلˇ خال",
        "whatlinkshere-prev": "{{PLURAL:$1|قبلي|$1 قبلي مؤرد}}",
index beecd23..8b89f81 100644 (file)
        "whatlinkshere": "हाका कितें जुळटा",
        "whatlinkshere-title": " \"$1\" हाका जोडणी आशिल्लीं पानां",
        "whatlinkshere-page": "पान:",
-       "linkshere": "मुखावेली पानां '''[[:$1]]''': हाका जोडणी करतात",
-       "nolinkshere": "$1हाका खंयच्याच पानाची जोडणी ना",
+       "linkshere-2": "मुखावेली पानां '''$1''': हाका जोडणी करतात",
+       "nolinkshere-2": "$1हाका खंयच्याच पानाची जोडणी ना",
        "isredirect": "पुनर्निर्देशन पान",
        "istemplate": "$1 दूसरात-समावेस",
        "isimage": "फायलीचो दुवो",
index 976847b..ff45698 100644 (file)
        "whatlinkshere": "Hanga kitem zoddta",
        "whatlinkshere-title": "\"$1\" haka zoddlelim panam",
        "whatlinkshere-page": "Pan:",
-       "linkshere": "Sokoilim panam <strong>[[:$1]]</strong> ak zoddtat:",
-       "nolinkshere": "Khoincheim pan '''[[:$1]]''' ak zoddna.",
+       "linkshere-2": "Sokoilim panam <strong>$1</strong> ak zoddtat:",
+       "nolinkshere-2": "Khoincheim pan '''$1''' ak zoddna.",
        "isredirect": "punornirdexon pan",
        "istemplate": "Durasth-somaves",
        "isimage": "failichem zoddop",
index 26a1a0d..e69303e 100644 (file)
        "whatlinkshere": "Wumbuta",
        "whatlinkshere-title": "Halaman botiye o wumbuta ode \"$1\"",
        "whatlinkshere-page": "Halaman",
-       "linkshere": "Halaman botiye woluwo wumbuta ode <strong>[[:$1]]<strong>:",
-       "nolinkshere": "Diya'a halaman wumbuta ode <strong>[[:$1]]</strong>",
+       "linkshere-2": "Halaman botiye woluwo wumbuta ode <strong>$1<strong>:",
+       "nolinkshere-2": "Diya'a halaman wumbuta ode <strong>$1</strong>",
        "isredirect": "halaman pilobaleyalo",
        "istemplate": "tranklusi",
        "isimage": "wumbuta lo berkas",
index 7ec44a0..d1d4424 100644 (file)
        "whatlinkshere": "𐌰𐌻𐌻𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺 𐌷𐌹𐌳𐍂𐌴",
        "whatlinkshere-title": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐍄𐌰𐌹𐌺𐌽𐌾𐌰𐌽𐌳 𐌳𐌿 \"$1\"",
        "whatlinkshere-page": "𐌻𐌰𐌿𐍆𐍃:",
-       "linkshere": "𐌹𐍆𐍄𐌿𐌼𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺  <strong>[[:$1]]</strong>:",
+       "linkshere-2": "𐌹𐍆𐍄𐌿𐌼𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺  <strong>$1</strong>:",
        "isredirect": "𐌰𐌻𐌾𐌰𐍂 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
        "istemplate": "𐍄𐍂𐌰𐌽𐍃𐌺𐌻𐌿𐍃𐌾𐍉",
        "whatlinkshere-prev": "{{PLURAL:$1|𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰|𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰𐌽𐍃 $1}}",
index fe9f276..654f178 100644 (file)
        "whatlinkshere": "Τὰ ἐνθάδε ἄγοντα",
        "whatlinkshere-title": "Δέλτοι συνεζευγμέναι μετὰ τοῦ \"$1\"",
        "whatlinkshere-page": "Δέλτος:",
-       "linkshere": "Τάδε ἄγουσι πρὸς '''[[:$1]]''':",
-       "nolinkshere": "Οὐδένα ἄγουσι πρὸς '''[[:$1]]'''.",
-       "nolinkshere-ns": "Οὐδεμία δέλτος συνδέεται τῇ '''[[:$1]]''' ἐν τῷ ἐπιλεγμένῳ ὀνοματείῳ.",
+       "linkshere-2": "Τάδε ἄγουσι πρὸς '''$1''':",
+       "nolinkshere-2": "Οὐδένα ἄγουσι πρὸς '''$1'''.",
+       "nolinkshere-ns-2": "Οὐδεμία δέλτος συνδέεται τῇ '''$1''' ἐν τῷ ἐπιλεγμένῳ ὀνοματείῳ.",
        "isredirect": "ἀναδιευθύνειν δέλτον",
        "istemplate": "περίκλεισις",
        "isimage": "σύνδεσμος ἀρχείου",
        "fileduplicatesearch-result-1": "Τὸ ἀρχεῖον \"$1\" οὐκ ἔχει ταυτοτικὴν διπλοτυπίαν.",
        "fileduplicatesearch-result-n": "Τὸ ἀρχεῖον \"$1\" ἔχει {{PLURAL:$2|1 ταυτοτικὴν διπλοτυπίαν|$2 ταυτοτικὰς διπλοτυπίας}}.",
        "specialpages": "Εἰδικαὶ δέλτοι",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!* Κανονικαὶ εἰδικαὶ δέλτοι.\n* <strong class=\"mw-specialpagerestricted\">Περιωρισμέναι εἰδικαὶ δἐλτοι.</strong>\n* <span class=\"mw-specialpagecached\">Μόναι δέλτοι ἀποτεταμιευμέναι.</span>",
        "specialpages-group-maintenance": "Ἀναφοραὶ συντηρήσεως",
        "specialpages-group-other": "Ἕτεραι εἰδικαὶ δέλτοι",
        "specialpages-group-login": "Συνδεῖσθαι/λογισμὸν ποιεῖν",
index 1a09c5a..924d5f8 100644 (file)
        "whatlinkshere": "Was verwyst do druff?",
        "whatlinkshere-title": "Sytene, wo uf „$1“ verlinke",
        "whatlinkshere-page": "Syte:",
-       "linkshere": "Die Sytene hen e Link, wu zu '''„[[:$1]]“''' fiere:",
-       "nolinkshere": "Kei Artikel verwyyst uf '''„[[:$1]]“'''.",
-       "nolinkshere-ns": "Kei Syte verwyyst uf '''„[[:$1]]“''' im gwehlte Namensruum.",
+       "linkshere-2": "Die Sytene hen e Link, wu zu '''„$1“''' fiere:",
+       "nolinkshere-2": "Kei Artikel verwyyst uf '''„$1“'''.",
+       "nolinkshere-ns-2": "Kei Syte verwyyst uf '''„$1“''' im gwehlte Namensruum.",
        "isredirect": "Wyterleitigssyte",
        "istemplate": "Vorlageybindig",
        "isimage": "Dateigleich",
        "fileduplicatesearch-noresults": "S isch kei Datei mit em Name „$1“ gfunde wore.",
        "specialpages": "Spezialsytene",
        "specialpages-note-top": "Zeichenerklärig:",
+       "specialpages-note-restricted": "* Normali Spezialsyte.\n* <span class=\"mw-specialpagerestricted\">Spezialsyte mit bschränktem Zuegang.</span>",
        "specialpages-group-maintenance": "Wartigslischte",
        "specialpages-group-other": "Andri Spezialsyte",
        "specialpages-group-login": "Aamälde/Konto aalege",
index 38217d3..676e09d 100644 (file)
        "whatlinkshere": "અહી શું જોડાય છે",
        "whatlinkshere-title": "\"$1\" ને જોડતા પાનાં",
        "whatlinkshere-page": "પાનું:",
-       "linkshere": "નીચેના પાનાઓ '''[[:$1]]''' સાથે જોડાય છે:",
-       "nolinkshere": "'''[[:$1]]'''ની સાથે કોઇ પાના જોડાતા નથી.",
-       "nolinkshere-ns": "પસંદ કરેલ નામ સ્થળમાં કોઇ પાના '''[[:$1]]'''  સાથે જોડાયેલ નથી.",
+       "linkshere-2": "નીચેના પાનાઓ '''$1''' સાથે જોડાય છે:",
+       "nolinkshere-2": "'''$1'''ની સાથે કોઇ પાના જોડાતા નથી.",
+       "nolinkshere-ns-2": "પસંદ કરેલ નામ સ્થળમાં કોઇ પાના '''$1'''  સાથે જોડાયેલ નથી.",
        "isredirect": "દિશાનિર્દેશ કરેલ પાનું",
        "istemplate": "સમાવેશ",
        "isimage": "ફાઇલની કડી",
        "fileduplicatesearch-result-n": "\"$1\" ફાઇલની તેની સમાન {{PLURAL:$2|1 નકલ |$2 નકલો }} છે.",
        "fileduplicatesearch-noresults": " \"$1\" નામ ધરાવતી કોઇ ફાઇલ ન મળી",
        "specialpages": "ખાસ પાનાંઓ",
+       "specialpages-note-restricted": "* નિયમિત ખાસ પાનાં.\n* <span class=\"mw-specialpagerestricted\">પ્રતિબંધિત ખાસ પાનાં.</span>",
        "specialpages-group-maintenance": "સમારકામ અહેવાલ",
        "specialpages-group-other": "અન્ય ખાસ પાનાઓ",
        "specialpages-group-login": "પ્રવેશ / ખાતુ બનાવો",
index c80216e..701507a 100644 (file)
        "whatlinkshere": "Cre ta kiangley rish shoh",
        "whatlinkshere-title": "Duillagyn ta kianglt rish $1",
        "whatlinkshere-page": "Duillag:",
-       "linkshere": "Ta ny duillagyn shoh kianglt rish '''[[:$1]]''':",
-       "nolinkshere": "Cha nel duillag erbee kianglt rish '''[[:$1]]'''.",
+       "linkshere-2": "Ta ny duillagyn shoh kianglt rish '''$1''':",
+       "nolinkshere-2": "Cha nel duillag erbee kianglt rish '''$1'''.",
        "isredirect": "duillag aa-enmyssit",
        "istemplate": "goaill stiagh",
        "isimage": "kiangley coadan",
index 408d8c9..5ca721e 100644 (file)
        "whatlinkshere": "Mahaɗan wannan shafi",
        "whatlinkshere-title": "Shafuna masu mahaɗi da \"$1\"",
        "whatlinkshere-page": "Shafi:",
-       "linkshere": "Waɗannan shafuna sun haɗu da '''[[:$1]]''':",
+       "linkshere-2": "Waɗannan shafuna sun haɗu da '''$1''':",
        "isredirect": "shafin turawa",
        "istemplate": "gami",
        "isimage": "majigi shigagge",
index 26e605d..9f97204 100644 (file)
        "whatlinkshere": "Nâi-têu lièn to liá-têu",
        "whatlinkshere-title": "Lièn-chiap to \"$1\" ke ya̍p-mien",
        "whatlinkshere-page": "Ya̍p-mien:",
-       "linkshere": "Hâ-poi ya̍p-mien lièn-chiap to <strong>[[:$1]]</strong>:",
-       "nolinkshere": "無頁面鏈接到'''[[:$1]]'''。",
-       "nolinkshere-ns": "Chhai só-sién ke miàng-sṳ khûng-kiên tú mò ya̍p-mien lièn-chiap to [[:$1]].",
+       "linkshere-2": "Hâ-poi ya̍p-mien lièn-chiap to <strong>$1</strong>:",
+       "nolinkshere-2": "無頁面鏈接到'''$1'''。",
+       "nolinkshere-ns-2": "Chhai só-sién ke miàng-sṳ khûng-kiên tú mò ya̍p-mien lièn-chiap to $1.",
        "isredirect": "chhùng-thin-hiong ya̍p",
        "istemplate": "pâu-hàm",
        "isimage": "vùn-khien lièn-chiap",
index b0d1643..bc55341 100644 (file)
        "whatlinkshere": "He aha ka mea e loulou iho ai",
        "whatlinkshere-title": "Nā ʻAoʻao e loulou iā \"$1\"",
        "whatlinkshere-page": "‘Ao‘ao:",
-       "linkshere": "Loulou kēia mau ʻaoʻao iā <strong>[[:$1]]</strong>:",
-       "nolinkshere": "ʻAʻohe ‘ao‘ao e loulou iā '''[[:$1]]'''.",
+       "linkshere-2": "Loulou kēia mau ʻaoʻao iā <strong>$1</strong>:",
+       "nolinkshere-2": "ʻAʻohe ‘ao‘ao e loulou iā '''$1'''.",
        "isredirect": "ʻaoʻao kia hou",
        "istemplate": "kumo",
        "isimage": "loulou waihona",
index 31b7caa..81c2991 100644 (file)
        "protectedtitles-submit": "הצגת הדפים",
        "listusers": "רשימת משתמשים",
        "listusers-editsonly": "הצגת משתמשים עם עריכות בלבד",
+       "listusers-temporarygroupsonly": "הצגת משתמשים בקבוצות משתמש זמניות בלבד",
        "listusers-creationsort": "מיון לפי תאריך היצירה של החשבון",
        "listusers-desc": "מיון בסדר יורד",
        "usereditcount": "{{PLURAL:$1|עריכה אחת|$1 עריכות}}",
        "enotif_subject_restored": "הדף \"$1\" ב{{grammar:תחילית|{{SITENAME}}}} שוחזר על־ידי $2",
        "enotif_subject_changed": "הדף \"$1\" ב{{grammar:תחילית|{{SITENAME}}}} שוּנה על־ידי $2",
        "enotif_body_intro_deleted": "הדף \"$1\" באתר {{SITENAME}} נמחק ב־$PAGEEDITDATE על־ידי $2; להלן הקישור לדף: $3.",
-       "enotif_body_intro_created": "×\94×\93×£ \"$1\" ×\91×\90תר {{SITENAME}} × ×\95צר ×\91Ö¾$PAGEEDITDATE ×¢×\9cÖ¾×\99×\93×\99 $2; ×¨×\90×\95 $3 ×\9c×\92רס×\94 ×\94× ×\95×\9b×\97×\99ת ×©×\9c ×\94×\93×£.",
-       "enotif_body_intro_moved": "×\94×\93×£ \"$1\" ×\91×\90תר {{SITENAME}} ×\94×\95×¢×\91ר ×\91Ö¾$PAGEEDITDATE ×¢×\9cÖ¾×\99×\93×\99 $2; ×¨×\90×\95 $3 ×\9c×\92רס×\94 ×\94× ×\95×\9b×\97×\99ת ×©×\9c ×\94×\93×£.",
-       "enotif_body_intro_restored": "×\94×\93×£ \"$1\" ×\91×\90תר {{SITENAME}} ×©×\95×\97×\96ר ×\91Ö¾$PAGEEDITDATE ×¢×\9cÖ¾×\99×\93×\99 $2; ×¨×\90×\95 $3 ×\9c×\92רס×\94 ×\94× ×\95×\9b×\97×\99ת ×©×\9c ×\94×\93×£.",
-       "enotif_body_intro_changed": "×\94×\93×£ \"$1\" ×\91×\90תר {{SITENAME}} ×©×\95Ö¼× ×\94 ×\91Ö¾$PAGEEDITDATE ×¢×\9cÖ¾×\99×\93×\99 $2; ×¨×\90×\95 $3 ×\9c×\92רס×\94 ×\94× ×\95×\9b×\97×\99ת ×©×\9c ×\94×\93×£.",
-       "enotif_lastvisited": "×\9c×\9b×\9c ×\94ש×\99× ×\95×\99×\99×\9d ×\9e×\90×\96 ×\91×\99ק×\95ר×\9b×\9d האחרון בדף, ר' $1",
+       "enotif_body_intro_created": "×\94×\93×£ \"$1\" ×\91×\90תר {{SITENAME}} × ×\95צר ×\91Ö¾$PAGEEDITDATE ×¢×\9cÖ¾×\99×\93×\99 $2; ×\9c×\94×\9c×\9f ×§×\99ש×\95ר ×\9c×\92רס×\94 ×\94× ×\95×\9b×\97×\99ת ×©×\9c ×\94×\93×£: $3.",
+       "enotif_body_intro_moved": "×\94×\93×£ \"$1\" ×\91×\90תר {{SITENAME}} ×\94×\95×¢×\91ר ×\91Ö¾$PAGEEDITDATE ×¢×\9cÖ¾×\99×\93×\99 $2; ×\9c×\94×\9c×\9f ×§×\99ש×\95ר ×\9c×\92רס×\94 ×\94× ×\95×\9b×\97×\99ת ×©×\9c ×\94×\93×£: $3.",
+       "enotif_body_intro_restored": "×\94×\93×£ \"$1\" ×\91×\90תר {{SITENAME}} ×©×\95×\97×\96ר ×\91Ö¾$PAGEEDITDATE ×¢×\9cÖ¾×\99×\93×\99 $2; ×\9c×\94×\9c×\9f ×§×\99ש×\95ר ×\9c×\92רס×\94 ×\94× ×\95×\9b×\97×\99ת ×©×\9c ×\94×\93×£: $3.",
+       "enotif_body_intro_changed": "×\94×\93×£ \"$1\" ×\91×\90תר {{SITENAME}} ×©×\95Ö¼× ×\94 ×\91Ö¾$PAGEEDITDATE ×¢×\9cÖ¾×\99×\93×\99 $2; ×\9c×\94×\9c×\9f ×§×\99ש×\95ר ×\9c×\92רס×\94 ×\94× ×\95×\9b×\97×\99ת ×©×\9c ×\94×\93×£: $3.",
+       "enotif_lastvisited": "×\9cצפ×\99×\99×\94 ×\91×\9b×\9c ×\94ש×\99× ×\95×\99×\99×\9d ×\9e×\90×\96 ×\91×\99ק×\95ר×\9a האחרון בדף, ר' $1",
        "enotif_lastdiff": "לצפייה בשינוי זה, ר' $1",
        "enotif_anon_editor": "משתמש אנונימי $1",
-       "enotif_body": "×\9c×\9b×\91×\95×\93 $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nתקצ×\99ר ×\94ער×\99×\9b×\94: $PAGESUMMARY $PAGEMINOREDIT\n\n×\91×\90פשר×\95ת×\9b×\9d ×\9c×\99צ×\95ר ×§×©×¨ ×¢×\9d ×\94×¢×\95ר×\9a:\n×\91×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99: $PAGEEDITOR_EMAIL\n×\91×\90תר: $PAGEEDITOR_WIKI\n\n×\9c×\90 ×ª×§×\91×\9c×\95 ×\94×\95×\93×¢×\95ת ×¢×\9c ×¤×¢×\95×\9c×\95ת × ×\95ספ×\95ת ×¢×\93 ×©×ª×\91קר×\95 ×\91×\93×£ ×\94×\96×\94 ×\9bש×\90ת×\9d ×\9e×\97×\95×\91ר×\99×\9d ×\9c×\97ש×\91×\95×\9f. ×\91×\90פשר×\95ת×\9b×\9d ×\92×\9d ×\9c×\90פס ×\90ת ×\93×\92×\9c×\99 ×\94×\94×\95×\93×¢×\95ת ×¢×\91×\95ר ×\9b×\9c ×\94×\93פ×\99×\9d ×©×\91רש×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9b×\9d.\n\n×\91×\91ר×\9b×\94, ×\9eער×\9bת ×\94×\94×\95×\93×¢×\95ת ×©×\9c {{SITENAME}}.\n\n--\n×\9b×\93×\99 ×\9cשנ×\95ת ×\90ת ×\94×\94×\92×\93ר×\95ת ×©×\9c ×\94×\95×\93×¢×\95ת ×\94×\93×\95×\90\"×\9c ×\94נש×\9c×\97×\95ת ×\90×\9c×\99×\9b×\9d, ×\91קר×\95 ×\91×\93×£:\n{{canonicalurl:{{#special:Preferences}}}}\n\n×\9b×\93×\99 ×\9cשנ×\95ת ×\90ת ×\94×\94×\92×\93ר×\95ת ×©×\9c ×¨×©×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9b×\9d, ×\91קר×\95 ×\91×\93×£:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n×\9b×\93×\99 ×\9c×\94ס×\99ר ×\90ת ×\94×\93×£ ×\94×\96×\94 ×\9eרש×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9b×\9d, ×\91קר×\95 בדף:\n$UNWATCHURL\n\nלמשוב ולעזרה נוספת:\n$HELPPAGE",
+       "enotif_body": "×\9c×\9b×\91×\95×\93 $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nתקצ×\99ר ×\94ער×\99×\9b×\94: $PAGESUMMARY $PAGEMINOREDIT\n\n×\91×\90פשר×\95ת×\9a ×\9c×\99צ×\95ר ×§×©×¨ ×¢×\9d ×\94×¢×\95ר×\9a:\n×\91×\93×\95×\90ר ×\90×\9cק×\98ר×\95× ×\99: $PAGEEDITOR_EMAIL\n×\91×\90תר: $PAGEEDITOR_WIKI\n\n×\9c×\90 ×ª×\94×\99×\99× ×\94 ×\94×\95×\93×¢×\95ת ×¢×\9c ×¤×¢×\95×\9c×\95ת × ×\95ספ×\95ת ×¢×\93 ×\9c×\91×\99ק×\95ר×\9a ×\91×\93×£ ×\94×\96×\94 ×\9e×\94×\97ש×\91×\95×\9f ×©×\9c×\9a. ×\91×\90פשר×\95ת×\9a ×\92×\9d ×\9c×\90פס ×\90ת ×\93×\92×\9c×\99 ×\94×\94×\95×\93×¢×\95ת ×¢×\91×\95ר ×\9b×\9c ×\94×\93פ×\99×\9d ×©×\91רש×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a.\n\n×\91×\91ר×\9b×\94, ×\9eער×\9bת ×\94×\94×\95×\93×¢×\95ת ×©×\9c {{SITENAME}}.\n\n--\n×\9b×\93×\99 ×\9cשנ×\95ת ×\90ת ×\94×\94×\92×\93ר×\95ת ×©×\9c ×\94×\95×\93×¢×\95ת ×\94×\93×\95×\90\"×\9c, ×\91×\90פשר×\95ת×\9a ×\9c×\91קר ×\91×\93×£:\n{{canonicalurl:{{#special:Preferences}}}}\n\n×\9b×\93×\99 ×\9cשנ×\95ת ×\90ת ×\94×\94×\92×\93ר×\95ת ×©×\9c ×¨×©×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a, ×\91×\90פשר×\95ת×\9a ×\9c×\91קר ×\91×\93×£:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n×\9b×\93×\99 ×\9c×\94ס×\99ר ×\90ת ×\94×\93×£ ×\94×\96×\94 ×\9eרש×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\9a, ×\91×\90פשר×\95ת×\9a ×\9c×\91קר בדף:\n$UNWATCHURL\n\nלמשוב ולעזרה נוספת:\n$HELPPAGE",
        "enotif_minoredit": "זוהי עריכה משנית",
        "created": "נוצר",
        "changed": "שוּנה",
        "exbeforeblank": "התוכן לפני שרוקן היה: \"$1\"",
        "delete-confirm": "מחיקת הדף \"$1\"",
        "delete-legend": "מחיקה",
-       "historywarning": "<strong>×\90×\96×\94ר×\94:</strong> ×\9c×\93×£ ×©{{GENDER:|×\90ת×\94 ×¢×\95×\9e×\93\90ת ×¢×\95×\9e×\93ת|×\90ת×\9d ×¢×\95×\9e×\93×\99×\9d}} ×\9c×\9e×\97×\95ק יש היסטוריית שינויים של {{PLURAL:$1|גרסה אחת|$1 גרסאות}}:",
+       "historywarning": "<strong>×\90×\96×\94ר×\94:</strong> ×\9c×\93×£ ×\96×\94 יש היסטוריית שינויים של {{PLURAL:$1|גרסה אחת|$1 גרסאות}}:",
        "historyaction-submit": "הצגה",
-       "confirmdeletetext": "×\90ת×\9d ×¢×\95×\9e×\93×\99×\9d ×\9c×\9e×\97×\95ק ×\93×£ ×\99×\97×\93 ×¢×\9d ×\9b×\9c ×\94×\94×\99ס×\98×\95ר×\99×\94 ×©×\9c×\95.\n\n×\90× ×\90 ×\90שר×\95 ×©×\96×\94 ×\90×\9b×\9f ×\9e×\94 ×©×\90ת×\9d ×\9eת×\9b×\95×\95× ×\99×\9d ×\9cעש×\95ת, ×©×\90ת×\9d ×\9e×\91×\99× ×\99×\9d ×\90ת ×\94ת×\95צ×\90×\95ת ×©×\9c ×\9eעש×\94 ×\9b×\96×\94, ושהמעשה מבוצע בהתאם ל[[{{MediaWiki:Policy-url}}|נוהלי האתר]].",
+       "confirmdeletetext": "× ×\99ת×\9f ×\9c×\94שת×\9eש ×\91×\98×\95פס ×©×\9c×\94×\9c×\9f ×\9b×\93×\99 ×\9c×\9e×\97×\95ק ×\93×£ ×\99×\97×\93 ×¢×\9d ×\9b×\9c ×\94×\94×\99ס×\98×\95ר×\99×\94 ×©×\9c×\95.\n× ×\90 ×\9c×\90שר ×©×\96×\94 ×\90×\9b×\9f ×\9e×\94 ×©×\94ת×\9b×\95×\95נת ×\9cעש×\95ת, ×©×\94ת×\95צ×\90×\95ת ×©×\9c ×\94פע×\95×\9c×\94 ×\94×\96×\95 ×\99×\93×\95×¢×\95ת ×\9c×\9a, ושהמעשה מבוצע בהתאם ל[[{{MediaWiki:Policy-url}}|נוהלי האתר]].",
        "actioncomplete": "הפעולה בוצעה",
        "actionfailed": "הפעולה נכשלה",
-       "deletedtext": "\"$1\" נמחק.\nראו $2 לרשימת המחיקות האחרונות.",
+       "deletedtext": "הדף \"$1\" נמחק.\nרשימת המחיקות האחרונות מופיעה ב$2.",
        "dellogpage": "יומן מחיקות",
        "dellogpagetext": "להלן רשימה של המחיקות האחרונות שבוצעו.",
-       "deletionlog": "יומן מחיקות",
+       "deletionlog": "×\99×\95×\9e×\9f ×\94×\9e×\97×\99ק×\95ת",
        "reverted": "שוחזר לגרסה קודמת",
        "deletecomment": "סיבה:",
        "deleteotherreason": "סיבה אחרת/נוספת:",
        "deletereason-dropdown": "* סיבות מחיקה נפוצות\n** ספאם\n** השחתה\n** הפרת זכויות יוצרים\n** לבקשת הכותב\n** הפניה שבורה",
        "delete-edit-reasonlist": "עריכת סיבות המחיקה",
        "delete-toobig": "לדף זה יש היסטוריית עריכות גדולה, שמכילה יותר {{PLURAL:$1|מגרסה אחת|מ־$1 גרסאות}}.\nמחיקת דפים כאלה הוגבלה כדי למנוע בעיות בתפקוד של {{SITENAME}}.",
-       "delete-warning-toobig": "דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו. מחיקה שלו עלולה להפריע לפעולות בבסיס הנתונים; אנא שקלו שנית את המחיקה.",
+       "delete-warning-toobig": "דף זה כולל מעל {{PLURAL:$1|גרסה אחת|$1 גרסאות}} בהיסטוריית העריכות שלו.\nמחיקה שלו עלולה להפריע לפעולות בבסיס הנתונים של {{SITENAME}};\nנא לשקול שנית את המחיקה.",
        "deleteprotected": "אין באפשרותך למחוק את הדף כי הוא מוגן.",
-       "deleting-backlinks-warning": "<strong>×\90×\96×\94ר×\94:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|×\93פ×\99×\9d ×\90×\97ר×\99×\9d]] ×\9eקשר×\99×\9d ×\9c×\93×£ ×©{{GENDER:|×\90ת×\94 ×¢×\95×\9e×\93\90ת ×¢×\95×\9e×\93ת|×\90ת×\9d ×¢×\95×\9e×\93×\99×\9d}} ×\9c×\9e×\97×\95ק או מכלילים אותו.",
-       "deleting-subpages-warning": "<strong>×\90×\96×\94ר×\94:</strong> ×\9c×\93×£ ×©{{GENDER:|×\90ת×\94 ×¢×\95×\9e×\93\90ת ×¢×\95×\9e×\93ת|×\90ת×\9d ×¢×\95×\9e×\93×\99×\9d}} ×\9c×\9e×\97×\95ק יש [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|דף משנה|$1 דפי משנה|51=יותר מ־50 דפי משנה}}]].",
+       "deleting-backlinks-warning": "<strong>×\90×\96×\94ר×\94:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|×\93פ×\99×\9d ×\90×\97ר×\99×\9d]] ×\9eקשר×\99×\9d ×\9c×\93×£ ×\96×\94 או מכלילים אותו.",
+       "deleting-subpages-warning": "<strong>×\90×\96×\94ר×\94:</strong> ×\9c×\93×£ ×\96×\94 יש [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|דף משנה|$1 דפי משנה|51=יותר מ־50 דפי משנה}}]].",
        "rollback": "שחזור עריכות",
        "rollbacklink": "שחזור",
        "rollbacklinkcount": "שחזור {{PLURAL:$1|עריכה אחת|$1 עריכות}}",
        "rollback-missingparam": "חסרים פרמטרים נדרשים להגשת הבקשה.",
        "rollback-missingrevision": "לא ניתן לטעון את המידע על הגרסה.",
        "cantrollback": "לא ניתן לשחזר את העריכה;\nהתורם האחרון הוא היחיד שכתב בדף זה.",
-       "alreadyrolled": "לא ניתן לשחזר את העריכה של [[User:$2|$2]] ([[User talk:$2|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) בדף [[:$1]]; הדף כבר נערך או שוחזר.\n\nהעריכה האחרונה הייתה של [[User:$3|$3]] ([[User talk:$3|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "לא ניתן לשחזר את העריכה של [[User:$2|$2]] ([[User talk:$2|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) בדף [[:$1]];\nהדף כבר נערך או שוחזר.\n\nהעריכה האחרונה הייתה של [[User:$3|$3]] ([[User talk:$3|שיחה]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "תקציר העריכה היה: <em>$1</em>.",
        "revertpage": "שוחזר מעריכות של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]]) לעריכה האחרונה של [[User:$1|$1]]",
        "revertpage-nouser": "שוחזר מעריכות של משתמש מוסתר לעריכה האחרונה של {{GENDER:$1|[[User:$1|$1]]}}",
        "whatlinkshere": "דפים המקושרים לכאן",
        "whatlinkshere-title": "דפים המקשרים לדף \"$1\"",
        "whatlinkshere-page": "דף:",
-       "linkshere": "הדפים שלהלן מקושרים לדף '''[[:$1]]''':",
-       "nolinkshere": "אין דפים המקושרים לדף '''[[:$1]]'''.",
-       "nolinkshere-ns": "אין דפים המקושרים לדף '''[[:$1]]''' במרחב השם שנבחר.",
+       "linkshere-2": "הדפים שלהלן מקושרים לדף '''$1''':",
+       "nolinkshere-2": "אין דפים המקושרים לדף '''$1'''.",
+       "nolinkshere-ns-2": "אין דפים המקושרים לדף '''$1''' במרחב השם שנבחר.",
        "isredirect": "דף הפניה",
        "istemplate": "הכללה",
        "isimage": "קישור לקובץ",
        "pagedata-text": "דף זה מהווה ממשק מידע לדפים. כדי להשתמש בו, כותרת הדף צריכה להופיע בכתובת ה־URL, בעזרת התחביר המתאים לדפי־משנה.\n* דף זה משתמש בשיטת \"ניתוב התוכן\" (Content negotiation) בהתבסס על כותרת ה־Accept ששולח צד הלקוח. פירוש הדבר הוא שהמידע על הדף יישלח בפורמט שצד הלקוח (כגון דפדפן) מעדיף.",
        "pagedata-not-acceptable": "לא נמצא פורמט נתמך. סוגי MIME נתמכים: $1",
        "pagedata-bad-title": "כותרת בלתי־תקינה: $1.",
-       "unregistered-user-config": "מסיבות אבטחה, לא ניתן לטעון דפי JavaScript‏, CSS ו־JSON בדפי משנה של משתמשים שאינם קיימים."
+       "unregistered-user-config": "מסיבות אבטחה, לא ניתן לטעון דפי JavaScript‏, CSS ו־JSON בדפי משנה של משתמשים שאינם קיימים.",
+       "passwordpolicies": "מדיניות הסיסמאות",
+       "passwordpolicies-summary": "זוהי רשימה של חוקי הסיסמאות שנמצאים בשימוש עבור קבוצות המשתמש שמוגדרות באתר זה.",
+       "passwordpolicies-group": "קבוצה",
+       "passwordpolicies-policies": "מדיניות",
+       "passwordpolicies-policy-minimalpasswordlength": "הסיסמה חייבת להיות באורך של {{PLURAL:$1|תו אחד|$1 תווים}} לפחות",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "הסיסמה חייבת להיות באורך של {{PLURAL:$1|תו אחד|$1 תווים}} לפחות כדי שניתן יהיה להיכנס לחשבון",
+       "passwordpolicies-policy-passwordcannotmatchusername": "הסיסמה לא יכולה להיות זהה לשם המשתמש",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "הסיסמה לא יכולה להתאים לסיסמאות מסוימות שנמצאות ברשימה השחורה",
+       "passwordpolicies-policy-maximalpasswordlength": "הסיסמה חייבת להיות קצרה יותר {{PLURAL:$1|מתו אחד|מ־$1 תווים}}",
+       "passwordpolicies-policy-passwordcannotbepopular": "הסיסמה לא יכולה להיות זהה {{PLURAL:$1|לסיסמה נפוצה|לאחת הסיסמאות שנמצאות ברשימה של $1 הסיסמאות הנפוצות}}"
 }
index da053eb..2bf6fc3 100644 (file)
        "whatlinkshere": "यहाँ क्या जुड़ता है",
        "whatlinkshere-title": "$1 से जुड़े हुए पृष्ठ",
        "whatlinkshere-page": "पृष्ठ:",
-       "linkshere": "नीचे दिये हुए पृष्ठ '''[[:$1]]''' से जुडते हैं:",
-       "nolinkshere": "<strong>[[:$1]]</strong> से कोई भी पन्ना नहीं जुड़ा है।",
-       "nolinkshere-ns": "चुने हुए नामस्थानसे '''[[:$1]]''' को जुडने वाले पृष्ठ नहीं हैं।",
+       "linkshere-2": "नीचे दिये हुए पृष्ठ '''$1''' से जुडते हैं:",
+       "nolinkshere-2": "<strong>$1</strong> से कोई भी पन्ना नहीं जुड़ा है।",
+       "nolinkshere-ns-2": "चुने हुए नामस्थानसे '''$1''' को जुडने वाले पृष्ठ नहीं हैं।",
        "isredirect": "पुनर्निर्देशन पृष्ठ",
        "istemplate": "मिलाईयें",
        "isimage": "फ़ाइल प्रयोग",
index 83ce743..b215c80 100644 (file)
        "whatlinkshere": "Hian konchij jurre hae",
        "whatlinkshere-title": "Panna jon ki $1 se jurre hai",
        "whatlinkshere-page": "Panna:",
-       "linkshere": "Niche waala panna '''[[:$1]]''' se jorre hai:",
-       "nolinkshere": "Koi panna '''[[:$1]]''' ke nai jorre hai.",
-       "nolinkshere-ns": "Chuna gais namespace me koi panna '''[[:$1]]''' se nai jiurre hai.",
+       "linkshere-2": "Niche waala panna '''$1''' se jorre hai:",
+       "nolinkshere-2": "Koi panna '''$1''' ke nai jorre hai.",
+       "nolinkshere-ns-2": "Chuna gais namespace me koi panna '''$1''' se nai jiurre hai.",
        "isredirect": "panna ke redirect karo",
        "istemplate": "milao",
        "isimage": "file ke jorr",
index e0eacc7..7de08f0 100644 (file)
        "whatlinkshere": "Ang nagatabid diri",
        "whatlinkshere-title": "Mga pahina nga naga tabid sa $1",
        "whatlinkshere-page": "Pahina:",
-       "linkshere": "Ang mga sumunod nga pahina ay nagatabid sa '''[[:$1]]''':",
-       "nolinkshere": "Waay panid nga nakasugpon sa '''[[:$1]]'''.",
+       "linkshere-2": "Ang mga sumunod nga pahina ay nagatabid sa '''$1''':",
+       "nolinkshere-2": "Waay panid nga nakasugpon sa '''$1'''.",
        "isredirect": "pahina sa ginadirekta liwat",
        "istemplate": "transklusyon",
        "isimage": "Ang sugpon sang file",
index d629156..5a6f8a7 100644 (file)
        "whatlinkshere": "Što vodi ovamo",
        "whatlinkshere-title": "Stranice koje vode na »$1«",
        "whatlinkshere-page": "Stranica:",
-       "linkshere": "Sljedeće stranice povezuju ovamo ([[:$1]]):",
-       "nolinkshere": "Nijedna stranica ne vodi ovamo (tj. nema poveznica na stranicu [[:$1]]).",
-       "nolinkshere-ns": "Nijedna stranica ne vodi na '''[[:$1]]''' u odabranom imenskom prostoru.",
+       "linkshere-2": "Sljedeće stranice povezuju ovamo ($1):",
+       "nolinkshere-2": "Nijedna stranica ne vodi ovamo (tj. nema poveznica na stranicu $1).",
+       "nolinkshere-ns-2": "Nijedna stranica ne vodi na '''$1''' u odabranom imenskom prostoru.",
        "isredirect": "stranica za preusmjeravanje",
        "istemplate": "kao predložak",
        "isimage": "poveznica na datoteku",
index 0793174..88774fd 100644 (file)
        "whatlinkshere": "Links uff die Seit",
        "whatlinkshere-title": "Seite, die uff \"$1\" verlinke",
        "whatlinkshere-page": "Seit:",
-       "linkshere": "Die follichende Seite verlinke uff '''\"[[:$1]]\"''':",
-       "nolinkshere": "Ken Seit verlinkt uff '''„[[:$1]]“'''.",
-       "nolinkshere-ns": "Ken Seit verlinkt uff '''\"[[:$1]]\"''' im gewählte Noomeraum.",
+       "linkshere-2": "Die follichende Seite verlinke uff '''\"$1\"''':",
+       "nolinkshere-2": "Ken Seit verlinkt uff '''„$1“'''.",
+       "nolinkshere-ns-2": "Ken Seit verlinkt uff '''\"$1\"''' im gewählte Noomeraum.",
        "isredirect": "Weiterleitungsseit",
        "istemplate": "Voarlooche-einbinnunge (transclusões)",
        "isimage": "Dateilink",
        "fileduplicatesearch-noresults": "Do woarde keh Datei mit dem Noome \"$1\" gefunn.",
        "specialpages": "Spezialseite",
        "specialpages-note-top": "Legende",
+       "specialpages-note-restricted": "* Normal Spezialseite.\n* <span class=\"mw-specialpagerestricted\">Spezialseite mit beschränktem Zugang.</span>",
        "specialpages-group-maintenance": "Woortungsliste",
        "specialpages-group-other": "Annre Spezialseite",
        "specialpages-group-login": "Benutzerkonto",
index 652f58e..735e55e 100644 (file)
        "whatlinkshere": "Što wotkazuje sem",
        "whatlinkshere-title": "Strony, kotrež na „$1“ wotkazuja",
        "whatlinkshere-page": "Strona:",
-       "linkshere": "Sćěhowace strony na stronu '''[[:$1]]''' wotkazuja:",
-       "nolinkshere": "Žane strony na '''[[:$1]]''' njewotkazuja.",
-       "nolinkshere-ns": "Žane strony njewotkazuja na '''[[:$1]]''' we wubranym mjenowym rumje.",
+       "linkshere-2": "Sćěhowace strony na stronu '''$1''' wotkazuja:",
+       "nolinkshere-2": "Žane strony na '''$1''' njewotkazuja.",
+       "nolinkshere-ns-2": "Žane strony njewotkazuja na '''$1''' we wubranym mjenowym rumje.",
        "isredirect": "daleposrědkowanje",
        "istemplate": "zapřijeće předłohi",
        "isimage": "Datajowy wotkaz",
        "fileduplicatesearch-noresults": "Žana dataja z mjenom \"$1\" namakana.",
        "specialpages": "Specialne strony",
        "specialpages-note-top": "Legenda",
+       "specialpages-note-restricted": "* Normalne specialne strony.\n* <span class=\"mw-specialpagerestricted\">Specialne strony z wobmjezowanym přistupom.</span>",
        "specialpages-group-maintenance": "Hladanske lisćiny",
        "specialpages-group-other": "Druhe specialne strony",
        "specialpages-group-login": "Přizjewić/Konto załožić",
index 4ce20c8..04d5473 100644 (file)
        "whatlinkshere": "Paj ki gen lyen vè paj sa a",
        "whatlinkshere-title": "Paj ki genyen lyen ki ap mennen nan \"$1\"",
        "whatlinkshere-page": "Paj :",
-       "linkshere": "Paj yo ki anba ap mene nan <b>[[:$1]]</b> :",
-       "nolinkshere": "Pyès paj genyen lyen pou paj sa a <b>[[:$1]]</b>.",
+       "linkshere-2": "Paj yo ki anba ap mene nan <b>$1</b> :",
+       "nolinkshere-2": "Pyès paj genyen lyen pou paj sa a <b>$1</b>.",
        "isredirect": "paj redireksyon",
        "istemplate": "anndan",
        "isimage": "lyen fichye a",
index 804e1ff..d7e6b3d 100644 (file)
        "whatlinkshere": "Mi hivatkozik erre",
        "whatlinkshere-title": "A(z) „$1” lapra hivatkozó lapok",
        "whatlinkshere-page": "Lap:",
-       "linkshere": "Az alábbi lapok hivatkoznak erre: [[:$1]]",
-       "nolinkshere": "[[:$1]]: erre a lapra egyetlen más lap sem hivatkozik.",
-       "nolinkshere-ns": "A kiválasztott névtérben egyetlen oldal sem hivatkozik a(z) '''[[:$1]]''' lapra.",
+       "linkshere-2": "Az alábbi lapok hivatkoznak erre: $1",
+       "nolinkshere-2": "$1: erre a lapra egyetlen más lap sem hivatkozik.",
+       "nolinkshere-ns-2": "A kiválasztott névtérben egyetlen oldal sem hivatkozik a(z) '''$1''' lapra.",
        "isredirect": "átirányítás",
        "istemplate": "beillesztve",
        "isimage": "fájlhivatkozás",
index 19c20ab..9c2d190 100644 (file)
        "whatlinkshere": "Այստեղ հղվող էջերը",
        "whatlinkshere-title": "Էջեր, որոնք հղում են դեպի «$1»",
        "whatlinkshere-page": "Էջ.",
-       "linkshere": "Հետևյալ էջերը հղում են '''[[:$1]]''' էջին.",
-       "nolinkshere": "Ուրիշ էջերից '''[[:$1]]''' էջին հղումներ չկան։",
-       "nolinkshere-ns": "Ընտրված անվանատարածքում '''[[:$1]]''' էջին հղվող էջեր չկան։",
+       "linkshere-2": "Հետևյալ էջերը հղում են '''$1''' էջին.",
+       "nolinkshere-2": "Ուրիշ էջերից '''$1''' էջին հղումներ չկան։",
+       "nolinkshere-ns-2": "Ընտրված անվանատարածքում '''$1''' էջին հղվող էջեր չկան։",
        "isredirect": "վերահղման էջ",
        "istemplate": "ներառում",
        "isimage": "ֆայլի հղում",
        "fileduplicatesearch-result-n": "$1 նիշքն ունի {{PLURAL:$2|1 նույնական կրկնօրինակ|$2 նույնական կրկնօրինակ}}.",
        "fileduplicatesearch-noresults": "$1 անունով նիշք չի գտնվել",
        "specialpages": "Սպասարկող էջեր",
+       "specialpages-note-restricted": "* Հասարակ հատուկ էջեր։\n* <span class=\"mw-specialpagerestricted\">Սահմանափակված հատուկ էջեր։</span>",
        "specialpages-group-maintenance": "Տեխնիկական սպասարկման տեղեկատուներ",
        "specialpages-group-other": "Այլ հատուկ էջեր",
        "specialpages-group-login": "Մտնել / Գրանցվել",
index 0c78329..a0ab8c6 100644 (file)
        "whatlinkshere": "Paginas ligate a iste",
        "whatlinkshere-title": "Paginas con ligamines verso $1",
        "whatlinkshere-page": "Pagina:",
-       "linkshere": "Le sequente paginas contine ligamines a '''[[:$1]]''':",
-       "nolinkshere": "Nulle pagina contine un ligamine verso '''[[:$1]]'''.",
-       "nolinkshere-ns": "Nulle pagina liga a '''[[:$1]]''' in le spatio de nomines seligite.",
+       "linkshere-2": "Le sequente paginas contine ligamines a '''$1''':",
+       "nolinkshere-2": "Nulle pagina contine un ligamine verso '''$1'''.",
+       "nolinkshere-ns-2": "Nulle pagina liga a '''$1''' in le spatio de nomines seligite.",
        "isredirect": "pagina de redirection",
        "istemplate": "transclusion",
        "isimage": "ligamine al file",
index e886852..631fc26 100644 (file)
        "whatlinkshere": "Pranala balik",
        "whatlinkshere-title": "Halaman yang memiliki pranala ke \"$1\"",
        "whatlinkshere-page": "Halaman:",
-       "linkshere": "Halaman-halaman berikut ini memiliki pranala ke '''[[:$1]]''':",
-       "nolinkshere": "Tidak ada halaman yang memiliki pranala ke '''[[:$1]]'''.",
-       "nolinkshere-ns": "Tidak ada halaman yang memiliki pranala ke '''[[:$1]]''' pada ruang nama yang dipilih.",
+       "linkshere-2": "Halaman-halaman berikut ini memiliki pranala ke '''$1''':",
+       "nolinkshere-2": "Tidak ada halaman yang memiliki pranala ke '''$1'''.",
+       "nolinkshere-ns-2": "Tidak ada halaman yang memiliki pranala ke '''$1''' pada ruang nama yang dipilih.",
        "isredirect": "halaman pengalihan",
        "istemplate": "tranklusi",
        "isimage": "pranala berkas",
index 470dac3..e802ab6 100644 (file)
        "whatlinkshere": "Referenties a ti-ci págine",
        "whatlinkshere-title": "Págines quo liga por \"$1\"",
        "whatlinkshere-page": "Págine:",
-       "linkshere": "Li sequent págines liga por '''[[:$1]]''':",
-       "nolinkshere": "Nequant págine liga por '''[[:$1]]'''.",
+       "linkshere-2": "Li sequent págines liga por '''$1''':",
+       "nolinkshere-2": "Nequant págine liga por '''$1'''.",
        "isredirect": "págine de redirecterion",
        "istemplate": "inclusion",
        "isimage": "referentie a un file",
index 2a1d632..d2567cc 100644 (file)
        "november-date": "Ọnwaìrinàotù $1",
        "december-date": "Ọnwaìrinààbụọ",
        "pagecategories": "{{PLURAL:$1|Ụdàkọ}}",
-       "category_header": "Ihü nọr ime ébéonọr \"$1\"",
+       "category_header": "Ihu nà ime ụdàkọ \"$1\"",
        "subcategories": "Ụdàkọòkpurù",
        "category-media-header": "Nka nọr ime ébéonọr \"$1\"",
        "category-empty": "\"Ébéonọr nke enwéghị ihü ma nkà ímé ya.\"",
        "revdelete-log": "Mgbághapụtà:",
        "revdel-restore": "gbanwe ọtù ọ gị zí",
        "pagehist": "Ịta ihüá",
-       "deletedhist": "Ákíkó mbu bakashịrị",
+       "deletedhist": "Ị̀ta kachara",
        "revdelete-reasonotherlist": "Mgbághàpụtá ozor",
        "revdelete-edit-reasonlist": "Rüwa mgbághapụtà nkàchafu",
        "revdelete-offender": "Ọde akwukwo nke orübà:",
        "rcshowhideanons": "$1 ndi ọ'bànifé nke amághị",
        "rcshowhideanons-show": "Zi",
        "rcshowhideanons-hide": "Zònarị",
-       "rcshowhidepatr": "$1 orü hä lèrè",
+       "rcshowhidepatr": "ọrụ h'e lèrè $1",
        "rcshowhidemine": "$1 ihe m rürü",
        "rcshowhidemine-show": "Zi",
        "rcshowhidemine-hide": "Zònarị",
        "filehist-datetime": "Èhì/Ogè",
        "filehist-thumb": "Mbọ-aka",
        "filehist-thumbtext": "NvóÁká màkà otù ȯ dị nà $1",
-       "filehist-nothumb": "Nvọáká adịghị",
+       "filehist-nothumb": "Mbọaka adhịghị̀",
        "filehist-user": "Òjìème",
        "filehist-dimensions": "Ógólógó na asaá",
        "filehist-filesize": "Ívù usòrò",
        "allinnamespace": "Ihü níle (ámááhạ $1)",
        "allpagessubmit": "Gá",
        "categories": "Ụdàkọ",
-       "sp-deletedcontributions-contribs": "ihe rürü di mkpa",
+       "sp-deletedcontributions-contribs": "mmètàrà",
        "linksearch": "Òtú jikodo di èzí",
        "linksearch-ns": "Ahàm̀bara:",
        "linksearch-ok": "Tùwe",
        "blanknamespace": "(Ḿkpà)",
        "contributions": "Ihe ọ'bànifé rürü",
        "contributions-title": "Orü ọ'bànifé nà $1",
-       "mycontris": "Ihem mẹtụrụ na orürü",
+       "mycontris": "Ịhem mètàrà",
+       "anoncontribs": "Mmètàrà",
        "contribsub2": "Maka $1 ($2)",
        "uctop": "(dị ùgbu â)",
        "month": "Shi önwa (na nke ndi mbu):",
        "whatlinkshere": "Ihe na bia nga",
        "whatlinkshere-title": "Ihü ná gá \"$1\" shí jikodo",
        "whatlinkshere-page": "Ihü:",
-       "linkshere": "Ihüá na gá '''[[:$1]]''':",
-       "nolinkshere": "Ọ díghị ihü na jikodo gá '''[[:$1]]'''.",
-       "nolinkshere-ns": "Ọ díghị ihü na jikodo gá '''[[:$1]]''' na áhàámá nke Í chọrọ.",
+       "linkshere-2": "Ihüá na gá '''$1''':",
+       "nolinkshere-2": "Ọ díghị ihü na jikodo gá '''$1'''.",
+       "nolinkshere-ns-2": "Ọ díghị ihü na jikodo gá '''$1''' na áhàámá nke Í chọrọ.",
        "isredirect": "ihü nke nkúfù",
        "istemplate": "ọ jè ákwúkwó usòrò",
        "isimage": "jikodo nnunuuche",
        "blocklink": "mèché",
        "unblocklink": "a kwadokwàlà",
        "change-blocklink": "gbanwe ngwùgwù",
-       "contribslink": "ọrụrụ",
+       "contribslink": "mètàrà",
        "blocklogpage": "Ndetù échìchè nke mbàchì",
        "blocklogentry": "kwụchi [[$1]] jí ógè ne $2 $3",
        "unblocklogentry": "àkwáchị gị $1",
        "tooltip-pt-mytalk": "Ihü akíkó gi",
        "tooltip-pt-preferences": "Ndoziri {{GENDER:|gị}}",
        "tooltip-pt-watchlist": "Ndetu ihü Í ne lé màkà ihe gị gbanwe",
-       "tooltip-pt-mycontris": "Ndetù ihe Í rürü",
+       "tooltip-pt-mycontris": "Ndetù màkà ihe {{GENDER:|ị}} mètàrà",
        "tooltip-pt-login": "Anyi si ka Í gbanyé; chetákwá na nsogbu adighi I gbanye ma Í chógị gbànyé",
        "tooltip-pt-logout": "Fwuör",
        "tooltip-ca-talk": "Akíkó maka ihe di na ihü nka",
        "tooltip-ca-nstab-image": "Zi ihü usòrò",
        "tooltip-ca-nstab-template": "Zi mkpurụ ihü",
        "tooltip-ca-nstab-help": "Zi ihü nkwádo",
-       "tooltip-ca-nstab-category": "Zi ihü ébéanọr",
+       "tooltip-ca-nstab-category": "Zi ihu ụdàkọ",
        "tooltip-minoredit": "Ká nke kà orü ntàkírí",
        "tooltip-save": "Domá ihe í gbanwere",
        "tooltip-preview": "Lètú ihe Í gbànwèrè, bíkó búzọr jí ihe á mgbe Í gi dọnyé!",
        "confirm-unwatch-button": "Ngwanu",
        "imgmultipageprev": "ihü na àzú",
        "imgmultipagenext": "ihü nke di nso →",
-       "imgmultigo": "Gá!",
+       "imgmultigo": "Gàa!",
        "imgmultigoto": "Gá na ihü $1",
        "ascending_abbrev": "heé élu",
        "descending_abbrev": "ndạtạ",
index 10b5e9d..4775c24 100644 (file)
        "whatlinkshere": "Dagiti nakasilpo ditoy",
        "whatlinkshere-title": "Pampanid a nakasilpo iti \"$1\"",
        "whatlinkshere-page": "Panid:",
-       "linkshere": "Dagiti sumaganad a panid ket nakasilpo iti <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Awan ti pampanid a nakasilpo iti <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "Awan ti pampanid a nakasilpo iti <strong>[[:$1]]</strong> iti napili a nagan ti espasio.",
+       "linkshere-2": "Dagiti sumaganad a panid ket nakasilpo iti <strong>$1</strong>:",
+       "nolinkshere-2": "Awan ti pampanid a nakasilpo iti <strong>$1</strong>.",
+       "nolinkshere-ns-2": "Awan ti pampanid a nakasilpo iti <strong>$1</strong> iti napili a nagan ti espasio.",
        "isredirect": "baw-ing a panid",
        "istemplate": "mailak-am",
        "isimage": "silpo ti papeles",
index 126ac40..cdd4758 100644 (file)
        "whatlinkshere": "Тӏатовжамаш укхаза",
        "whatlinkshere-title": "«$1» яхача оагӏонна тӏатовжаш йола оагӏонаш",
        "whatlinkshere-page": "ОагIув:",
-       "linkshere": "«'''[[:$1]]'''» ← укхунна тӀахьожавеш я тӀехьайоагӀа оагӀонаш:",
-       "nolinkshere": "Кхыйолча оагӏонашкара '''[[:$1]]''' яхача оагӏон тIатовжамаш доацаш да.",
+       "linkshere-2": "«'''$1'''» ← укхунна тӀахьожавеш я тӀехьайоагӀа оагӀонаш:",
+       "nolinkshere-2": "Кхыйолча оагӏонашкара '''$1''' яхача оагӏон тIатовжамаш доацаш да.",
        "isredirect": "дIа-хьа хьожавара оагIув",
        "istemplate": "юкъейоалаяр",
        "isimage": "Файлови тӏатовжам",
index eb097e6..e99c976 100644 (file)
        "whatlinkshere": "Quo ligesas adhike",
        "whatlinkshere-title": "Pagini qui ligas ad \"$1\"",
        "whatlinkshere-page": "Pagino:",
-       "linkshere": "Ca pagini esas ligilizita ad '''[[:$1]]''':",
-       "nolinkshere": "Nula pagino ligas ad '''[[:$1]]'''.",
+       "linkshere-2": "Ca pagini esas ligilizita ad '''$1''':",
+       "nolinkshere-2": "Nula pagino ligas ad '''$1'''.",
        "isredirect": "ridirektanta pagino",
        "istemplate": "inkluzo",
        "isimage": "arkivo-ligilo",
index d39a413..47cd5be 100644 (file)
        "whatlinkshere": "Hvað tengist hingað",
        "whatlinkshere-title": "Síður sem tengjast „$1“",
        "whatlinkshere-page": "Síða:",
-       "linkshere": "Eftirfarandi síður tengjast á '''[[:$1]]''':",
-       "nolinkshere": "Engar síður tengjast á '''[[:$1]]'''.",
-       "nolinkshere-ns": "Engar síður tengjast '''[[:$1]]''' í þessu nafnrými.",
+       "linkshere-2": "Eftirfarandi síður tengjast á '''$1''':",
+       "nolinkshere-2": "Engar síður tengjast á '''$1'''.",
+       "nolinkshere-ns-2": "Engar síður tengjast '''$1''' í þessu nafnrými.",
        "isredirect": "endurbeind síða",
        "istemplate": "innifalið",
        "isimage": "skráartengill",
        "fileduplicatesearch-noresults": "Mistókst að finna skrána \"$1\"",
        "specialpages": "Kerfissíður",
        "specialpages-note-top": "Fyrirsögn",
+       "specialpages-note-restricted": "* Venjulegar kerfissíður.\n* <span class=\"mw-specialpagerestricted\">Kerfissíður með takmörkuðum aðgangi.</span>",
        "specialpages-group-maintenance": "Viðhaldsskýrslur",
        "specialpages-group-other": "Aðrar kerfissíður",
        "specialpages-group-login": "Skrá inn / Búa til aðgang",
index 4a87f08..db5d32a 100644 (file)
        "whatlinkshere": "Puntano qui",
        "whatlinkshere-title": "Pagine che puntano a \"$1\"",
        "whatlinkshere-page": "Pagina:",
-       "linkshere": "Le seguenti pagine contengono dei collegamenti a <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Nessuna pagina contiene collegamenti che puntano a '''[[:$1]]'''.",
-       "nolinkshere-ns": "Non vi sono pagine che puntano a '''[[:$1]]''' nel namespace selezionato.",
+       "linkshere-2": "Le seguenti pagine contengono dei collegamenti a <strong>$1</strong>:",
+       "nolinkshere-2": "Nessuna pagina contiene collegamenti che puntano a '''$1'''.",
+       "nolinkshere-ns-2": "Non vi sono pagine che puntano a '''$1''' nel namespace selezionato.",
        "isredirect": "redirect",
        "istemplate": "inclusione",
        "isimage": "collegamento al file",
index 321c4eb..2c02c2a 100644 (file)
        "whatlinkshere": "リンク元",
        "whatlinkshere-title": "「$1」へリンクしているページ",
        "whatlinkshere-page": "ページ:",
-       "linkshere": "以下のページが、<strong>[[:$1]]</strong> にリンクしています:",
-       "nolinkshere": "<strong>[[:$1]]</strong> にリンクしているページはありません。",
-       "nolinkshere-ns": "指定した名前空間内に、<strong>[[:$1]]</strong> にリンクしているページはありません。",
+       "linkshere-2": "以下のページが、<strong>$1</strong> にリンクしています:",
+       "nolinkshere-2": "<strong>$1</strong> にリンクしているページはありません。",
+       "nolinkshere-ns-2": "指定した名前空間内に、<strong>$1</strong> にリンクしているページはありません。",
        "isredirect": "転送ページ",
        "istemplate": "参照読み込み",
        "isimage": "ファイルへのリンク",
index 198dd1d..79354d1 100644 (file)
        "whatlinkshere": "Wa lingk ya",
        "whatlinkshere-title": "Piej wa lingk tu \"$1\"",
        "whatlinkshere-page": "Piej:",
-       "linkshere": "Di falarin piejdem lingk tu '''[[:$1]]''':",
+       "linkshere-2": "Di falarin piejdem lingk tu '''$1''':",
        "isredirect": "riidirek piej",
        "istemplate": "chranskluujan",
        "isimage": "fail lingk",
index 82ace80..ae892bd 100644 (file)
        "whatlinkshere": "Hwa henwise hertil",
        "whatlinkshere-title": "Side som linke te $1",
        "whatlinkshere-page": "Siid:",
-       "linkshere": "Di följenje side henwise te '''„[[:$1]]“''':",
-       "nolinkshere": "Ien side henwise te '''„[[:$1]]“'''.",
+       "linkshere-2": "Di följenje side henwise te '''„$1“''':",
+       "nolinkshere-2": "Ien side henwise te '''„$1“'''.",
        "isredirect": "omdirigiirengssiid",
        "istemplate": "inlejreng",
        "isimage": "filhenwisneng",
index f4aa034..6ee482f 100644 (file)
        "whatlinkshere": "Sing nggayut mréné",
        "whatlinkshere-title": "Kaca mawa pranala nggayut \"$1\"",
        "whatlinkshere-page": "Kaca:",
-       "linkshere": "Kaca-kaca ing ngisor iki nggayut menyang <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Ora ana kaca sing nduwé pranala menyang '''[[:$1]]'''.",
-       "nolinkshere-ns": " Ora ana kaca sing nduwé pranala menyang '''[[:$1]]''' ing bilik jeneng sing kapilih.",
+       "linkshere-2": "Kaca-kaca ing ngisor iki nggayut menyang <strong>$1</strong>:",
+       "nolinkshere-2": "Ora ana kaca sing nduwé pranala menyang '''$1'''.",
+       "nolinkshere-ns-2": " Ora ana kaca sing nduwé pranala menyang '''$1''' ing bilik jeneng sing kapilih.",
        "isredirect": "kaca lih-lihan",
        "istemplate": "tranklusi",
        "isimage": "pranala barkas",
        "fileduplicatesearch-noresults": "Ora tinemu barkas kanthi jeneng \"$1\".",
        "specialpages": "Kaca mirunggan",
        "specialpages-note-top": "Katrangan",
+       "specialpages-note-restricted": "* Kaca mirunggan sedhengan.\n* <span class=\"mw-specialpagerestricted\">Kaca mirunggan winatesan.</span>",
        "specialpages-group-maintenance": "Lapuran pangopèn",
        "specialpages-group-other": "Kaca mirunggan liyané",
        "specialpages-group-login": "Mlebu log / nggawé akun",
index a942a6b..13a59f8 100644 (file)
        "whatlinkshere": "ბმული გვერდზე",
        "whatlinkshere-title": "გვერდები, რომლებიც შეიცავენ „$1“-ის ბმულებს",
        "whatlinkshere-page": "გვერდი:",
-       "linkshere": "მომდევნო გვერდები შეიცავენ ბმულებს '''[[:$1]]'''-ზე:",
-       "nolinkshere": "'''[[:$1]]'''-ზე ბმული არ არის.",
-       "nolinkshere-ns": "არჩეულ სახელთა სივრცეში არ არის გვერდები, რომლებიც მისამართდება '''[[:$1]]'''.",
+       "linkshere-2": "მომდევნო გვერდები შეიცავენ ბმულებს '''$1'''-ზე:",
+       "nolinkshere-2": "'''$1'''-ზე ბმული არ არის.",
+       "nolinkshere-ns-2": "არჩეულ სახელთა სივრცეში არ არის გვერდები, რომლებიც მისამართდება '''$1'''.",
        "isredirect": "გადამისამართების გვერდი",
        "istemplate": "ჩართვა",
        "isimage": "ბმული ფაილზე",
index 58fa884..e29c671 100644 (file)
        "whatlinkshere": "Siltelgen betler",
        "whatlinkshere-title": "\"$1\" betine siltelgen betler",
        "whatlinkshere-page": "Bet:",
-       "linkshere": "To'mendegi betler mınag'an siltelgen: '''[[:$1]]''':",
-       "nolinkshere": "'''[[:$1]]''' degenge hesh bet siltemeydi.",
+       "linkshere-2": "To'mendegi betler mınag'an siltelgen: '''$1''':",
+       "nolinkshere-2": "'''$1''' degenge hesh bet siltemeydi.",
        "isredirect": "burıwshı bet",
        "istemplate": "qosıw",
        "isimage": "fayl siltewi",
index a2b120d..385687b 100644 (file)
        "whatlinkshere": "Ayen i d-yettawi ɣer da",
        "whatlinkshere-title": "Isebtaren i sɛan azday ɣer « $1 »",
        "whatlinkshere-page": "Asebter :",
-       "linkshere": "Isebtar-agi sɛan azday ɣer '''[[:$1]]''':",
-       "nolinkshere": "Ulac asebter i yesɛan azday ɣer '''[[:$1]]'''.",
-       "nolinkshere-ns": "Ulac asebter i yesɛan azday ɣer '''[[:$1]]''' deg yisem n taɣult i textareḍ.",
+       "linkshere-2": "Isebtar-agi sɛan azday ɣer '''$1''':",
+       "nolinkshere-2": "Ulac asebter i yesɛan azday ɣer '''$1'''.",
+       "nolinkshere-ns-2": "Ulac asebter i yesɛan azday ɣer '''$1''' deg yisem n taɣult i textareḍ.",
        "isredirect": "Asebter n usemmimeḍ",
        "istemplate": "asekcam",
        "isimage": "azday ɣer afaylu",
        "fileduplicatesearch-noresults": "Ulac afaylu s isem « $1 ».",
        "specialpages": "isebtar usligen",
        "specialpages-note-top": "Aglam",
+       "specialpages-note-restricted": "* Isebtar usligen imugna.\n* <span class=\"mw-specialpagerestricted\">Isebtar usligen ukrifen.</span>",
        "specialpages-group-maintenance": "Iṛabulen n ibeddi",
        "specialpages-group-other": "Isebtar usligen nniḍen",
        "specialpages-group-login": "Asulu / assiggez",
index d21be5a..5e14d55 100644 (file)
        "whatlinkshere": "ТехьэпӀэхэр мыбдеж",
        "whatlinkshere-title": "«$1» техьэ напэкІуэцІхэр",
        "whatlinkshere-page": "НапэкIуэцI:",
-       "linkshere": "Мыбым '''[[:$1]]'''  тохьэ напэкӀуэцӀхэр:",
+       "linkshere-2": "Мыбым '''$1'''  тохьэ напэкӀуэцӀхэр:",
        "isredirect": "напэкIуэцI-егъэкIуэкIа",
        "istemplate": "хэгъэхьэныгъэ",
        "isimage": "сурэтым и техьэпӀэ",
index 7705d89..09db309 100644 (file)
        "whatlinkshere": "Takayɩhatʋ kɩtamtʋ",
        "whatlinkshere-title": "Takayɩhatʋ ndʋ tɩtamsɩna \\ $1 \\ yɔ",
        "whatlinkshere-page": "Takayɩhayʋʋ :",
-       "linkshere": "Takayɩhatʋ ndʋ tɩwɛ pɩ-tɛɛ yɔ tɩwɛna kpasɩ <strong>[[:$1]]<strong> yɔɔ:",
+       "linkshere-2": "Takayɩhatʋ ndʋ tɩwɛ pɩ-tɛɛ yɔ tɩwɛna kpasɩ <strong>$1<strong> yɔɔ:",
        "isredirect": "Kɩpɩsɩnaʋ takayɩhayʋʋ",
        "istemplate": "tɛɣʋ",
        "isimage": "takayaɣ yɔɔ kpayaɣ",
index bdcd3b8..637b2ae 100644 (file)
        "whatlinkshere": "ھیارا کیہ کیہ لنک شینی",
        "whatlinkshere-title": "لنک شدہ صفحات \"$1\"",
        "whatlinkshere-page": " صفحہ:",
-       "linkshere": " '''[[:$1]]''' درج ذیل صفحات لنک کوری شینی:",
-       "nolinkshere": "'''[[:$1]]''' کیہ روابط نیکی",
+       "linkshere-2": " '''$1''' درج ذیل صفحات لنک کوری شینی:",
+       "nolinkshere-2": "'''$1''' کیہ روابط نیکی",
        "isredirect": "خور ژاغا آلدو صفحہ",
        "istemplate": "ٹرانسکلوژن",
        "isimage": "ھوٹوان لنک",
index 02fb2a5..0c63995 100644 (file)
        "whatlinkshere": "Çı itay rê gırê beno",
        "whatlinkshere-title": "Pelê ke be \"$1\"i bestninê pa",
        "whatlinkshere-page": "Pele:",
-       "linkshere": "Ni pelgi '''[[:$1]]'''i asnenê:",
-       "nolinkshere": "Pelgê ke '''[[:$1]]'''i asnenê çinê.",
+       "linkshere-2": "Ni pelgi '''$1'''i asnenê:",
+       "nolinkshere-2": "Pelgê ke '''$1'''i asnenê çinê.",
        "isredirect": "pela ciheti",
        "istemplate": "ilawekerdis",
        "isimage": "girê dosya",
        "duplicate-defaultsort": "'''Teme:''' Tuşê default sort \"$2\" sero tuşê default sort \"$1\"î ra şino.",
        "fileduplicatesearch-filename": "Namê dosya:",
        "specialpages": "Pelê xaşi",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* Pelê xususiyê normali.\n* <span class=\"mw-specialpagerestricted\">Pelê xususiyê mehcuri.</span>",
        "specialpages-group-maintenance": "Tebliğê baxımi",
        "specialpages-group-other": "Pelê xususiyê bini",
        "specialpages-group-login": "Cıkotene / qeyd",
index 642ad37..9abef1f 100644 (file)
        "whatlinkshere": "سىلتەلگەن بەتتەر",
        "whatlinkshere-title": "$1 دەگەنگە سىلتەلگەن بەتتەر",
        "whatlinkshere-page": "بەت:",
-       "linkshere": "'''[[:$1]]''' دەگەنگە مىنا بەتتەر سىلتەيدى:",
-       "nolinkshere": "'''[[:$1]]''' دەگەنگە ەش بەت سىلتەمەيدى.",
-       "nolinkshere-ns": "تاڭدالعان ەسىم اياسىندا '''[[:$1]]''' دەگەنگە ەشقانداي بەت سىلتەمەيدى.",
+       "linkshere-2": "'''$1''' دەگەنگە مىنا بەتتەر سىلتەيدى:",
+       "nolinkshere-2": "'''$1''' دەگەنگە ەش بەت سىلتەمەيدى.",
+       "nolinkshere-ns-2": "تاڭدالعان ەسىم اياسىندا '''$1''' دەگەنگە ەشقانداي بەت سىلتەمەيدى.",
        "isredirect": "ايداتۋ بەتى",
        "istemplate": "كىرىكبەت",
        "isimage": "سۋرەت سىلتەمەسى",
        "fileduplicatesearch-result-1": "«$1» فايلىنا تەڭ تەلنۇسقاسى جوق.",
        "fileduplicatesearch-result-n": "«$1» فايلىنا تەڭ $2 تەلنۇسقاسى بار.",
        "specialpages": "ارنايى بەتتەر",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* كادىمگى ارنايى بەتتەر.\n* <strong class=\"mw-specialpagerestricted\">شەكتەلگەن ارنايى بەتتەر.</strong>",
        "specialpages-group-maintenance": "باپتاۋ باياناتتارى",
        "specialpages-group-other": "تاعى باسقا ارنايى بەتتەر",
        "specialpages-group-login": "كىرۋ / تىركەلۋ",
index 47431bc..28d497c 100644 (file)
        "whatlinkshere": "Мұнда сілтейтін беттер",
        "whatlinkshere-title": "$1 дегенге сілтейтін беттер",
        "whatlinkshere-page": "Бет:",
-       "linkshere": "'''[[:$1]]''' дегенге мына беттер сілтейді:",
-       "nolinkshere": "'''[[:$1]]''' дегенге еш бет сілтемейді.",
-       "nolinkshere-ns": "Таңдалған есім кеңістігінде '''[[:$1]]''' дегенге ешқандай бет сілтемейді.",
+       "linkshere-2": "'''$1''' дегенге мына беттер сілтейді:",
+       "nolinkshere-2": "'''$1''' дегенге еш бет сілтемейді.",
+       "nolinkshere-ns-2": "Таңдалған есім кеңістігінде '''$1''' дегенге ешқандай бет сілтемейді.",
        "isredirect": "бағыттау беті",
        "istemplate": "кіріcтірілген",
        "isimage": "файл сілтемесі",
        "fileduplicatesearch-noresults": "\"$1\" атауымен файл табылмады.",
        "specialpages": "Арнайы беттер",
        "specialpages-note-top": "Шартты белгілер",
+       "specialpages-note-restricted": "* Қалыпты арнайы беттер. \n* <span class=\"mw-specialpagerestricted\">Шектелген арнайы беттер.</span>",
        "specialpages-group-maintenance": "Техникалық талқылау есептері",
        "specialpages-group-other": "Тағы басқа арнайы беттер",
        "specialpages-group-login": "Кіру / тіркелу",
index 393d138..3450cd4 100644 (file)
        "whatlinkshere": "Mında silteýtin better",
        "whatlinkshere-title": "$1 degenge silteýtin better",
        "whatlinkshere-page": "Bet:",
-       "linkshere": "'''[[:$1]]''' degenge mına better silteýdi:",
-       "nolinkshere": "'''[[:$1]]''' degenge eş bet siltemeýdi.",
-       "nolinkshere-ns": "Tañdalğan esim ayasında '''[[:$1]]''' degenge eşqandaý bet siltemeýdi.",
+       "linkshere-2": "'''$1''' degenge mına better silteýdi:",
+       "nolinkshere-2": "'''$1''' degenge eş bet siltemeýdi.",
+       "nolinkshere-ns-2": "Tañdalğan esim ayasında '''$1''' degenge eşqandaý bet siltemeýdi.",
        "isredirect": "aýdatw beti",
        "istemplate": "kirikbet",
        "isimage": "swret siltemesi",
        "fileduplicatesearch-result-1": "«$1» faýlına teñ telnusqası joq.",
        "fileduplicatesearch-result-n": "«$1» faýlına teñ $2 telnusqası bar.",
        "specialpages": "Arnaýı better",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* Kädimgi arnaýı better.\n* <strong class=\"mw-specialpagerestricted\">Şektelgen arnaýı better.</strong>",
        "specialpages-group-maintenance": "Baptaw bayanattarı",
        "specialpages-group-other": "Tağı basqa arnaýı better",
        "specialpages-group-login": "Kirw / tirkelw",
index 3692ed9..11c13cc 100644 (file)
        "whatlinkshere": "អ្វី​ដែលភ្ជាប់មកទីនេះ",
        "whatlinkshere-title": "ទំព័រនានាដែល​តភ្ជាប់​ទៅ \"$1\"",
        "whatlinkshere-page": "ទំព័រ៖",
-       "linkshere": "ទំព័រដូចតទៅ​នេះតភ្ជាប់មក '''[[:$1]]''' ៖",
-       "nolinkshere": "គ្មានទំព័រណាមួយតភ្ជាប់ទៅ '''[[:$1]]''' ទេ។",
-       "nolinkshere-ns": "គ្មានទំព័រណាមួយតភ្ជាប់ទៅ '''[[:$1]]''' ក្នុងប្រភេទដែលបានជ្រើសរើស។",
+       "linkshere-2": "ទំព័រដូចតទៅ​នេះតភ្ជាប់មក '''$1''' ៖",
+       "nolinkshere-2": "គ្មានទំព័រណាមួយតភ្ជាប់ទៅ '''$1''' ទេ។",
+       "nolinkshere-ns-2": "គ្មានទំព័រណាមួយតភ្ជាប់ទៅ '''$1''' ក្នុងប្រភេទដែលបានជ្រើសរើស។",
        "isredirect": "ទំព័របញ្ជូនបន្ត",
        "istemplate": "ការដាក់បញ្ចូល",
        "isimage": "តំណភ្ជាប់ឯកសារ",
        "fileduplicatesearch-noresults": "រកមិនឃើញឯកសារដែលមានឈ្មោះ \"$1\" ទេ។",
        "specialpages": "ទំព័រ​ពិសេស​ៗ",
        "specialpages-note-top": "កំណត់សម្គាល់",
+       "specialpages-note-restricted": "* ទំព័រពិសេសៗធម្មតា។\n* <span class=\"mw-specialpagerestricted\">ទំព័រពិសេសៗដែលមានការដាក់កំហិត។</span>",
        "specialpages-group-maintenance": "របាយការណ៍នានាអំពីតំហែទាំ",
        "specialpages-group-other": "ទំព័រពិសេសៗផ្សេងៗទៀត",
        "specialpages-group-login": "កត់ឈ្មោះចូល / បង្កើតគណនី",
index 5dc544e..6017c32 100644 (file)
        "whatlinkshere": "ಇಲ್ಲಿಗೆ ಯಾವ ಸಂಪರ್ಕ ಕೂಡುತ್ತದೆ",
        "whatlinkshere-title": "\"$1\" ಪುಟಕ್ಕೆ ಸಂಪರ್ಕ ಹೊಂದಿರುವ ಪುಟಗಳು",
        "whatlinkshere-page": "ಪುಟ:",
-       "linkshere": "'''[[:$1]]'''ಗೆ ಈ ಪುಟಗಳು ಸಂಪರ್ಕ ಹೊಂದಿವೆ:",
-       "nolinkshere": "'''[[:$1]]''' ಗೆ ಯಾವ ಪುಟಗಳೂ ಸಂಪರ್ಕ ಹೊಂದಿಲ್ಲ.",
-       "nolinkshere-ns": "ಆಯ್ಕೆ ಮಾಡಿದ ಪುಟಪ್ರಬೇಧದಲ್ಲಿ ಯಾವ ಪುಟವೂ '''[[:$1]]''' ಅಲ್ಲಿಗೆ ಸಂಪರ್ಕ ಹೊಂದಿಲ್ಲ.",
+       "linkshere-2": "'''$1'''ಗೆ ಈ ಪುಟಗಳು ಸಂಪರ್ಕ ಹೊಂದಿವೆ:",
+       "nolinkshere-2": "'''$1''' ಗೆ ಯಾವ ಪುಟಗಳೂ ಸಂಪರ್ಕ ಹೊಂದಿಲ್ಲ.",
+       "nolinkshere-ns-2": "ಆಯ್ಕೆ ಮಾಡಿದ ಪುಟಪ್ರಬೇಧದಲ್ಲಿ ಯಾವ ಪುಟವೂ '''$1''' ಅಲ್ಲಿಗೆ ಸಂಪರ್ಕ ಹೊಂದಿಲ್ಲ.",
        "isredirect": "ಪುನರ್ನಿರ್ದೇಶನ ಪುಟ",
        "istemplate": "ಸೇರ್ಪಡೆ",
        "isimage": "ಚಿತ್ರಕ್ಕೆ ಕೊಂಡಿ",
index 09164d8..8a2fd8a 100644 (file)
        "protectedtitles-submit": "제목 표시",
        "listusers": "사용자 목록",
        "listusers-editsonly": "기여가 있는 사용자만 보기",
+       "listusers-temporarygroupsonly": "임시 사용자 그룹의 사용자만 표시",
        "listusers-creationsort": "계정을 만든 날짜순으로 정렬",
        "listusers-desc": "내림차순으로 정렬",
        "usereditcount": "{{PLURAL:$1|편집}} $1회",
        "whatlinkshere": "여기를 가리키는 문서",
        "whatlinkshere-title": "\"$1\" 문서를 가리키는 문서 목록",
        "whatlinkshere-page": "문서:",
-       "linkshere": "다음 문서가 '''[[:$1]]''' 문서를 가리키고 있습니다:",
-       "nolinkshere": "'''[[:$1]]''' 문서를 가리키는 문서가 없습니다.",
-       "nolinkshere-ns": "선택한 이름공간에는 '''[[:$1]]''' 문서를 가리키는 문서가 없습니다.",
+       "linkshere-2": "다음 문서가 '''$1''' 문서를 가리키고 있습니다:",
+       "nolinkshere-2": "'''$1''' 문서를 가리키는 문서가 없습니다.",
+       "nolinkshere-ns-2": "선택한 이름공간에는 '''$1''' 문서를 가리키는 문서가 없습니다.",
        "isredirect": "넘겨주기 문서",
        "istemplate": "끼워넣기",
        "isimage": "연결된 파일",
index 4944409..5cc99c4 100644 (file)
        "whatlinkshere": "Бетге джибериуле",
        "whatlinkshere-title": "«$1» бетге джиберген бетле",
        "whatlinkshere-page": "Бет:",
-       "linkshere": "'''[[:$1]]''' битге джиберген бетле:",
-       "nolinkshere": "'''[[:$1]]'' бетге башха бетле джибермейдиле.",
-       "nolinkshere-ns": "Сайланнган атла аламда '''[[:$1]]''' бетге джиберген бет джокъду.",
+       "linkshere-2": "'''$1''' битге джиберген бетле:",
+       "nolinkshere-2": "'''$1'' бетге башха бетле джибермейдиле.",
+       "nolinkshere-ns-2": "Сайланнган атла аламда '''$1''' бетге джиберген бет джокъду.",
        "isredirect": "джибериу бет",
        "istemplate": "къошуу",
        "isimage": "файлгъа джибериу",
        "fileduplicatesearch-result-n": "«$1» файлны {{PLURAL:$2|1 келишген дубликаты|$2 келишген дубликаты}} барды.",
        "fileduplicatesearch-noresults": "«$1» деген файл табылмады.",
        "specialpages": "Къуллукъ бетле",
+       "specialpages-note-restricted": "* Тюз къуллукъ бетле.\n* <span class=\"mw-specialpagerestricted\">Кирирге эркинлик чекленнген къуллукъ бетле.</span>",
        "specialpages-group-maintenance": "Техника баджарыуну отчетлары",
        "specialpages-group-other": "Башха къуллукъ бетле",
        "specialpages-group-login": "Системагъа кириу / Аккаунт къурау",
index 53ba8e9..b00dfbe 100644 (file)
        "whatlinkshere": "Linkit tänne",
        "whatlinkshere-title": "Šivut, kumpaset viitatah šivulla \"$1\"",
        "whatlinkshere-page": "Šivu:",
-       "linkshere": "Šeuruavilta šivuilta on linkki šivulla <strong>[[:$1]]</strong>:",
+       "linkshere-2": "Šeuruavilta šivuilta on linkki šivulla <strong>$1</strong>:",
        "isredirect": "ohjauššivu",
        "istemplate": "šisällytetty",
        "isimage": "failin linkki",
index 9f5d0c6..52ad3d1 100644 (file)
        "whatlinkshere": "Wat noh heh link",
        "whatlinkshere-title": "Sigge, woh Lengks op „$1“ dren sen",
        "whatlinkshere-page": "Sigg:",
-       "linkshere": "Dat sin de Sigge, di op <strong>„[[:$1]]“</strong> lengke donn:",
-       "nolinkshere": "Kein Sigg link noh <strong>„[[:$1]]“</strong>.",
-       "nolinkshere-ns": "Nix link op <strong>„[[:$1]]“</strong> en dämm Appachtemang.",
+       "linkshere-2": "Dat sin de Sigge, di op <strong>„$1“</strong> lengke donn:",
+       "nolinkshere-2": "Kein Sigg link noh <strong>„$1“</strong>.",
+       "nolinkshere-ns-2": "Nix link op <strong>„$1“</strong> en dämm Appachtemang.",
        "isredirect": "Ömleidongssigg",
        "istemplate": "weed enjeföch",
        "isimage": "weed aanjezeisch",
        "fileduplicatesearch-noresults": "Mer han kein Dattei met däm Name „$1“ jefonge.",
        "specialpages": "{{int:nstab-special}}e",
        "specialpages-note-top": "Lejänd",
+       "specialpages-note-restricted": "* Jewöhnlejje {{int:nstab-special}}e för jede Metmaacher.\n* <span class=\"mw-specialpagerestricted\">{{int:nstab-special}}e bloß för Metmaacher met besönder Räächde.</span>",
        "specialpages-group-maintenance": "Waadungsleste",
        "specialpages-group-other": "Ander {{int:nstab-special}}e",
        "specialpages-group-login": "Enlogge udder Aanmälde",
index be47741..0f9b4c7 100644 (file)
        "whatlinkshere": "Girêdanên li ser vê rûpelê",
        "whatlinkshere-title": "Rûpelên ku yê berve \"$1\" tên",
        "whatlinkshere-page": "Rûpel:",
-       "linkshere": "Ev rûpel tên ser vê rûpelê '''[[:$1]]''':",
-       "nolinkshere": "Ne ji rûpelekê lînk tên ser '''[[:$1]]'''.",
-       "nolinkshere-ns": "Ne lînkek berve '''[[:$1]]''' di vê namespace'a da tê.",
+       "linkshere-2": "Ev rûpel tên ser vê rûpelê '''$1''':",
+       "nolinkshere-2": "Ne ji rûpelekê lînk tên ser '''$1'''.",
+       "nolinkshere-ns-2": "Ne lînkek berve '''$1''' di vê namespace'a da tê.",
        "isredirect": "rûpelê beralî bike",
        "istemplate": "tê bikaranîn",
        "isimage": "girêdana wêneyî",
        "fileduplicatesearch-filename": "Navê dosyeyê:",
        "fileduplicatesearch-submit": "Lê bigere",
        "specialpages": "Rûpelên taybet",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* Rûpelên taybetî ji her kesan ra\n* <strong class=\"mw-specialpagerestricted\">Rûpelên taybetî ji bikarhêneran bi mafên zêdetir ra</strong>",
        "specialpages-group-other": "Rûpelên taybetî yên din",
        "specialpages-group-login": "Têkeve / hesabekî nû çêke",
        "specialpages-group-changes": "Guherandinên dawî û têketin",
index ef6e8ab..8188df5 100644 (file)
        "whatlinkshere": "Мунда байланылгъан",
        "whatlinkshere-title": "\"$1\" бетге байлангъан сагьифалар",
        "whatlinkshere-page": "Сагьифа:",
-       "linkshere": "Гелеген сагьифалар бугъар байлавлу <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Бугъар байлавлу сагьифалар ёкъ <strong>[[:$1]]</strong>:",
+       "linkshere-2": "Гелеген сагьифалар бугъар байлавлу <strong>$1</strong>:",
+       "nolinkshere-2": "Бугъар байлавлу сагьифалар ёкъ <strong>$1</strong>:",
        "isredirect": "ёллав-сагьифа",
        "istemplate": "къошув",
        "isimage": "сапламлы байланыв",
index f523fb5..b767225 100644 (file)
        "whatlinkshere": "Pyth a gevren dhe omma",
        "whatlinkshere-title": "Folennow ow kevrenna dhe \"$1\"",
        "whatlinkshere-page": "Folen:",
-       "linkshere": "Yma an folennow a syw ow kevrenna dhe '''[[:$1]]''':",
-       "nolinkshere": "Nyns eus folen vyth ow kevrenna dhe '''[[:$1]]'''.",
+       "linkshere-2": "Yma an folennow a syw ow kevrenna dhe '''$1''':",
+       "nolinkshere-2": "Nyns eus folen vyth ow kevrenna dhe '''$1'''.",
        "isredirect": "folen daskedyans",
        "istemplate": "treuskludyans",
        "isimage": "kevren an restren",
index 19f7d87..bcedaee 100644 (file)
        "whatlinkshere": "Шилтемелерди бул жакка",
        "whatlinkshere-title": "\"$1\" -га шилтеме берген барактар",
        "whatlinkshere-page": "Барак:",
-       "linkshere": "'''[[:$1]]''' барагына шилтеме берген барактар:",
-       "nolinkshere": "'''[[:$1]]''' барагына шилтеме берген барак жок.",
+       "linkshere-2": "'''$1''' барагына шилтеме берген барактар:",
+       "nolinkshere-2": "'''$1''' барагына шилтеме берген барак жок.",
        "isredirect": "багыттама барак",
        "istemplate": "бириктирүү",
        "isimage": "файл шилтемеси",
index 11e590a..616258d 100644 (file)
        "whatlinkshere": "Nexus ad paginam",
        "whatlinkshere-title": "Paginae quae ad \"$1\" nectuntur",
        "whatlinkshere-page": "Pagina:",
-       "linkshere": "Paginae sequentes ad '''[[:$1]]''' nectunt:",
-       "nolinkshere": "Nullae paginae ad '''[[:$1]]''' nectunt.",
-       "nolinkshere-ns": "Nullae paginae spatii nominalis selecti ad '''[[:$1]]''' nectunt.",
+       "linkshere-2": "Paginae sequentes ad '''$1''' nectunt:",
+       "nolinkshere-2": "Nullae paginae ad '''$1''' nectunt.",
+       "nolinkshere-ns-2": "Nullae paginae spatii nominalis selecti ad '''$1''' nectunt.",
        "isredirect": "pagina redirectionis",
        "istemplate": "inclusio",
        "isimage": "nexus fasciculi",
index dfc7321..9e035e9 100644 (file)
        "whatlinkshere": "Hojas atadas",
        "whatlinkshere-title": "Hojas que dan link a \"$1\"",
        "whatlinkshere-page": "Hoja:",
-       "linkshere": "Las hojas venideras dan link a '''[[:$1]]''':",
-       "nolinkshere": "Dinguna ója tiene atamientos kon '''[[:$1]]'''",
+       "linkshere-2": "Las hojas venideras dan link a '''$1''':",
+       "nolinkshere-2": "Dinguna ója tiene atamientos kon '''$1'''",
        "isredirect": "Hoja redirigida",
        "istemplate": "inclusión",
        "isimage": "atamiento de la dosya",
index 48f92a2..16c699c 100644 (file)
        "whatlinkshere": "Linken op dës Säit",
        "whatlinkshere-title": "Säiten, déi mat \"$1\" verlinkt sinn",
        "whatlinkshere-page": "Säit:",
-       "linkshere": "Déi folgend Säite linken op '''[[:$1]]''':",
-       "nolinkshere": "Keng Säit ass mat '''[[:$1]]''' verlinkt.",
-       "nolinkshere-ns": "Keng Säite linken op '''[[:$1]]''' am gewielten Nummraum.",
+       "linkshere-2": "Déi folgend Säite linken op '''$1''':",
+       "nolinkshere-2": "Keng Säit ass mat '''$1''' verlinkt.",
+       "nolinkshere-ns-2": "Keng Säite linken op '''$1''' am gewielten Nummraum.",
        "isredirect": "Viruleedung",
        "istemplate": "an dëser Säit dran",
        "isimage": "Link op de Fichier",
        "fileduplicatesearch-noresults": "Et gouf kee Fichier mam Numm \"$1\" fonnt.",
        "specialpages": "Spezialsäiten",
        "specialpages-note-top": "Erklärung",
+       "specialpages-note-restricted": "* Normal Spezialsäiten.\n* <span class=\"mw-specialpagerestricted\">Spezialsäite fir Benotzer mat méi Rechter.</span>",
        "specialpages-group-maintenance": "Maintenance-Rapporten",
        "specialpages-group-other": "Aner Spezialsäiten",
        "specialpages-group-login": "Aloggen / Benotzerkont uleeën",
index 0ea7d77..2b857b1 100644 (file)
        "whatlinkshere": "Иниз вуч элячIзава",
        "whatlinkshere-title": "\"$1\" - даз элячlзавай ччинар",
        "whatlinkshere-page": "Ччин:",
-       "linkshere": "Гуьгъуьнин ччинар '''[[:$1]]''': - даз  элячlзава",
-       "nolinkshere": "'''[[:$1]]''' ччиниз са ччинни элячIзавач.",
+       "linkshere-2": "Гуьгъуьнин ччинар '''$1''': - даз  элячlзава",
+       "nolinkshere-2": "'''$1''' ччиниз са ччинни элячIзавач.",
        "isredirect": "Рахкъурунин ччин",
        "istemplate": "кутун",
        "isimage": "Файлдин элячlун",
index 4f61fd5..3ec95a9 100644 (file)
        "whatlinkshere": "Lias a esta paje",
        "whatlinkshere-title": "Pajes cual lia a \"$1\"",
        "whatlinkshere-page": "Paje:",
-       "linkshere": "La pajes seguente lia a <strong>[[:$1]]</strong>:",
-       "nolinkshere": "No pajes lia a <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "No pajes lia a <strong>[[:$1]]</strong> en la spasio de nom elejeda.",
+       "linkshere-2": "La pajes seguente lia a <strong>$1</strong>:",
+       "nolinkshere-2": "No pajes lia a <strong>$1</strong>.",
+       "nolinkshere-ns-2": "No pajes lia a <strong>$1</strong> en la spasio de nom elejeda.",
        "isredirect": "paje redirijente",
        "istemplate": "transclui",
        "isimage": "lia de fix",
index d8f54b8..d6f438e 100644 (file)
        "whatlinkshere": "Empapula ezikuggusa ku luno",
        "whatlinkshere-title": "Empapula eziriko enyunzi ezigguka ku $1",
        "whatlinkshere-page": "Lupapula:",
-       "linkshere": "Zino z'empapula eziriko enyunzi ezigguka ku '''[[:$1]]''':",
-       "nolinkshere": "Tewali mpapula eziriko enyunzi ezigguka ku '''[[:$1]]'''.",
+       "linkshere-2": "Zino z'empapula eziriko enyunzi ezigguka ku '''$1''':",
+       "nolinkshere-2": "Tewali mpapula eziriko enyunzi ezigguka ku '''$1'''.",
        "isredirect": "lupapula olukutwalabutwazi ku lunnaalwo",
        "istemplate": "kitundu ekyeyazike",
        "isimage": "lukozesa ekifaananyi kino",
index 5ef25bf..a86d842 100644 (file)
        "whatlinkshere": "Links nao dees pagina",
        "whatlinkshere-title": "Pagina's die verwieze nao \"$1\"",
        "whatlinkshere-page": "Pagina:",
-       "linkshere": "De volgende pagina's verwieze nao '''[[:$1]]''':",
-       "nolinkshere": "D'r zint gein pazjena's mit links nao '''[[:$1]]''' haer.",
-       "nolinkshere-ns": "Geine inkele pazjena link nao '''[[:$1]]''' in de gekaoze naamruumde.",
+       "linkshere-2": "De volgende pagina's verwieze nao '''$1''':",
+       "nolinkshere-2": "D'r zint gein pazjena's mit links nao '''$1''' haer.",
+       "nolinkshere-ns-2": "Geine inkele pazjena link nao '''$1''' in de gekaoze naamruumde.",
        "isredirect": "redirect pagina",
        "istemplate": "ingevoog es sjabloon",
        "isimage": "bestandjslink",
index 0a60cfc..fea67cc 100644 (file)
        "whatlinkshere": "Cöse se colega chì",
        "whatlinkshere-title": "Pàgine c'apontàn a $1",
        "whatlinkshere-page": "Pàgina:",
-       "linkshere": "E pàgine segoenti apontan a '''[[:$1]]''':",
-       "nolinkshere": "Nisciùnn-a pàgina a se collega con '''[[:$1]]'''.",
-       "nolinkshere-ns": "Pagine ch'apontan a '''[[:$1]]''' into namespace seleçionou no ghe n'è.",
+       "linkshere-2": "E pàgine segoenti apontan a '''$1''':",
+       "nolinkshere-2": "Nisciùnn-a pàgina a se collega con '''$1'''.",
+       "nolinkshere-ns-2": "Pagine ch'apontan a '''$1''' into namespace seleçionou no ghe n'è.",
        "isredirect": "Paggina de rindirissamento",
        "istemplate": "Incluxon",
        "isimage": "Colegaménto a-o file",
        "fileduplicatesearch-noresults": "Nisciun file de nomme \"$1\" trovou.",
        "specialpages": "Pàgine speciâli",
        "specialpages-note-top": "Legenda",
+       "specialpages-note-restricted": "* Pagine speciali non riservæ.\n* <span class=\"mw-specialpagerestricted\">Pagine speciali riservæ a çerte categorie d'utenti.</span>",
        "specialpages-group-maintenance": "Raporti de manutençion",
        "specialpages-group-other": "Atre paggine speciale",
        "specialpages-group-login": "Intra / Registrite",
index 0ca1316..4f060a4 100644 (file)
        "whatlinkshere": "پیوندەل وە ئێ وەڵگە",
        "whatlinkshere-title": "وۀلگۀلئ گإ  وۀ «$1» پیوۀند دِرِن",
        "whatlinkshere-page": ":وةڵگە(پەڕە)",
-       "linkshere": "The following pages link to <strong>[[:$1]]</strong>:",
-       "nolinkshere": "هیچ صفحه‌ای به '''[[:$1]]''' پیوند ندارد.",
-       "nolinkshere-ns": "هیچ صفحه‌ای از فضای نام انتخاب شده به '''[[:$1]]''' پیوند ندارد.",
+       "linkshere-2": "The following pages link to <strong>$1</strong>:",
+       "nolinkshere-2": "هیچ صفحه‌ای به '''$1''' پیوند ندارد.",
+       "nolinkshere-ns-2": "هیچ صفحه‌ای از فضای نام انتخاب شده به '''$1''' پیوند ندارد.",
        "isredirect": "وەڵگە ڕێ گؤەڕن(تغییرمسییر)",
        "istemplate": " تراگنجانش‌ها",
        "isimage": "پیوند پرونده",
        "fileduplicatesearch-noresults": "پرونده‌ای با نام «$1» أ دی نؤی /پئا نؤی.",
        "specialpages": "وەڵگەل(پەڕەل)ویژە",
        "specialpages-note-top": "شرح علائم",
+       "specialpages-note-restricted": "* صفحه‌های ویژهٔ عادی.\n* <span class=\"mw-specialpagerestricted\">صفحه‌های ویژهٔ محدودشده.</span>",
        "specialpages-group-maintenance": "گزارش‌های نگهداری",
        "specialpages-group-other": "سایر وةڵگةل ویژه",
        "specialpages-group-login": " إ نؤم هةتن سیستم/ حساوو کاربةری سازین",
index 7dbe352..a4fb8c9 100644 (file)
        "whatlinkshere": "Pagin che se culeghen chì",
        "whatlinkshere-title": "Paginn che menen a \"$1\"",
        "whatlinkshere-page": "Pagina:",
-       "linkshere": "I paginn chì de sota gh'hann di ligam che porten a '''[[:$1]]''':",
+       "linkshere-2": "I paginn chì de sota gh'hann di ligam che porten a '''$1''':",
        "isredirect": "redirezión",
        "istemplate": "inclüsión",
        "isimage": "ligam a un archivi",
index 7a4ba91..84fcc2c 100644 (file)
        "sp-contributions-submit": "ຊອກຫາ",
        "whatlinkshere": "ໜ້າທີ່ເຊື່ອມຕໍ່ມາໜ້ານີ້",
        "whatlinkshere-title": "ໜ້າທີ່ເຊື່ອມຕໍ່ຫາ $1",
-       "linkshere": "ບັນດາໜ້າຕໍ່ໄປ ລິ້ງຄ໌ ຫາ ''[[:$1]]''':",
-       "nolinkshere": "ບໍ່ມີໜ້າລິ້ງຄ໌ ຫາ '''[[:$1]]'''.",
-       "nolinkshere-ns": "ບໍ່ມີໜ້າລິ້ງຄ໌ ຫາ '''[[:$1]]''' ໃນ ຂອບເຂດຊື່ ທີ່ ທ່ານເລືອກ.",
+       "linkshere-2": "ບັນດາໜ້າຕໍ່ໄປ ລິ້ງຄ໌ ຫາ ''$1''':",
+       "nolinkshere-2": "ບໍ່ມີໜ້າລິ້ງຄ໌ ຫາ '''$1'''.",
+       "nolinkshere-ns-2": "ບໍ່ມີໜ້າລິ້ງຄ໌ ຫາ '''$1''' ໃນ ຂອບເຂດຊື່ ທີ່ ທ່ານເລືອກ.",
        "isredirect": "ໜ້າໂອນ",
        "istemplate": "ລວມ",
        "whatlinkshere-prev": "{{PLURAL:$1|ກ່ອນ|ກ່ອນ $1}}",
index cc49d74..a8146a8 100644 (file)
        "whatlinkshere": "Ling'ki di bye petulo",
        "whatlinkshere-title": "Petulo bye ling'ki di $1",
        "whatlinkshere-page": "Petulo:",
-       "linkshere": "Bye petulo ling'ki di '''[[:$1]]''':",
-       "nolinkshere": "0 petulo ling'ki di '''[[:$1]]'''.",
-       "nolinkshere-ns": "0 petulo ling'ki di '''[[:$1]]''' bye sa di bye fatukile efro.",
+       "linkshere-2": "Bye petulo ling'ki di '''$1''':",
+       "nolinkshere-2": "0 petulo ling'ki di '''$1'''.",
+       "nolinkshere-ns-2": "0 petulo ling'ki di '''$1''' bye sa di bye fatukile efro.",
        "isredirect": "petulo abezi",
        "istemplate": "yang'idole",
        "whatlinkshere-prev": "{{PLURAL:$1|kona|kona $1}}",
index ca6ac41..e822bba 100644 (file)
@@ -64,8 +64,8 @@
        "editfont-serif": "فونت سئريف",
        "sunday": "یٱشمٱ",
        "monday": "دۏشٱمٱ",
-       "tuesday": "ساÙ\9bشمٱ",
-       "wednesday": "چارشأمە",
+       "tuesday": "سئشمٱ",
+       "wednesday": "چارشٱمٱ",
        "thursday": "پن شمٱ",
        "friday": "جومٱ",
        "saturday": "شٱمٱ",
@@ -93,8 +93,8 @@
        "march-gen": "مارس",
        "april-gen": "آڤریل",
        "may-gen": "مئی",
-       "june-gen": "جوٙأن",
-       "july-gen": "جوٙلای",
+       "june-gen": "جۊٱن",
+       "july-gen": "جۊلای",
        "august-gen": "آگوست",
        "september-gen": "سئپتامر",
        "october-gen": "ئوکتوبر",
        "specialpage": "بألگە ڤیجە",
        "personaltools": "ٱڤزاریا شٱخسی",
        "talk": "گٱپ",
-       "views": "دÛ\8cاÙ\9bن",
+       "views": "دÛ\8cئن",
        "toolbox": "ٱڤزاریا",
        "imagepage": "ديئن بألگە جانیا",
        "mediawikipage": "ديئن بألگە پئيغوم",
        "perfcached": "رئسینە یا نئهایی د ڤیرگە قام بییە موٙکیس بینە و گاسی هأنی ڤئ هئنگوم سازی نأبینە.بیشتئروٙنە {{PLURAL:$4|یئ گئل نأتیجە|$4 یئ گئل نأتیجە}} د ڤیرگە قام بییە هان د دأسرئس.",
        "perfcachedts": "رئسینە یا نئهایی د ڤیرگە قام بییە موٙکیس بینە و گاسی هأنی ڤئ هئنگوم سازی نأبینە.بیشتئروٙنە {{PLURAL:$4|یئ گئل نأتیجە|$4 یئ گئل نأتیجە}} د ڤیرگە قام بییە هان د دأسرئس.",
        "querypage-no-updates": "نأبوٙە ئی بألگە ڤئ هئنگوم سازی با.\nرئسینە یا ئیچئ تازە کاری نأبینە.",
-       "viewsource": "ساÙ\9bیل د سرچشمٱ بٱکیت",
+       "viewsource": "سئیل د سرچشمٱ بٱکیت",
        "viewsource-title": "سئیل د سأرچئشمە $1 بأکیت",
        "actionthrottled": "کونئشتکاری نئهاگئری بییە",
        "actionthrottledtext": "سی نئهاگئری د دأرتیچ بییئن ئسپأم نأبوٙە کئ شوما چئنی کاری نە د یئ گاتی کوٙتا چأن گئل أنجوم بئییت.\nلوطف بأکیت د چأن دئیقە هأنی د نۊ تئلاش بأکیت.",
        "userlogin-loggedin": "شوما ئیسئ چی یئ گئل {{GENDER:$1|$1}} ئوٙمایتە ڤامین.نوم بألگە هاری نە سی ڤامین ئوٙمائن چی یئ گئل کاریار هأنی بلگه هاری سی وا مین اومائن چی یه گل کاریار هنی ڤئ کار بئیریت.",
        "userlogin-createanother": "یئ گئل حئساڤ هأنی راس بأکیت",
        "createacct-emailrequired": "تیرنئشوٙن أنجومانامە",
-       "createacct-emailoptional": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95",
+       "createacct-emailoptional": "تÛ\8cرÙ\86Ø´Û\8aÙ\86 Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù±",
        "createacct-email-ph": "تیرنشون انجومانامه تونه وارد بكيت",
        "createacct-another-email-ph": "تیرنئشوٙن أنجومانامە توٙنە بأزأنیت",
        "createaccountmail": "یئ گئل رازینە گوڤاردئن موڤأقأتینە ڤئ کار بئیریت و ڤئ نەسی یئ گئل تیرنئشوٙن أنجومانامە تیار بییە کئل بأکیت.",
        "resettokens-watchlist-token": "دیارگأر سی حوڤال حوٙن تورگە(أتوم/آر ئس ئس) سی [[Special:سئیل بأرگ|آلئشت دأئن بألگە یا د سئیل بأرگئتوٙ]]",
        "resettokens-done": "نئشوٙنە یا تازه بیینە",
        "resettokens-resetbutton": "نئشوٙنە گولئ ڤورچیە د نوٙ زئنە بینە",
-       "bold_sample": "نیسسە توٙپور",
-       "bold_tip": "Ù\86Û\8cسئسÛ\95 ØªÙ\88Ù\99پور",
+       "bold_sample": "نیسسٱ مین پور",
+       "bold_tip": "Ù\86Û\8cسسٱ Ù\85Û\8cÙ\86 پور",
        "italic_sample": "نیسئسە کأج و کولە",
        "italic_tip": "نیسئسە یا کأج و کولە",
        "link_sample": "داسوٙن هوم پیڤند",
        "summary": "چکسٱ",
        "subject": "ذاسوٙن/سأرتال:",
        "minoredit": "یٱ یاٛ گاٛل ڤیرایشت کوچکٱ",
-       "watchthis": "دÛ\8cاÙ\9bن ای بلگٱ",
+       "watchthis": "دÛ\8cئن ای بلگٱ",
        "savearticle": "اٛمایٱ کردن بلگٱ",
        "preview": "پيش سئيل",
-       "showpreview": "Ù\86Ø´Û\8a Ø¯Ù±Ø¦Ù\86 Ù¾Û\8cØ´ Ø³Ø§Ù\9bیل",
+       "showpreview": "Ù\86Ø´Û\8a Ø¯Ù±Ø¦Ù\86 Ù¾Û\8cØ´ Ø³Ø¦یل",
        "showdiff": "نشۊ دٱئن آلشتکاریا",
        "blankarticle": "<strong>زنئار:</strong> بلگه ای که شما دروس کردیته حالیه.\nار شما د نو ری \"$1\" بپورنیت, بلگه وه شکل که هیچ مینونه ای دش نبا دروس بوئه.",
        "anoneditwarning": "<strong>زاٛنار:</strong> شوما هٱنی نیۊمایتٱ ڤامین. تیرنشۊن آی پی شوما سی هر گاتی کاٛ آلشتکاری بٱکیت سی کول خٱلک دیاری می کٱ. ٱر <strong>[$1 روئیت ڤامین]</strong> یا <strong>[$2 یاٛ گاٛل هساڤ کاریاری راس بٱکیت]</strong>، ڤیرایشتیا شوما ڤ نوم کاریاری خوتۊ دیاری می کٱ و سی شوما بیترٱ.",
        "revisionasof": "دوڤارٱ دیاٛن $1",
        "revision-info": "دوواره سیل بیه چی $1 وا $2",
        "previousrevision": "ڤانیٱری داٛمایی←",
-       "nextrevision": "ڤانئیأری تازە تئر",
-       "currentrevisionlink": "آخئرÛ\8c Ú¤Ø§Ù\86ئÛ\8cØ£ری",
+       "nextrevision": "ڤانیٱری تازٱتر",
+       "currentrevisionlink": "آخرÛ\8c Ú¤Ø§Ù\86Û\8cÙ±ری",
        "cur": "تازٱ باۋ",
        "next": "نئهایی",
        "last": "داٛمایی",
        "rcshowhidebots-show": "نشۊ دٱئن",
        "rcshowhidebots-hide": "قام کردن",
        "rcshowhideliu": "$1 کاریاریا ثوت نام کرده",
-       "rcshowhideliu-show": "Ù\86ئشÙ\88Ù\99 Ø¯Ø£ئن",
+       "rcshowhideliu-show": "Ù\86Ø´Û\8a Ø¯Ù±ئن",
        "rcshowhideliu-hide": "قام کئردئن",
        "rcshowhideanons": "کاریار نادیار $1",
        "rcshowhideanons-show": "نئشوٙ دأئن",
        "rc-enhanced-expand": "جزيات نشون بيئه",
        "rc-enhanced-hide": "جزياته قام كو",
        "rc-old-title": "ذاتا چی \"$1\" راس بیه",
-       "recentchangeslinked": "آلشتیا تی یکی",
+       "recentchangeslinked": "آلشتیا تی یٱکی",
        "recentchangeslinked-feed": "آلشتیا تی یکی",
        "recentchangeslinked-toolbox": "آلشتیا تاٛ یٱک",
        "recentchangeslinked-title": "آلشتیا تاٛ یکی د $1",
        "recentchangeslinked-summary": "ای نوم بلگٱ تازٱ د بلگٱیایی کاٛ ۋا بلگٱیا ۋیجٱ هوم پیۋند بینٱ آلشت بیٱ(یا سی ٱندومیا دٱسٱ بٱنی بیٱ)\nبلگٱیایی کاٛ هان د [[Special:Watchlist|your watchlist]]و گٱپ بینٱ",
-       "recentchangeslinked-page": "نوم بألگە:",
+       "recentchangeslinked-page": "نوم بلگٱ:",
        "recentchangeslinked-to": "آلشتیایی که د بلگه یا هوم پیوند بینه وه جا بلگه دئیه بیه نشو بیه",
        "recentchanges-page-added-to-category": "[[:$1]]د دأسە ئضاف بی",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] و {{PLURAL:$2|بألگە تأکی|$2 بألگە یا}} د دأسە ئضاف بییئن",
        "usermessage-summary": "رئتن د سامونه پیغوم",
        "usermessage-editor": "پیغوم فرسن سیستم",
        "usermessage-template": "ویکی وارسگر:پیغوم کاریار",
-       "watchlist": "ساÙ\9bیل برگ",
+       "watchlist": "سئیل برگ",
        "mywatchlist": "ساٛیل برگ",
        "watchlistfor2": "سي $1 $2",
        "nowatchlist": "شما هیچی د سیل برگ خوتو ناریت",
        "undelete-show-file-confirm": "آیا یه دل بئیته که میهایت یه گل نسقه پاکسا بیه د جانیا \"<nowiki>$1</nowiki>\" که ها د ویرگار $2 ساعت $3 نه سیل بکیت؟",
        "undelete-show-file-submit": "هأری",
        "namespace": "نوم جا:",
-       "invert": "انتخاو برعسك بوئه",
+       "invert": "گولڤورچی بیئن بٱرٱسگ بۊٱ",
        "tooltip-invert": "د ری ای جعوه بپورنیت و آلشتیایی نه که د مینجا نوم ورگه انتخاو بیه انجوم بینه قام بکیت(و ار نوم ورگه شریکی وارسی بیه)",
        "tooltip-whatlinkshere-invert": "ای جعون نه سی نهو کردن هوم پیوند بلگه یایی که نوم جاشو انتخاو بیه، انتخاو بکیت.",
        "namespace_association": "نوم جایا یکاگرته",
        "sp-contributions-newbies": "فقط هومیاری یایی که د حساو تازه بیه نشون بئه",
        "sp-contributions-newbies-sub": "سی حساویا تازه",
        "sp-contributions-newbies-title": "هومیاریا کاریار سی حساویا تازه",
-       "sp-contributions-blocklog": "Ù\82Ù\84Ù\81",
+       "sp-contributions-blocklog": "Ù¾Ù\87رستÙ\86Û\8aÙ\85Ù± Ù\82Ù\88Ù\84Ù\81 Ø¨Û\8cÙ±",
        "sp-contributions-suppresslog": "پاکساگری کردن هومیاریا کاریار",
        "sp-contributions-deleted": "هومیاریا پاکسا بیه کاریار",
        "sp-contributions-uploads": "سواركرديا",
        "whatlinkshere": "کوم هوم پیۋندیا هان ایچاٛ",
        "whatlinkshere-title": "بلگه ای که د $1 هوم پیوند بیه",
        "whatlinkshere-page": "بلگٱ",
-       "linkshere": "بلگیا نهایی د '''[[:$1]]''' هوم پیوند بیه",
-       "nolinkshere": "هیژ بگله ای د  '''[[:$1]]''' هوم پیوند نبیه",
-       "nolinkshere-ns": "هیچ بلگه ای د نومجا انتخاو بیه وه'''[[:$1]]''' هوم پیوند ناره.",
+       "linkshere-2": "بلگیا نهایی د '''$1''' هوم پیوند بیه",
+       "nolinkshere-2": "هیژ بگله ای د  '''$1''' هوم پیوند نبیه",
+       "nolinkshere-ns-2": "هیچ بلگه ای د نومجا انتخاو بیه وه'''$1''' هوم پیوند ناره.",
        "isredirect": "بلگه دوباره ورگشتن",
        "istemplate": "نشونی دئن",
        "isimage": "جانیا هوم پیوند",
        "blocklist-nousertalk": "نبوئه بلگه چک چنه خوتونه ویرایشت بکید",
        "ipblocklist-empty": "جاگه نوم گه حالیه",
        "ipblocklist-no-results": "دسرسی نوم کاریاری یا تیرنشون آی پی حاسته بیه نهاگری نبیه.",
-       "blocklink": "ناٛهاگری بۊٱ",
+       "blocklink": "نهاگری بۊٱ",
        "unblocklink": "بی قطی",
        "change-blocklink": "اجازه نديئن سی  آلشت",
        "contribslink": "هومیاریا",
        "tooltip-pt-login": "ایما مۊئیم کاٛ رۊئیت ڤامین سامۊنگٱ؛ ڤلی ای کار اٛژبار ینی.",
        "tooltip-pt-logout": "د سامونه دراومائن",
        "tooltip-pt-createaccount": "شوما تشڤیق بیتٱ کاٛ یاٛ گاٛل هساڤ راست بکیت و بیایت ڤامین؛ د هر جۊر ای کار اٛژباری نی.",
-       "tooltip-ca-talk": "قسٱ داٛبارٱ مینۊنٱ بلگٱ.",
+       "tooltip-ca-talk": "قسٱ دائبارٱ مینۊنٱ بلگٱ.",
        "tooltip-ca-edit": "ڤیرایشت ای بلگٱ",
        "tooltip-ca-addsection": "د یه گل بهرجا هنی شرو بک",
        "tooltip-ca-viewsource": "ای بلگه پر و پیم بيه.\nشما تونيت سرچمه ش بئوينيت",
        "pageinfo-redirectsto": "واگردونی سی",
        "pageinfo-redirectsto-info": "دونسمنیا",
        "pageinfo-contentpage": "اشمارده بیه وه عنوان مینونه بلگه",
-       "pageinfo-contentpage-yes": "Ù\87رÛ\8c",
+       "pageinfo-contentpage-yes": "Ù±",
        "pageinfo-protect-cascading": "پر و پیم بیین تافنمایی د ایچه",
        "pageinfo-protect-cascading-yes": "هری",
        "pageinfo-protect-cascading-from": "پر و پیم بیین تافنمایی د",
        "exif-urgency-low": "هار ($1)",
        "exif-urgency-high": "بلنگ ($1)",
        "exif-urgency-other": "اول کاری تعریف بیه وه دس کاریار($1)",
-       "namespacesall": "Ù\87Ù\85Ù\87 Ø´Ù\88",
-       "monthsall": "Ù\87Ù\85Ù\87",
+       "namespacesall": "Ù\87Ù±Ù\85ٱشÛ\8a",
+       "monthsall": "Ù\87Ù±Ù\85Ù±",
        "confirmemail": "پشت راس کردن تیرنشون انجومانامه",
        "confirmemail_noemail": "شما د بلگه [[Special:Preferences|ترجیحات کاریاری]] خوتو یه گل تیرنشون انجومانامه نامعتور نه دئیته.",
        "confirmemail_text": "ای ویکی، شما نه مژبور می که وه پشت راسکاری تیرنشون انجومانامه خوتو، دما د یه که خدمات انجومانامه نه وه کار د ایچه وه کار بئیریت می که.دگمه هاری نه کنشتیار بکیت تا یه گل انجومانامه پشت راسکاری سی تیرنشون انجومانامه شما کل بوئه. ای انجومانامه د ور گرته یه گل رازینه ئه. هوم پیوند نه د دوارته نیئر خوتو واز بکیت تا تیرنشون انجومانامه تو پشت راسکاری با.",
        "fileduplicatesearch-noresults": "جانیایی وا نوم «$1» یافت نبی.",
        "specialpages": "بلگٱیا ڤیجٱ",
        "specialpages-note-top": "میراث",
+       "specialpages-note-restricted": "* بلگه یا ویجه عادی.\n* <span class=\"mw-specialpagerestricted\">بلگه یا ویجه محدود کاری بیه.</span>",
        "specialpages-group-maintenance": "گزارشتیا واداشتن",
        "specialpages-group-other": "بلگه یا ویجه هنی",
        "specialpages-group-login": " اومائن د سيستم/راس كردن حساو",
index 5bd4131..9794073 100644 (file)
        "whatlinkshere": "Susiję puslapiai",
        "whatlinkshere-title": "Puslapiai, kurie nurodo į „$1“",
        "whatlinkshere-page": "Puslapis:",
-       "linkshere": "Šie puslapiai rodo į '''[[:$1]]''':",
-       "nolinkshere": "Į '''[[:$1]]''' nuorodų nėra.",
-       "nolinkshere-ns": "Nurodytoje vardų srityje nei vienas puslapis nenurodo į '''[[:$1]]'''.",
+       "linkshere-2": "Šie puslapiai rodo į '''$1''':",
+       "nolinkshere-2": "Į '''$1''' nuorodų nėra.",
+       "nolinkshere-ns-2": "Nurodytoje vardų srityje nei vienas puslapis nenurodo į '''$1'''.",
        "isredirect": "nukreipiamasis puslapis",
        "istemplate": "įterpimas",
        "isimage": "rinkmenos nuoroda",
        "fileduplicatesearch-noresults": "Nėra failo pavadinimu \"$1\".",
        "specialpages": "Specialieji puslapiai",
        "specialpages-note-top": "Paaiškinimai",
+       "specialpages-note-restricted": "* Įprasti specialieji puslapiai.\n* <span class=\"mw-specialpagerestricted\">Apriboto pasiekiamumo specialieji puslapiai.</span>",
        "specialpages-group-maintenance": "Sistemos palaikymo pranešimai",
        "specialpages-group-other": "Kiti specialieji puslapiai",
        "specialpages-group-login": "Prisijungti / sukurti paskyrą",
index b5f808b..ea4bd74 100644 (file)
        "whatlinkshere": "Sasītuos nūruodis",
        "whatlinkshere-title": "Lopys, kuramuos ir saitis iz lopu $1",
        "whatlinkshere-page": "Puslopa:",
-       "linkshere": "Itamuos lopuos ir nūruodis iz lopu '''[[:$1]]''':",
+       "linkshere-2": "Itamuos lopuos ir nūruodis iz lopu '''$1''':",
        "isredirect": "puoradresiešonys puslopa",
        "istemplate": "izsaukts",
        "isimage": "Faila saita",
index 27511a3..97c76b0 100644 (file)
        "whatlinkshere": "Hemi zawmpuite",
        "whatlinkshere-title": "$1-a thlunzawm phêkte",
        "whatlinkshere-page": "Phêk:",
-       "linkshere": "A hnuaia phêkte hian '''[[:$1]]''' hi an thlunzawm:",
-       "nolinkshere": "'''[[:$1]]'''-a zawm phek pakhat mah a awm lo.",
+       "linkshere-2": "A hnuaia phêkte hian '''$1''' hi an thlunzawm:",
+       "nolinkshere-2": "'''$1'''-a zawm phek pakhat mah a awm lo.",
        "isredirect": "Hruailuhna phêk",
        "istemplate": "ziahhnan",
        "isimage": "taksa thlunzawmna",
index 6d099bf..a474cd4 100644 (file)
        "whatlinkshere": "لینکل ئی بألگە",
        "whatlinkshere-title": "بألگل کە لینک دائنە ڤە \"$1\"",
        "whatlinkshere-page": "بألگە:",
-       "linkshere": "لینک ھ بألگل دوٙمین الذیکر ڤە '''[[:$1]]''':",
+       "linkshere-2": "لینک ھ بألگل دوٙمین الذیکر ڤە '''$1''':",
        "isredirect": "بألگە تأغییر مأسیر",
        "istemplate": "ئیستیفادھ ڤابیدھ داخل بألگە",
        "isimage": "لینک ھ فایل",
index 6f4154e..ef9f4ab 100644 (file)
        "whatlinkshere": "Norādes uz šo rakstu",
        "whatlinkshere-title": "Lapas, kurās ir saites uz lapu \"$1\"",
        "whatlinkshere-page": "Lapa:",
-       "linkshere": "Šajās lapās ir norādes uz lapu '''[[:$1]]''':",
-       "nolinkshere": "Nevienā lapā nav norāžu uz lapu '''[[:$1]]'''.",
-       "nolinkshere-ns": "Neviena lapa nenorāda uz '''[[:$1]]''' izvēlētajā vārdtelpā.",
+       "linkshere-2": "Šajās lapās ir norādes uz lapu '''$1''':",
+       "nolinkshere-2": "Nevienā lapā nav norāžu uz lapu '''$1'''.",
+       "nolinkshere-ns-2": "Neviena lapa nenorāda uz '''$1''' izvēlētajā vārdtelpā.",
        "isredirect": "pāradresācijas lapa",
        "istemplate": "izsaukts",
        "isimage": "faila saite",
        "fileduplicatesearch-noresults": "Nav atrasts neviens fails ar nosaukumu \"$1\".",
        "specialpages": "Īpašās lapas",
        "specialpages-note-top": "Apzīmējumi",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!* Normālas īpašās lapas.\n* <span class=\"mw-specialpagerestricted\">Ierobežotas pieejas īpašās lapas.</span>\n* <span class=\"mw-specialpagecached\">Iekešotās īpašās lapas.</span>",
        "specialpages-group-maintenance": "Uzturēšanas atskaites",
        "specialpages-group-other": "Citas īpašās lapas",
        "specialpages-group-login": "Pieslēgties / izveidot kontu",
index c694116..ba4775d 100644 (file)
        "recentchanges-label-plusminus": "所改字節量",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}([[Special:NewPages|新灶]])",
        "recentchanges-submit": "示",
+       "rcfilters-show-new-changes": "知新",
        "rcnotefrom": "下為自'''$2'''至'''$1'''之易也。",
        "rclistfrom": "自$3 $2起之易也",
        "rcshowhideminor": "$1校",
        "whatlinkshere": "取佐",
        "whatlinkshere-title": "「$1」取佐",
        "whatlinkshere-page": "題",
-       "linkshere": "取佐'''[[:$1]]'''如下:",
-       "nolinkshere": "無頁取佐'''[[:$1]]'''。",
-       "nolinkshere-ns": "名冊內無頁取佐'''[[:$1]]'''。",
+       "linkshere-2": "取佐'''$1'''如下:",
+       "nolinkshere-2": "無頁取佐'''$1'''。",
+       "nolinkshere-ns-2": "名冊內無頁取佐'''$1'''。",
        "isredirect": "渡",
        "istemplate": "含",
        "isimage": "檔佐",
        "fileduplicatesearch-result-1": "案 \"$1\" 無重也。",
        "fileduplicatesearch-result-n": "案 \"$1\" 重有$2。",
        "specialpages": "特查",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* 準特查。\n* <strong class=\"mw-specialpagerestricted\">限特查。</strong>",
        "specialpages-group-maintenance": "護報",
        "specialpages-group-other": "他奇頁",
        "specialpages-group-login": "登/增",
index c1f7582..381e60a 100644 (file)
        "whatlinkshere": "Butʼkʼaşa na ixvenu kʼontʼaktʼepe",
        "whatlinkshere-title": "\"$1\" maddeşa kʼontʼaktʼi na ikips butʼkʼape",
        "whatlinkshere-page": "Butʼkʼa:",
-       "linkshere": "'''[[:$1]]''' butʼkʼaşa kʼontʼaktʼi na ikips butʼkʼape:",
+       "linkshere-2": "'''$1''' butʼkʼaşa kʼontʼaktʼi na ikips butʼkʼape:",
        "isredirect": "redirektʼiş butʼkʼa",
        "istemplate": "okʼatu",
        "isimage": "dosyaşi kʼontʼaktʼi",
index 4dfda8f..63b2084 100644 (file)
        "whatlinkshere": "एतय कोन लिङ्क अछि",
        "whatlinkshere-title": "\"$1\" सँ सम्बन्धित पन्नासभ",
        "whatlinkshere-page": "पन्ना:",
-       "linkshere": "ई सभ पन्ना सम्बन्धित अछि '''[[:$1]]''':",
-       "nolinkshere": "'''[[:$1]]''' पर कोनो पन्नाक लागि नै अछि।",
-       "nolinkshere-ns": "कोनो पन्नाक लागि '''[[:$1]]''' चुनल नामगाममे नै अछि।",
+       "linkshere-2": "ई सभ पन्ना सम्बन्धित अछि '''$1''':",
+       "nolinkshere-2": "'''$1''' पर कोनो पन्नाक लागि नै अछि।",
+       "nolinkshere-ns-2": "कोनो पन्नाक लागि '''$1''' चुनल नामगाममे नै अछि।",
        "isredirect": "पुनर्निर्देशन पृष्ठ",
        "istemplate": "परागत",
        "isimage": "फाइल लिङ्क",
        "fileduplicatesearch-noresults": "कोनो \"$1\" नाम्ना संचिका नै।",
        "specialpages": "विशेष पन्नासभ",
        "specialpages-note-top": "कुंजी",
+       "specialpages-note-restricted": "* सामान्य विशिष्ट पन्ना।\n* <span class=\"mw-specialpagerestricted\">प्रतिबंधित विशिष्ट पन्ना।</span>\n* <span class=\"mw-specialpagecached\">उपस्मृतिक विशिष्ट पन्ना (पुरान भऽ सकैए)।</span>",
        "specialpages-group-maintenance": "सुस्थापन प्रतिवेदन",
        "specialpages-group-other": "दोसर विशेष पन्ना",
        "specialpages-group-login": "सम्प्रवेश/ सम्प्रवेश आवेदन",
index a08fb4e..c5b6f61 100644 (file)
        "whatlinkshere": "Pranala Kaca Kiye",
        "whatlinkshere-title": "Kaca-kaca sing duwe pranala maring \"$1\"",
        "whatlinkshere-page": "Kaca:",
-       "linkshere": "Kaca-kaca kiye duwe pranala maring '''[[:$1]]''':",
-       "nolinkshere": "Ora ana kaca sing nduwé pranala maring '''[[:$1]]'''.",
+       "linkshere-2": "Kaca-kaca kiye duwe pranala maring '''$1''':",
+       "nolinkshere-2": "Ora ana kaca sing nduwé pranala maring '''$1'''.",
        "isredirect": "kaca pangalihan",
        "istemplate": "karo cithakan",
        "isimage": "pranala berkas",
index 22a8eb8..2d505cd 100644 (file)
        "whatlinkshere": "Сюлмафкст тяза",
        "whatlinkshere-title": "Лопат конат сюлмафт \"$1\" мархта",
        "whatlinkshere-page": "Лопа:",
-       "linkshere": "Ся лопатне сюлмафт '''[[:$1]]''' мархта:",
-       "nolinkshere": "Лопат, конат сюлмафт '''[[:$1]]''' мархта ашет.",
-       "nolinkshere-ns": "Аш лопат сюлмафт '''[[:$1]]''' мархта  кочкаф лемботмоста.",
+       "linkshere-2": "Ся лопатне сюлмафт '''$1''' мархта:",
+       "nolinkshere-2": "Лопат, конат сюлмафт '''$1''' мархта ашет.",
+       "nolinkshere-ns-2": "Аш лопат сюлмафт '''$1''' мархта  кочкаф лемботмоста.",
        "isredirect": "умборондафтф лопа",
        "istemplate": "сувафтома",
        "isimage": "↓архтофксонь сюлмафкссь",
        "fileduplicatesearch-result-1": "Файлть \"$1\" ашет тяконь кафонзамонза.",
        "fileduplicatesearch-result-n": "Файлть \"$1\" {{PLURAL:$2|1 тяконь кафонзамац|$2 тяконь кафонзаманза}}.",
        "specialpages": "Башка лопат",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* Кърдань башка лопат.\n* <strong class=\"mw-specialpagerestricted\">Кардаф башка лопат.</strong>",
        "specialpages-group-maintenance": "Латцема лувоматне",
        "specialpages-group-other": "Иля башка тевонь лопатне",
        "specialpages-group-login": "Сувамс / сёрматфтомс",
index 22179fe..0467390 100644 (file)
        "whatlinkshere": "Pejy mirohy eto",
        "whatlinkshere-title": "Pejy mirohy any amin'i « $1 »",
        "whatlinkshere-page": "Pejy :",
-       "linkshere": "Ireo pejy ireo dia manana rohy mankany amin'i '''[[:$1]]'''",
-       "nolinkshere": "Tsy nahitana pejy mirohy any amin'i '''[[:$1]]'''.",
-       "nolinkshere-ns": "Tsy nahitana pejy mirohy any amin'i [[:$1]] ao amin'ny anaran-tsehatra nofidiana.",
+       "linkshere-2": "Ireo pejy ireo dia manana rohy mankany amin'i '''$1'''",
+       "nolinkshere-2": "Tsy nahitana pejy mirohy any amin'i '''$1'''.",
+       "nolinkshere-ns-2": "Tsy nahitana pejy mirohy any amin'i $1 ao amin'ny anaran-tsehatra nofidiana.",
        "isredirect": "pejy fihodinana",
        "istemplate": "tsofo-pejy",
        "isimage": "rohy mankany amin'ilay rakitra",
        "fileduplicatesearch-result-n": "Misy rakitra {{PLURAL:}}$2 mitovy amin'i « $1 ».",
        "specialpages": "Pejy manokana",
        "specialpages-note-top": "Maribolana",
+       "specialpages-note-restricted": "* Pejy manokana tsotra\n* <span class=\"mw-specialpagerestricted\">Pejy manokana voafetra ara-pijey.</span>",
        "specialpages-group-maintenance": "laogy hikojakojana",
        "specialpages-group-other": "Pejy manokana hafa",
        "specialpages-group-login": "Hiditra / hisoratra anarana",
index ab164a4..c9c2dc7 100644 (file)
        "whatlinkshere": "Тышке кондышо кылвер-влак",
        "whatlinkshere-title": "\"$1\" дене лаштык-влак кылым палемдат",
        "whatlinkshere-page": "Лаштык:",
-       "linkshere": "'''[[:$1]]''' лаштык дене кылдалтше лаштык-влак:",
-       "nolinkshere": "'''[[:$1]]''' лаштык дене тетла нимогай лаштык кылдалтын огыл",
-       "nolinkshere-ns": "Тыгай лӱм-влакын кумдыкышто '''[[:$1]]''' лаштык дене нимогай лаштык-влак огыт кылдалт.",
+       "linkshere-2": "'''$1''' лаштык дене кылдалтше лаштык-влак:",
+       "nolinkshere-2": "'''$1''' лаштык дене тетла нимогай лаштык кылдалтын огыл",
+       "nolinkshere-ns-2": "Тыгай лӱм-влакын кумдыкышто '''$1''' лаштык дене нимогай лаштык-влак огыт кылдалт.",
        "isredirect": "вес вере колтышо лаштык",
        "istemplate": "пуртымаш",
        "isimage": "файлыш кылвер",
index 62ccc4f..8b3b1db 100644 (file)
        "whatlinkshere": "Pautan baliak",
        "whatlinkshere-title": "Laman nan takaik ka \"$1\"",
        "whatlinkshere-page": "Laman:",
-       "linkshere": "Laman-laman ko bakaik ka '''[[:$1]]''':",
-       "nolinkshere": "Indak ado laman nan punyo tautan ka '''[[:$1]]'''.",
-       "nolinkshere-ns": "Indak ado pautan laman ka '''[[:$1]]''' pado ruang namo nan dipiliah.",
+       "linkshere-2": "Laman-laman ko bakaik ka '''$1''':",
+       "nolinkshere-2": "Indak ado laman nan punyo tautan ka '''$1'''.",
+       "nolinkshere-ns-2": "Indak ado pautan laman ka '''$1''' pado ruang namo nan dipiliah.",
        "isredirect": "laman pangaliahan",
        "istemplate": "transklusi",
        "isimage": "pautan berkas",
        "fileduplicatesearch-result-n": "Berkas \"$1\" ado {{PLURAL:$2|$2 duplikat nan samo}}.",
        "fileduplicatesearch-noresults": "Indak basobok berkas banamo \"$1\".",
        "specialpages": "Laman istimewa",
+       "specialpages-note-restricted": "!!FUZZY!!* Laman istimewa normal.\n* <span class=\"mw-specialpagerestricted\">Laman istimewa talarang.</span>\n* <span class=\"mw-specialpagecached\">Laman istimewa tasinggah (mungkin usang).</span>",
        "specialpages-group-maintenance": "Laporan pamaliharoan",
        "specialpages-group-other": "Lain-lain",
        "specialpages-group-login": "Masuak log / mandaftar",
index fc259b2..d6b6344 100644 (file)
        "protectedtitles-submit": "Прикажи наслови",
        "listusers": "Список на корисници",
        "listusers-editsonly": "Прикажи само корисници кои уредувале",
+       "listusers-temporarygroupsonly": "Прикажи само корисници во привремени кориснички групи",
        "listusers-creationsort": "Подреди по датум на создавање",
        "listusers-desc": "Подреди по надолен редослед",
        "usereditcount": "$1 {{PLURAL:$1|уредување|уредувања}}",
        "whatlinkshere": "Што води овде",
        "whatlinkshere-title": "Страници со врски што водат до „$1“",
        "whatlinkshere-page": "Страница:",
-       "linkshere": "Следните страници водат кон „'''[[:$1]]'''“:",
-       "nolinkshere": "Нема страници што водат кон '''[[:$1]]'''.",
-       "nolinkshere-ns": "Нема страници што водат кон '''[[:$1]]''' во избраниот именски простор.",
+       "linkshere-2": "Следните страници водат кон „'''$1'''“:",
+       "nolinkshere-2": "Нема страници што водат кон '''$1'''.",
+       "nolinkshere-ns-2": "Нема страници што водат кон '''$1''' во избраниот именски простор.",
        "isredirect": "пренасочувачка страница",
        "istemplate": "превметнување",
        "isimage": "врска до податотеката",
index bfd785d..75bf700 100644 (file)
        "subject-preview": "വിഷയം എങ്ങനെയുണ്ടെന്ന് കാണുക:",
        "previewerrortext": "താങ്കളുടെ മാറ്റങ്ങൾ എങ്ങനെയുണ്ടെന്ന് കാണാൻ ശ്രമിച്ചപ്പോൾ പിഴവുണ്ടായി.",
        "blockedtitle": "ഉപയോക്താവിനെ തടഞ്ഞിരിക്കുന്നു",
-       "blockedtext": "'''താങ്കളുടെ ഉപയോക്തൃനാമത്തേയോ താങ്കൾ ഇപ്പോൾ ലോഗിൻ ചെയ്തിട്ടുള്ള ഐ.പി. വിലാസത്തേയോ ഈ വിക്കി തിരുത്തുന്നതിൽ നിന്നു തടഞ്ഞിരിക്കുന്നു'''\n\n$1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്നതാണു് അതിനു രേഖപ്പെടുത്തിയിട്ടുള്ള കാരണം.\n\n* തടയലിന്റെ തുടക്കം: $8\n* തടയലിന്റെ കാലാവധി: $6\n* തടയപ്പെട്ട ഉപയോക്താവ്: $7\n\nഈ തടയലിനെ പറ്റി ചർച്ച ചെയ്യാൻ താങ്കൾക്ക് $1 എന്ന ഉപയോക്താവിനേയോ മറ്റ് [[{{MediaWiki:Grouppage-sysop}}|കാര്യനിർവാഹകരെയോ]] സമീപിക്കാവുന്നതാണ്. [[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളിൽ]] താങ്കൾ സാധുവായ ഇമെയിൽ വിലാസം കൊടുത്തിട്ടുണ്ടെങ്കിൽ, അതു അയക്കുന്നതിൽ നിന്നു താങ്കൾ തടയപ്പെട്ടിട്ടില്ലെങ്കിൽ, 'ഇദ്ദേഹത്തിന് ഇമെയിൽ അയക്കൂ' എന്ന സം‌വിധാനം ഉപയോഗിച്ച് താങ്കൾക്ക് മറ്റുപയോക്താക്കളുമായി ബന്ധപ്പെടാം. താങ്കളുടെ നിലവിലുള്ള ഐ.പി. വിലാസം $3 ഉം, താങ്കളുടെ തടയൽ ഐ.ഡി. #$5 ഉം ആണ്. ഇവ രണ്ടും താങ്കൾ കാര്യനിർവാഹകനെ ബന്ധപ്പെടുമ്പോൾ ചേർക്കുക.",
-       "autoblockedtext": "താങ്കളുടെ ഐ.പി. വിലാസം സ്വയം തടയപ്പെട്ടിരിക്കുന്നു, മറ്റൊരു ഉപയോക്താവ് ഉപയോഗിച്ച കാരണത്താൽ $1 എന്ന കാര്യനിർവാഹകനാണ് തടഞ്ഞുവെച്ചത്.\nഇതിനു കാരണമായി നൽകിയിട്ടുള്ളത്:\n\n:''$2''\n\n* തടയൽ തുടങ്ങിയത്: $8\n* തടയൽ അവസാനിക്കുന്നത്: $6\n* തടയാൻ ഉദ്ദേശിച്ചത്: $7\n\nഈ തടയലിനെ കുറിച്ച് ചർച്ച ചെയ്യാൻ താങ്കൾക്കു $1 എന്ന കാര്യനിവാഹകനേയോ മറ്റു [[{{MediaWiki:Grouppage-sysop}}|കാര്യനിർവാഹകരെയോ]] ബന്ധപ്പെടാവുന്നതാണ്.\n\nശ്രദ്ധിക്കുക [[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളിൽ]] സാധുവായ ഇമെയിൽ വിലാസം രേഖപ്പെടുത്താതിരിക്കുകയോ, അത് ഉപയോഗിക്കുന്നതിൽ നിന്ന് താങ്കളെ തടയുകയോ ചെയ്തിട്ടുണ്ടെങ്കിൽ \"ഇദ്ദേഹത്തിന് ഇമെയിൽ അയക്കൂ\" എന്ന സം‌വിധാനം പ്രവർത്തന രഹിതമായിരിക്കും.\n\nതാങ്കളുടെ നിലവിലുള്ള ഐ.പി. വിലാസം $3 ആണ്, താങ്കളുടെ തടയലിന്റെ ഐ.ഡി. #$5 ആകുന്നു.\nദയവായി മുകളിൽ കൊടുത്തിരിക്കുന്ന വിവരങ്ങളെല്ലാം താങ്കൾ നടത്തുന്ന അന്വേഷണങ്ങളിൽ ഉൾപ്പെടുത്തുവാൻ ശ്രദ്ധിക്കുക.",
+       "blockedtext": "<strong>താങ്കളുടെ ഉപയോക്തൃനാമത്തേയോ താങ്കൾ ഇപ്പോൾ ലോഗിൻ ചെയ്തിട്ടുള്ള ഐ.പി. വിലാസത്തേയോ ഈ വിക്കി തിരുത്തുന്നതിൽ നിന്നു തടഞ്ഞിരിക്കുന്നു</strong>\n\n$1 ആണ് ഈ തടയൽ നടത്തിയത്. <em>$2</em> എന്നതാണു് അതിനു രേഖപ്പെടുത്തിയിട്ടുള്ള കാരണം.\n\n* തടയലിന്റെ തുടക്കം: $8\n* തടയലിന്റെ കാലാവധി: $6\n* തടയപ്പെട്ട ഉപയോക്താവ്: $7\n\nഈ തടയലിനെ പറ്റി ചർച്ച ചെയ്യാൻ താങ്കൾക്ക് $1 എന്ന ഉപയോക്താവിനേയോ മറ്റ് [[{{MediaWiki:Grouppage-sysop}}|കാര്യനിർവാഹകരെയോ]] സമീപിക്കാവുന്നതാണ്. [[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളിൽ]] താങ്കൾ സാധുവായ ഇമെയിൽ വിലാസം കൊടുത്തിട്ടുണ്ടെങ്കിൽ, അതു അയക്കുന്നതിൽ നിന്നു താങ്കൾ തടയപ്പെട്ടിട്ടില്ലെങ്കിൽ, \"{{int:emailuser}}\" എന്ന സം‌വിധാനം ഉപയോഗിച്ച് താങ്കൾക്ക് മറ്റുപയോക്താക്കളുമായി ബന്ധപ്പെടാം. താങ്കളുടെ നിലവിലുള്ള ഐ.പി. വിലാസം $3 ഉം, താങ്കളുടെ തടയൽ ഐ.ഡി. #$5 ഉം ആണ്. ഇവ രണ്ടും താങ്കൾ കാര്യനിർവാഹകനെ ബന്ധപ്പെടുമ്പോൾ ചേർക്കുക.",
+       "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|താങ്കളുടെ ക്രമീകരണങ്ങളിൽ]] സാധുവായ ഇമെയിൽ വിലാസം രേഖപ്പെടുത്താതിരിക്കുകയോ, അത് ഉപയോഗിക്കുന്നതിൽ നിന്ന് താങ്കളെ തടയുകയോ ചെയ്തിട്ടുണ്ടെങ്കിൽ \"{{int:emailuser}}\" എന്ന സം‌വിധാനം പ്രവർത്തന രഹിതമായിരിക്കും.\n\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 ചെയ്യേണ്ടതാണ്",
        "whatlinkshere": "ഈ താളിലേക്കുള്ള കണ്ണികൾ",
        "whatlinkshere-title": "\"$1\" എന്ന താളിലേക്കുള്ള കണ്ണികൾ",
        "whatlinkshere-page": "താൾ:",
-       "linkshere": "താഴെക്കൊടുത്തിരിക്കുന്ന താളുകളിൽ നിന്നും '''[[:$1]]''' എന്ന താളിലേക്ക് കണ്ണികളുണ്ട്:",
-       "nolinkshere": "'''[[:$1]]''' എന്ന താളിലേക്ക് കണ്ണികളൊന്നും നിലവിലില്ല.",
-       "nolinkshere-ns": "തിരഞ്ഞെടുത്ത നാമമേഖലയിൽ '''[[:$1]]''' എന്ന താളിലേക്ക് മറ്റൊരു താളുകളിൽനിന്നും കണ്ണികളില്ല.",
+       "linkshere-2": "താഴെക്കൊടുത്തിരിക്കുന്ന താളുകളിൽ നിന്നും '''$1''' എന്ന താളിലേക്ക് കണ്ണികളുണ്ട്:",
+       "nolinkshere-2": "'''$1''' എന്ന താളിലേക്ക് കണ്ണികളൊന്നും നിലവിലില്ല.",
+       "nolinkshere-ns-2": "തിരഞ്ഞെടുത്ത നാമമേഖലയിൽ '''$1''' എന്ന താളിലേക്ക് മറ്റൊരു താളുകളിൽനിന്നും കണ്ണികളില്ല.",
        "isredirect": "തിരിച്ചുവിടൽ താൾ",
        "istemplate": "ഉൾപ്പെടുത്തൽ",
        "isimage": "പ്രമാണത്തിന്റെ കണ്ണി",
index bc64d1c..113c30f 100644 (file)
        "whatlinkshere": "Энд холбогдсон хуудсууд",
        "whatlinkshere-title": "\"$1\"-д холбоостой хуудаснууд",
        "whatlinkshere-page": "Хуудас:",
-       "linkshere": "Дараах хуудсууд '''[[:$1]]'''-тай холбогдсон байна:",
-       "nolinkshere": "'''[[:$1]]'''-тай холбогдсон хуудас байхгүй байна.",
-       "nolinkshere-ns": "Сонгосон нэрний зайд '''[[:$1]]''' руу холбогдсон хуудас байхгүй байна.",
+       "linkshere-2": "Дараах хуудсууд '''$1'''-тай холбогдсон байна:",
+       "nolinkshere-2": "'''$1'''-тай холбогдсон хуудас байхгүй байна.",
+       "nolinkshere-ns-2": "Сонгосон нэрний зайд '''$1''' руу холбогдсон хуудас байхгүй байна.",
        "isredirect": "чиглүүлэгч",
        "istemplate": "оруулалт",
        "isimage": "файлын холбоос",
        "fileduplicatesearch-noresults": "\"$1\" нэртэй файл олдсонгүй.",
        "specialpages": "Тусгай хуудсууд",
        "specialpages-note-top": "Томъёолбор",
+       "specialpages-note-restricted": "* Ердийн тусгай хуудсууд.\n* <strong class=\"mw-specialpagerestricted\">Хориотой тусгай хуудсууд.</strong>",
        "specialpages-group-maintenance": "Засвар үйлчилгээний тайлангууд",
        "specialpages-group-other": "Бусад тусгай хуудсууд",
        "specialpages-group-login": "Нэвтрэх / бүртгүүлэх",
index 5fb8c78..e860acb 100644 (file)
        "whatlinkshere": "येथे काय जोडले आहे",
        "whatlinkshere-title": "\"$1\" ला जुळलेली पाने",
        "whatlinkshere-page": "पान:",
-       "linkshere": "खालील लेख '''[[:$1]]''' या पानांशी जोडले आहेत:",
-       "nolinkshere": "'''[[:$1]]''' येथे कोणत्याही पानांचे दुवे नाहीत.",
-       "nolinkshere-ns": "निवडलेल्या नामविश्वातील कोणतीही पाने <strong>[[:$1]]</strong>ला दुवा देत नाहीत .",
+       "linkshere-2": "खालील लेख '''$1''' या पानांशी जोडले आहेत:",
+       "nolinkshere-2": "'''$1''' येथे कोणत्याही पानांचे दुवे नाहीत.",
+       "nolinkshere-ns-2": "निवडलेल्या नामविश्वातील कोणतीही पाने <strong>$1</strong>ला दुवा देत नाहीत .",
        "isredirect": "पुनर्निर्देशित पान",
        "istemplate": "आंतर्न्यास (ट्रांसक्लूजन)",
        "isimage": "संचिका दुवा",
index 771c077..96132fd 100644 (file)
        "whatlinkshere": "Pautan ke laman ini",
        "whatlinkshere-title": "Laman yang mengandungi pautan ke \"$1\"",
        "whatlinkshere-page": "Laman:",
-       "linkshere": "Laman-laman berikut mengandungi pautan ke '''[[:$1]]''':",
-       "nolinkshere": "Tiada laman yang mengandungi pautan ke '''[[:$1]]'''.",
-       "nolinkshere-ns": "Tiada laman yang mengandungi pautan ke '''[[:$1]]''' dalam ruang nama yang dinyatakan.",
+       "linkshere-2": "Laman-laman berikut mengandungi pautan ke '''$1''':",
+       "nolinkshere-2": "Tiada laman yang mengandungi pautan ke '''$1'''.",
+       "nolinkshere-ns-2": "Tiada laman yang mengandungi pautan ke '''$1''' dalam ruang nama yang dinyatakan.",
        "isredirect": "laman lencongan",
        "istemplate": "penyertaan",
        "isimage": "pautan fail",
        "fileduplicatesearch-noresults": "Tidak ada gambar-gambar dengan nama \"$1\" dijumpai.",
        "specialpages": "Laman khas",
        "specialpages-note-top": "Petunjuk",
+       "specialpages-note-restricted": "* Laman khas biasa.\n* <span class=\"mw-specialpagerestricted\">Laman khas terhad.</span>",
        "specialpages-group-maintenance": "Laporan penyenggaraan",
        "specialpages-group-other": "Laman khas lain",
        "specialpages-group-login": "Log masuk / buka akaun",
index 958bdae..e67b778 100644 (file)
        "whatlinkshere": "Li jwasslu 'l hawn",
        "whatlinkshere-title": "Paġni li jippuntaw lejn $1",
        "whatlinkshere-page": "Paġna:",
-       "linkshere": "Il-paġni segwenti jorbtu lejn '''[[:$1]]''':",
-       "nolinkshere": "L-ebda paġna ma twassal għal '''[[:$1]]'''.",
-       "nolinkshere-ns": "L-ebda paġna ma tipponta lejn '''[[:$1]]''' fl-ispazju tal-isem magħżul.",
+       "linkshere-2": "Il-paġni segwenti jorbtu lejn '''$1''':",
+       "nolinkshere-2": "L-ebda paġna ma twassal għal '''$1'''.",
+       "nolinkshere-ns-2": "L-ebda paġna ma tipponta lejn '''$1''' fl-ispazju tal-isem magħżul.",
        "isredirect": "paġna ta' rindirizz",
        "istemplate": "inklużjoni",
        "isimage": "ħolqa lejn il-fajl",
        "fileduplicatesearch-noresults": "Ma nstab l-ebda fajl bl-isem \"$1\".",
        "specialpages": "Paġni speċjali",
        "specialpages-note-top": "Leġġenda",
+       "specialpages-note-restricted": "* Paġni speċjali normali.\n* <span class=\"mw-specialpagerestricted\">Paġni speċjali ristretti.</span>",
        "specialpages-group-maintenance": "Rapporti ta' manutenzjoni",
        "specialpages-group-other": "Paġni speċjali oħrajn",
        "specialpages-group-login": "Idħol / oħloq kont",
index 516b4fc..297cde8 100644 (file)
        "whatlinkshere": "L que lhiga eiqui",
        "whatlinkshere-title": "Páiginas que lhígan a \"$1\"",
        "whatlinkshere-page": "Páigina:",
-       "linkshere": "Estas páiginas ténen lhigaçones pa <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Nun eisisten lhigaçones pa '''[[:$1]]'''.",
+       "linkshere-2": "Estas páiginas ténen lhigaçones pa <strong>$1</strong>:",
+       "nolinkshere-2": "Nun eisisten lhigaçones pa '''$1'''.",
        "isredirect": "páigina de ancaminamiento",
        "istemplate": "ancluson",
        "isimage": "lhigaçon pa l fexeiro",
index 397c965..912a2b6 100644 (file)
        "whatlinkshere": "ဘယ်ကလင့်ခ်ထားလဲ",
        "whatlinkshere-title": "\"$1\" သို့ ချိတ်ဆက်ထားသော စာမျက်နှာများ",
        "whatlinkshere-page": "စာမျက်နှာ -",
-       "linkshere": "အောက်ပါစာမျက်နှာများသည် <strong>[[:$1]]</strong> သို့ ချိတ်ဆက်ထားသည် -",
-       "nolinkshere": "'''[[:$1]]''' သို့ လင့်ထားသော စာမျက်နှာ မရှိပါ။",
+       "linkshere-2": "အောက်ပါစာမျက်နှာများသည် <strong>$1</strong> သို့ ချိတ်ဆက်ထားသည် -",
+       "nolinkshere-2": "'''$1''' သို့ လင့်ထားသော စာမျက်နှာ မရှိပါ။",
        "isredirect": "ပြန်ညွှန်းသော စာမျက်နှာ",
        "istemplate": "ထည့်သွင်းကူးယူချက်",
        "isimage": "ဖိုင်လင့်",
index c78c814..903c2c4 100644 (file)
        "whatlinkshere": "Мезе тезэнь сюлмави",
        "whatlinkshere-title": "$1 марто сюлмазь лопатне",
        "whatlinkshere-page": "Лопась:",
-       "linkshere": "Сыця лопатьне сюлмававить '''[[:$1]]''' марто:",
-       "nolinkshere": "Кодаткак лопат асульмавить '''[[:$1]]''' марто.",
+       "linkshere-2": "Сыця лопатьне сюлмававить '''$1''' марто:",
+       "nolinkshere-2": "Кодаткак лопат асульмавить '''$1''' марто.",
        "isredirect": "Лиякс витнинк-петнинк лопанть",
        "istemplate": "совавтомс",
        "isimage": "файлань сюлмавома пене",
index 2aeac60..b4e276f 100644 (file)
        "whatlinkshere": "لینک‌ئون ِاینتا صفحه",
        "whatlinkshere-title": "وألـگ‌ئونی که \"$1\" ره لـیـنک هه‌دانه",
        "whatlinkshere-page": "صفحه:",
-       "linkshere": "اینان صفحه‌ئون به '''[[:$1]]''' لینک هدانه:",
+       "linkshere-2": "اینان صفحه‌ئون به '''$1''' لینک هدانه:",
        "isredirect": "دکشی‌ین صفحه",
        "istemplate": "تراگنجانش‌ئون",
        "isimage": "فایل ِلینک",
index e7aa2ae..8c0c31b 100644 (file)
        "whatlinkshere": "In tlein quitzonhuilia nican",
        "whatlinkshere-title": "Zāzaniltin quitzonhuiliah $1",
        "whatlinkshere-page": "Tlahcuilolamatl:",
-       "linkshere": "Inīn zāzaniltin quitzonhuiliah '''[[:$1]]''' īhuīc:",
-       "nolinkshere": "Ahtle quitzonhuilia '''[[:$1]]''' īhuīc.",
+       "linkshere-2": "Inīn zāzaniltin quitzonhuiliah '''$1''' īhuīc:",
+       "nolinkshere-2": "Ahtle quitzonhuilia '''$1''' īhuīc.",
        "isredirect": "Tlacueptli tlahcuilolamatl",
        "isimage": "īxiptlahtli tzonhuiliztli",
        "whatlinkshere-prev": "{{PLURAL:$1|achtopa|$1 achtopa}}",
        "fileduplicatesearch-submit": "Tlatemoliztli",
        "fileduplicatesearch-info": "$1 × $2 pixelli<br />Tlahcuilōlli īxquichiliz: $3<br />MIME iuhcāyōtl: $4",
        "specialpages": "Noncuahquizqui tlahcuilolli",
+       "specialpages-note-restricted": "!!FUZZY!!* Yeliztli nōncuahquīzqui āmatl.\n* <span class=\"mw-specialpagerestricted\">Tlaquīxtīlli nōncuahquīzqui āmatl.</span>\n* <span class=\"mw-specialpagecached\">Tlatlātīlli nōncuahquīzqui āmatl (aocmo monemitīa).</span>",
        "specialpages-group-other": "Oksẻki nònkuâkìskàtlaìxtlapaltìn",
        "specialpages-group-login": "Ximocalaqui / ximomachiyōmaca",
        "specialpages-group-changes": "Yancuīc tlapatlaliztli īhuān tlahcuilōlloh",
index f7fcfc6..93069ae 100644 (file)
        "whatlinkshere": "Tó-ūi liân kàu chia",
        "whatlinkshere-title": "Liân khì \"$1\" ê ia̍h-bīn",
        "whatlinkshere-page": "Ia̍h:",
-       "linkshere": "Í-hā '''[[:$1]]''' liân kàu chia:",
-       "nolinkshere": "Bô poàⁿ ia̍h liân kàu '''[[:$1]]'''.",
+       "linkshere-2": "Í-hā '''$1''' liân kàu chia:",
+       "nolinkshere-2": "Bô poàⁿ ia̍h liân kàu '''$1'''.",
        "isredirect": "choán-ia̍h",
        "isimage": "tóng-àn liân-kiat",
        "whatlinkshere-prev": "{{PLURAL:$1|chêng|chêng $1 ê}}",
index 09f09f2..2f060be 100644 (file)
        "whatlinkshere": "Paggene ca cullegano a chesta",
        "whatlinkshere-title": "Paggene ca cullegano a $1",
        "whatlinkshere-page": "Paggena:",
-       "linkshere": "'E paggene ccà abbascio cunteneno jonte ca spuntano a '''[[:$1]]'''.",
-       "nolinkshere": "Nisciuna paggena cuntene jonte ca spuntasse a <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "Nun ce stanno paggene ca spuntassero '''[[:$1]]''' dint' 'o namespace scigliuto.",
+       "linkshere-2": "'E paggene ccà abbascio cunteneno jonte ca spuntano a '''$1'''.",
+       "nolinkshere-2": "Nisciuna paggena cuntene jonte ca spuntasse a <strong>$1</strong>.",
+       "nolinkshere-ns-2": "Nun ce stanno paggene ca spuntassero '''$1''' dint' 'o namespace scigliuto.",
        "isredirect": "redirect a paggena",
        "istemplate": "'nclusione",
        "isimage": "Cullegamente a file multimediale",
        "fileduplicatesearch-noresults": "Nisciuno file chiamato \"$1\" è stato accucchiato.",
        "specialpages": "Paggene speciale",
        "specialpages-note-top": "Liggenda",
+       "specialpages-note-restricted": "* Paggene speciale normale.\n* <span class=\"mw-specialpagerestricted\">Paggene speciale ch' 'e restriziune.</span>",
        "specialpages-group-maintenance": "Report 'e manutenzione",
        "specialpages-group-other": "Ati paggene speciale",
        "specialpages-group-login": "Trasite o criate n'acciesso nuovo",
index 8cb49f4..b847a1d 100644 (file)
        "whatlinkshere": "Lenker hit",
        "whatlinkshere-title": "Sider som lenker til «$1»",
        "whatlinkshere-page": "Side:",
-       "linkshere": "Følgende sider lenker til '''[[:$1]]''':",
-       "nolinkshere": "Ingen sider lenker til '''[[:$1]]'''.",
-       "nolinkshere-ns": "Ingen sider lenker til '''[[:$1]]''' i valgte navnerom.",
+       "linkshere-2": "Følgende sider lenker til '''$1''':",
+       "nolinkshere-2": "Ingen sider lenker til '''$1'''.",
+       "nolinkshere-ns-2": "Ingen sider lenker til '''$1''' i valgte navnerom.",
        "isredirect": "omdirigeringsside",
        "istemplate": "transklusjon",
        "isimage": "fillenke",
index d394c0c..c7cc0c6 100644 (file)
        "whatlinkshere": "Verwysingen hyrhinne",
        "whatlinkshere-title": "Ziejen die verwiezen naor \"$1\"",
        "whatlinkshere-page": "Zied:",
-       "linkshere": "Disse ziejen verwiezen naor '''[[:$1]]''':",
-       "nolinkshere": "Gien enkele zied verwis naor '''[[:$1]]'''.",
-       "nolinkshere-ns": "Gien enkele zied verwis naor '''[[:$1]]''' in de ekeuzen naamruumte.",
+       "linkshere-2": "Disse ziejen verwiezen naor '''$1''':",
+       "nolinkshere-2": "Gien enkele zied verwis naor '''$1'''.",
+       "nolinkshere-ns-2": "Gien enkele zied verwis naor '''$1''' in de ekeuzen naamruumte.",
        "isredirect": "deurverwiezing",
        "istemplate": "in-evoegd as mal",
        "isimage": "bestaandsverwiezing",
        "fileduplicatesearch-noresults": "Der is gien bestaand mit de naam \"$1\" evunnen.",
        "specialpages": "Speciale syden",
        "specialpages-note-top": "Legenda",
+       "specialpages-note-restricted": "* Normale spesiale ziejen.\n* <span class=\"mw-specialpagerestricted\">Beparkt toegankelike spesiale ziejen.</span>",
        "specialpages-group-maintenance": "Onderhoudsliesten",
        "specialpages-group-other": "Aandere spesiale ziejen",
        "specialpages-group-login": "Anmelden / inschrieven",
index 27d9101..21cb3bc 100644 (file)
        "whatlinkshere": "Wat wiest na disse Siet hen",
        "whatlinkshere-title": "Sieden, de na „$1“ wiest",
        "whatlinkshere-page": "Siet:",
-       "linkshere": "Disse Sieden wiest na '''„[[:$1]]“''':",
-       "nolinkshere": "Kene Siet wiest na '''„[[:$1]]“'''.",
-       "nolinkshere-ns": "Kene Sieden wiest na '''[[:$1]]''' in’n utwählten Naamruum.",
+       "linkshere-2": "Disse Sieden wiest na '''„$1“''':",
+       "nolinkshere-2": "Kene Siet wiest na '''„$1“'''.",
+       "nolinkshere-ns-2": "Kene Sieden wiest na '''$1''' in’n utwählten Naamruum.",
        "isredirect": "Wiederleiden",
        "istemplate": "inbunnen dör Vörlaag",
        "isimage": "Dateilenk",
        "fileduplicatesearch-result-1": "To de Datei „$1“ gifft dat keen Datei, de jüst gliek is.",
        "fileduplicatesearch-result-n": "To de Datei „$1“ gifft dat {{PLURAL:$2|ene Datei, de jüst gliek is|$2 Datein, de jüst gliek sünd}}.",
        "specialpages": "Sünnerliche Sieden",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* Normale Spezialsieden\n* <strong class=\"mw-specialpagerestricted\">Spezialsieden för Brukers mit mehr Rechten</strong>",
        "specialpages-group-maintenance": "Pleeglisten",
        "specialpages-group-other": "Annere Spezialsieden",
        "specialpages-group-login": "Anmellen",
index 914c8f9..1e22e2a 100644 (file)
        "whatlinkshere": "यहाँ के जोडिन्छ",
        "whatlinkshere-title": "$1 सँग जोडिएका पानाहरू",
        "whatlinkshere-page": "पृष्ठ:",
-       "linkshere": "निम्न पृष्ठहरू '''[[:$1]]''' मा जोडिन्छ :",
-       "nolinkshere": " '''[[:$1]]'''मा लिंक भएका कुनै पृष्ठहरू छैनन्",
-       "nolinkshere-ns": "चुनिएको नामस्थानमा '''[[:$1]]''' सित जोडिने पृष्ठहरू छैनन्।",
+       "linkshere-2": "निम्न पृष्ठहरू '''$1''' मा जोडिन्छ :",
+       "nolinkshere-2": " '''$1'''मा लिंक भएका कुनै पृष्ठहरू छैनन्",
+       "nolinkshere-ns-2": "चुनिएको नामस्थानमा '''$1''' सित जोडिने पृष्ठहरू छैनन्।",
        "isredirect": "अनुप्रेषित पृष्ठ",
        "istemplate": "पारदर्शिता",
        "isimage": "फाइल लिङ्क",
        "fileduplicatesearch-noresults": "\"$1\" नामको फाइल पाइएन।",
        "specialpages": "विशेष पृष्ठ",
        "specialpages-note-top": "आदर्श वाक्य",
+       "specialpages-note-restricted": "* साधारण विशेष पृष्ठहरू।\n* <span class=\"mw-specialpagerestricted\">निषेधित विशेष पृष्ठहरू।</span>",
        "specialpages-group-maintenance": "मर्मत प्रतिवेदनहरू",
        "specialpages-group-other": "अरू विशेष पृष्ठहरू",
        "specialpages-group-login": "प्रवेश गर्ने / नयाँ खाता बनाउने",
index 83e855f..4547ad8 100644 (file)
        "whatlinkshere": "Verwijzingen naar deze pagina",
        "whatlinkshere-title": "Pagina's die verwijzen naar \"$1\"",
        "whatlinkshere-page": "Pagina:",
-       "linkshere": "De volgende pagina's verwijzen naar '''[[:$1]]''':",
-       "nolinkshere": "Geen enkele pagina verwijst naar '''[[:$1]]'''.",
-       "nolinkshere-ns": "Geen enkele pagina in de gekozen naamruimte verwijst naar '''[[:$1]]'''.",
+       "linkshere-2": "De volgende pagina's verwijzen naar '''$1''':",
+       "nolinkshere-2": "Geen enkele pagina verwijst naar '''$1'''.",
+       "nolinkshere-ns-2": "Geen enkele pagina in de gekozen naamruimte verwijst naar '''$1'''.",
        "isredirect": "doorverwijspagina",
        "istemplate": "ingevoegd als sjabloon",
        "isimage": "bestandskoppeling",
index fcd18d5..72ebc90 100644 (file)
        "whatlinkshere": "Lenkjer hit",
        "whatlinkshere-title": "Sider som har lenkje til «$1»",
        "whatlinkshere-page": "Side:",
-       "linkshere": "Desse sidene har lenkjer til '''[[:$1]]''':",
-       "nolinkshere": "Ingen sider har lenkjer til '''[[:$1]]'''.",
-       "nolinkshere-ns": "Ingen sider har lenkje til '''[[:$1]]''' i det valde namnerommet.",
+       "linkshere-2": "Desse sidene har lenkjer til '''$1''':",
+       "nolinkshere-2": "Ingen sider har lenkjer til '''$1'''.",
+       "nolinkshere-ns-2": "Ingen sider har lenkje til '''$1''' i det valde namnerommet.",
        "isredirect": "omdirigeringsside",
        "istemplate": "inkludert som mal",
        "isimage": "fillenkje",
        "fileduplicatesearch-noresults": "Fann inga fil med namnet «$1».",
        "specialpages": "Spesialsider",
        "specialpages-note-top": "Tyding",
+       "specialpages-note-restricted": "* Vanlege spesialsider.\n* <span class=\"mw-specialpagerestricted\">Spesialsider med avgrensa tilgang.</span>",
        "specialpages-group-maintenance": "Vedlikehaldsrapportar",
        "specialpages-group-other": "Andre spesialsider",
        "specialpages-group-login": "Logga inn / oppretta brukarkonto",
index a2a5427..702f91e 100644 (file)
        "whatlinkshere": "Ke eng yeo e hlomaganyago mo",
        "whatlinkshere-title": "Matlakala a go hlomaganya go \"$1\"",
        "whatlinkshere-page": "Letlakala:",
-       "linkshere": "Matlaka a latelago a hlomaganya le '''[[:$1]]''':",
-       "nolinkshere": "Ga go letlakala leo le hlomaganyago go '''[[:$1]]'''.",
+       "linkshere-2": "Matlaka a latelago a hlomaganya le '''$1''':",
+       "nolinkshere-2": "Ga go letlakala leo le hlomaganyago go '''$1'''.",
        "isredirect": "''redirect'' letlakala",
        "istemplate": "tsentšho",
        "isimage": "Hlomaganyo ya Faele",
index a575d20..239d754 100644 (file)
        "whatlinkshere": "natj beda nitja",
        "whatlinkshere-title": "Bibol beda $1",
        "whatlinkshere-page": "Bibol:",
-       "linkshere": "Ngawaliny bibol beda-ang <strong>[[:$1]]</strong>",
-       "nolinkshere": "Uart bibol beda <strong>[[:$1]]</strong>.",
+       "linkshere-2": "Ngawaliny bibol beda-ang <strong>$1</strong>",
+       "nolinkshere-2": "Uart bibol beda <strong>$1</strong>.",
        "isredirect": "Dtallangiritch bibol",
        "istemplate": "transclusion",
        "isimage": "file beda",
index 20f022a..400d86a 100644 (file)
        "whatlinkshere": "Paginas ligadas a aquesta",
        "whatlinkshere-title": "Paginas que puntan cap a « $1 »",
        "whatlinkshere-page": "Pagina :",
-       "linkshere": "Las paginas çaijós contenon un ligam cap a '''[[:$1]]''':",
-       "nolinkshere": "Cap de pagina conten pas de ligam cap a '''[[:$1]]'''.",
-       "nolinkshere-ns": "Cap de pagina conten pas de ligam cap a '''[[:$1]]''' dins l’espaci de nom causit.",
+       "linkshere-2": "Las paginas çaijós contenon un ligam cap a '''$1''':",
+       "nolinkshere-2": "Cap de pagina conten pas de ligam cap a '''$1'''.",
+       "nolinkshere-ns-2": "Cap de pagina conten pas de ligam cap a '''$1''' dins l’espaci de nom causit.",
        "isredirect": "pagina de redireccion",
        "istemplate": "inclusion",
        "isimage": "ligam cap al fichièr",
        "fileduplicatesearch-noresults": "Cap de fichièr nomenat « $1 » es pas estat trobat.",
        "specialpages": "Paginas especialas",
        "specialpages-note-top": "Legenda",
+       "specialpages-note-restricted": "* Paginas especialas normalas.\n* <span class=\"mw-specialpagerestricted\">Paginas especialas restrentas.</span>",
        "specialpages-group-maintenance": "Rapòrts de mantenença",
        "specialpages-group-other": "Autras paginas especialas",
        "specialpages-group-login": "S'identificar / s'inscriure",
index e6412b9..f2433a8 100644 (file)
        "whatlinkshere": "Linkit tänne",
        "whatlinkshere-title": "Sivut, kudamat kosketah sivuu \"$1\"",
        "whatlinkshere-page": "Sivu:",
-       "linkshere": "Nämmä sivut linkittiäkseh sivuh <strong>[[:$1]]</strong>:",
+       "linkshere-2": "Nämmä sivut linkittiäkseh sivuh <strong>$1</strong>:",
        "isredirect": "uvvellehohjavussivu",
        "istemplate": "sizällyttämine",
        "isimage": "failan linku",
index b7503ec..06aa815 100644 (file)
        "whatlinkshere": "ଏଠାରେ ଥିବା ଲିଙ୍କ",
        "whatlinkshere-title": "\"$1\" କୁ ପୃଷ୍ଠା ଲିଙ୍କ",
        "whatlinkshere-page": "ପୃଷ୍ଠା:",
-       "linkshere": "ଏହି ପୃଷ୍ଠା ସବୁ  <strong>[[:$1]]</strong> ସହ ଯୋଡ଼ା ଯାଇଅଛି:",
-       "nolinkshere": "'''[[:$1]]''' ସହିତ କୌଣସିଟି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
-       "nolinkshere-ns": "ବଛା ଯାଇଥିବା ନେମସ୍ପେସରେ '''[[:$1]]''' ନାଆଁ ସହ କୌଣସି ବି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
+       "linkshere-2": "ଏହି ପୃଷ୍ଠା ସବୁ  <strong>$1</strong> ସହ ଯୋଡ଼ା ଯାଇଅଛି:",
+       "nolinkshere-2": "'''$1''' ସହିତ କୌଣସିଟି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
+       "nolinkshere-ns-2": "ବଛା ଯାଇଥିବା ନେମସ୍ପେସରେ '''$1''' ନାଆଁ ସହ କୌଣସି ବି ପୃଷ୍ଠା ଯୋଡ଼ାଯାଇନାହିଁ ।",
        "isredirect": "ଆଉଥରେ ଫେରିବା ପୃଷ୍ଠା",
        "istemplate": "ଆଧାର ସହ ଭିତରେ ରଖିବା",
        "isimage": "ଫାଇଲର ଲିଙ୍କ",
        "fileduplicatesearch-noresults": "\"$1\" ନାମରେ ଗୋଟିଏ ବି ଫାଇଲ ମିଳିଲା ନାହିଁ ।",
        "specialpages": "ବିଶେଷ ପୃଷ୍ଠା",
        "specialpages-note-top": "ଲିଜେଣ୍ଡ",
+       "specialpages-note-restricted": "* ସାଧାରଣ ବିଶେଷ ପୃଷ୍ଠାମାନ ।\n* <span class=\"mw-specialpagerestricted\">କିଳାଯାଇଥିବା ବିଶେଷ ପୃଷ୍ଠାମାନ ।</span>",
        "specialpages-group-maintenance": "ରକ୍ଷଣାବେକ୍ଷଣା ବିବରଣୀ",
        "specialpages-group-other": "ବାକି ବିଶେଷ ପୃଷ୍ଠା",
        "specialpages-group-login": "ଲଗ-ଇନ (Log in)/ ନୂଆ ଖାତା ଖୋଲିବେ (Sign up)",
index 554b2b4..dea5c69 100644 (file)
        "whatlinkshere": "Чи æрвиты ардæм",
        "whatlinkshere-title": "Фæрстæ, кæдон æрвитынц ардæм: «$1»",
        "whatlinkshere-page": "Фарс:",
-       "linkshere": "Ацы фæрстæ æрвитынц '''[[:$1|{{grammar:allative|$1}}]]''':",
-       "nolinkshere": "Никæцы фарс æрвиты ардæм: '''[[:$1]]'''.",
-       "nolinkshere-ns": "Амынд номдоны мидæг никæцы фарс æрвиты ардæм <strong>[[:$1]]</strong>.",
+       "linkshere-2": "Ацы фæрстæ æрвитынц '''$1''':",
+       "nolinkshere-2": "Никæцы фарс æрвиты ардæм: '''$1'''.",
+       "nolinkshere-ns-2": "Амынд номдоны мидæг никæцы фарс æрвиты ардæм <strong>$1</strong>.",
        "isredirect": "æрвитæн фарс",
        "istemplate": "æфтыдæй",
        "isimage": "файлмæ æрвитæн",
index 32fbc0b..af9527f 100644 (file)
        "whatlinkshere": "ਇੱਥੇ ਕੀ ਆ ਕੇ ਜੁੜਦਾ ਹੈ",
        "whatlinkshere-title": "$1 ਨਾਲ ਜੋੜਨ ਵਾਲੇ ਸਫ਼ੇ",
        "whatlinkshere-page": "ਸਫ਼ਾ:",
-       "linkshere": "ਇਹ ਪੰਨੇ '''[[:$1]]''' ਨਾਲ ਜੋੜਦੇ ਹਨ:",
-       "nolinkshere": "ਕੋਈ ਵੀ ਸਫ਼ਾ '''[[:$1]]''' ਨਾਲ ਨਹੀਂ ਜੋੜਦਾ।",
+       "linkshere-2": "ਇਹ ਪੰਨੇ '''$1''' ਨਾਲ ਜੋੜਦੇ ਹਨ:",
+       "nolinkshere-2": "ਕੋਈ ਵੀ ਸਫ਼ਾ '''$1''' ਨਾਲ ਨਹੀਂ ਜੋੜਦਾ।",
        "isredirect": "ਰੀਡਿਰੈਕਟ ਸਫ਼ਾ",
        "istemplate": "ਟਾਕਰਾ ਕਰੋ",
        "isimage": "ਫ਼ਾਈਲ ਲਿੰਕ",
index e8d4495..4b23940 100644 (file)
        "whatlinkshere": "Deng pakasuglung keti",
        "whatlinkshere-title": "Deng bulung a makasuglung king \"$1\"",
        "whatlinkshere-page": "Bulung:",
-       "linkshere": "Pakasuglung la king '''[[:$1]]''' deng makatuking bulung:",
-       "nolinkshere": "Alang bulung a makasuglung king '''[[:$1]]'''.",
-       "nolinkshere-ns": "Alang bulung a makatuglung king '''[[:$1]]''' ketang mepiling pirinan lagyu (namespace).",
+       "linkshere-2": "Pakasuglung la king '''$1''' deng makatuking bulung:",
+       "nolinkshere-2": "Alang bulung a makasuglung king '''$1'''.",
+       "nolinkshere-ns-2": "Alang bulung a makatuglung king '''$1''' ketang mepiling pirinan lagyu (namespace).",
        "isredirect": "Bulung ning pamanaliling direksiun",
        "istemplate": "misingit",
        "isimage": "Isuglung king larawan",
index 089fc13..095b06a 100644 (file)
        "whatlinkshere": "Cha lie quoé ichi",
        "whatlinkshere-title": "Paches qu'il ont des loïens aveuc \"$1\"",
        "whatlinkshere-page": "Pache:",
-       "linkshere": "Chés paches-lo il sont érliées à '''[[:$1]]''':",
-       "nolinkshere": "i n'y o poin d'pache aveuc un loïen vers  '''[[:$1]]'''.",
-       "nolinkshere-ns": "i n'y o poin d'pache aveuc un loïen vers '''[[:$1]]''' dins echl'éspace d'noms coési.",
+       "linkshere-2": "Chés paches-lo il sont érliées à '''$1''':",
+       "nolinkshere-2": "i n'y o poin d'pache aveuc un loïen vers  '''$1'''.",
+       "nolinkshere-ns-2": "i n'y o poin d'pache aveuc un loïen vers '''$1''' dins echl'éspace d'noms coési.",
        "isredirect": "pache érdirigée",
        "istemplate": "transclusion",
        "isimage": "Loïen aveuc l'fichié",
        "version-specialpages": "Paches éspéchiales",
        "fileduplicatesearch": "Dénicher chés doublons",
        "specialpages": "Paches éspéchiales",
+       "specialpages-note-restricted": "!!FUZZY!!* Paches éspéchiales conformes.\n* <span class=\"mw-specialpagerestricted\">Paches éspéchiales réstrintes.</span>\n* <span class=\"mw-specialpagecached\">Paches éspéchiales seulemint in muche (pétète des viuseries).</span>",
        "specialpages-group-maintenance": "Rapports d'maintenanche",
        "specialpages-group-other": "Eutes paches éspéchiales",
        "specialpages-group-changes": "Darins canjemints pi gazètes",
index fd24862..b421a6a 100644 (file)
        "whatlinkshere": "Was dohea zaische dud",
        "whatlinkshere-title": "Saide wu uff \"$1\" valing'gn",
        "whatlinkshere-page": "Said:",
-       "linkshere": "Die Saide valing'gn uff '''[[:$1]]''':",
-       "nolinkshere": "Kä Said zaischd uff '''[[:$1]]'''.",
+       "linkshere-2": "Die Saide valing'gn uff '''$1''':",
+       "nolinkshere-2": "Kä Said zaischd uff '''$1'''.",
        "isredirect": "Waidalaidungsaid",
        "istemplate": "Vorlacheoibindung",
        "isimage": "Dadailing'g",
index 38ab558..f65ed97 100644 (file)
        "whatlinkshere": "Linkujące",
        "whatlinkshere-title": "Strony linkujące do „$1”",
        "whatlinkshere-page": "Strona:",
-       "linkshere": "Następujące strony odwołują się do '''[[:$1]]''':",
-       "nolinkshere": "Żadna strona nie odwołuje się do '''[[:$1]]'''.",
-       "nolinkshere-ns": "Żadna strona nie odwołuje się do '''[[:$1]]''' w wybranej przestrzeni nazw.",
+       "linkshere-2": "Następujące strony odwołują się do '''$1''':",
+       "nolinkshere-2": "Żadna strona nie odwołuje się do '''$1'''.",
+       "nolinkshere-ns-2": "Żadna strona nie odwołuje się do '''$1''' w wybranej przestrzeni nazw.",
        "isredirect": "strona przekierowująca",
        "istemplate": "dołączony szablon",
        "isimage": "link do pliku",
index 5cd407a..5a88383 100644 (file)
        "whatlinkshere": "Pàgine con dj'anliure che a men-o a costa-sì",
        "whatlinkshere-title": "Pàgine ch'a men-o a «$1»",
        "whatlinkshere-page": "Pàgina:",
-       "linkshere": "Le pàgine sì-sota a l'han andrinta dj'anliure che a men-o a '''[[:$1]]''':",
-       "nolinkshere": "A-i é pa gnun-a pàgina che a l'abia dj'anliure che a men-o a '''[[:$1]]'''.",
-       "nolinkshere-ns": "An cost ëspassi nominal-sì a-i é gnun-e pàgine con dj'anliure ch'a men-o a '''[[:$1]]'''.",
+       "linkshere-2": "Le pàgine sì-sota a l'han andrinta dj'anliure che a men-o a '''$1''':",
+       "nolinkshere-2": "A-i é pa gnun-a pàgina che a l'abia dj'anliure che a men-o a '''$1'''.",
+       "nolinkshere-ns-2": "An cost ëspassi nominal-sì a-i é gnun-e pàgine con dj'anliure ch'a men-o a '''$1'''.",
        "isredirect": "ridiression",
        "istemplate": "inclusion",
        "isimage": "anliura a l'archivi",
        "fileduplicatesearch-noresults": "Gnun archivi ciamà «$1» a l'é stàit trovà.",
        "specialpages": "Pàgine Speciaj",
        "specialpages-note-top": "Legenda",
+       "specialpages-note-restricted": "* Pàgine speciaj normaj.\n* <span class=\"mw-specialpagerestricted\">Pàgine speciaj riservà.</span>",
        "specialpages-group-maintenance": "Rapòrt ëd manutension",
        "specialpages-group-other": "Àutre pàgine speciaj",
        "specialpages-group-login": "Intré ant ël sistema / creé un cont",
index c8aa579..8faf549 100644 (file)
        "whatlinkshere": "ایتھے کیدا جوڑ اے",
        "whatlinkshere-title": "او صفے جہڑے \"$1\" نال جڑے نیں",
        "whatlinkshere-page": "صفہ:",
-       "linkshere": "تھلے دتے گۓ صفے اس دے نال جڑدے نے '''[[:$1]]''':",
-       "nolinkshere": "'''[[:$1]]''' دے نال کسے دا جوڑ نہیں",
-       "nolinkshere-ns": "چنے ناں چ کسے صفے دا '''[[:$1]]''' نال جوڑ نئیں۔",
+       "linkshere-2": "تھلے دتے گۓ صفے اس دے نال جڑدے نے '''$1''':",
+       "nolinkshere-2": "'''$1''' دے نال کسے دا جوڑ نہیں",
+       "nolinkshere-ns-2": "چنے ناں چ کسے صفے دا '''$1''' نال جوڑ نئیں۔",
        "isredirect": "ریڈائرکٹ صفہ",
        "istemplate": "ملن",
        "isimage": "مورت دا جوڑ",
        "fileduplicatesearch-result-n": "فائل ''$1'' چ {{PLURAL:$2|1 رلدی نقل|$2 رلدیاں نقلں}} نیں۔",
        "fileduplicatesearch-noresults": "\"$1\" ناں دی کوئی فائل نئیں لبی۔",
        "specialpages": "خاص صفے",
+       "specialpages-note-restricted": "!!FUZZY!!* نارمل خاص صفے.\n* <span class=\"mw-specialpagerestricted\">روکے گۓ خاص صفے.</span>\n* <span class=\"mw-specialpagecached\">کاشے خاص صفے (پرانے ہوگۓ ہون).</span>",
        "specialpages-group-maintenance": "مرمت رپورٹ",
        "specialpages-group-other": "ہور خاص صفے",
        "specialpages-group-login": "لاگان / کھاتہ کھولو",
index c28659a..ba2addf 100644 (file)
        "whatlinkshere": "Ντο δεκνίζ' αδακές",
        "whatlinkshere-title": "Σελίδας ντο συνδέουν ση σελίδαν $1",
        "whatlinkshere-page": "Σελίδαν:",
-       "linkshere": "Αβούτα τα σελίδας δεκνίζνε σο '''[[:$1]]''':",
-       "nolinkshere": "'Κ ευρέθεν σελίδα το δεκνίζ' ση σελίδαν '''[[:$1]]'''.",
+       "linkshere-2": "Αβούτα τα σελίδας δεκνίζνε σο '''$1''':",
+       "nolinkshere-2": "'Κ ευρέθεν σελίδα το δεκνίζ' ση σελίδαν '''$1'''.",
        "isredirect": "σελίδαν διπλού σύνδεσμονος",
        "istemplate": "ενσωμάτωση",
        "isimage": "σύνδεσμον εικόνας",
index 74a5fea..d5d0cda 100644 (file)
        "whatlinkshere": "Ka autenginna stwi",
        "whatlinkshere-title": "Pāusan autengināntei prei \"$1\"",
        "whatlinkshere-page": "Pāusan:",
-       "linkshere": "Ripīntei pāusai autenginna prei '''[[:$1]]''':",
-       "nolinkshere": "Niaīnan pāusan ni autenginna prei '''[[:$1]]'''.",
-       "nolinkshere-ns": "Niaīnan pāusan ni autenginna prei '''[[:$1]]''' en etrīnktai tītelin plattibin.",
+       "linkshere-2": "Ripīntei pāusai autenginna prei '''$1''':",
+       "nolinkshere-2": "Niaīnan pāusan ni autenginna prei '''$1'''.",
+       "nolinkshere-ns-2": "Niaīnan pāusan ni autenginna prei '''$1''' en etrīnktai tītelin plattibin.",
        "isredirect": "prawesnas pāusan",
        "istemplate": "entensīsenis",
        "isimage": "autengīnsenis prei bildin",
        "fileduplicatesearch-result-1": "Zūrbrukis \"$1\" ni turri idēntiskan kōpijan.",
        "fileduplicatesearch-result-n": "Zūrbrukis \"$1\" turri {{PLURAL:$2|1 idēntiskan kōpijan|$2 idēntiskans kōpijans}}.",
        "specialpages": "Speciālai pāusai",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* Nōrmalai speciālai pāusai.\n* <strong class=\"mw-specialpagerestricted\">Speciālai pāusai sen arāikintan preiēisenin.</strong>",
        "specialpages-group-maintenance": "Kōnserwaciōnis repōrtai",
        "specialpages-group-other": "Kitāi speciālai pāusai",
        "specialpages-group-login": "Enēis / registrīs si",
index d856230..62206cb 100644 (file)
        "whatlinkshere": "د دې مخ تړنې",
        "whatlinkshere-title": "هغه مخونه چې د \"$1\" سره تړنې لري",
        "whatlinkshere-page": "مخ:",
-       "linkshere": "دغه لانديني مخونه د '''[[:$1]]''' سره تړنې لري:",
-       "nolinkshere": "د '''[[:$1]]''' سره هېڅ يو مخ هم تړنې نه لري .",
+       "linkshere-2": "دغه لانديني مخونه د '''$1''' سره تړنې لري:",
+       "nolinkshere-2": "د '''$1''' سره هېڅ يو مخ هم تړنې نه لري .",
        "isredirect": "د مخ گرځونې مخ",
        "istemplate": "ورگډېدنه",
        "isimage": "د دوتنې تړنه",
        "fileduplicatesearch-noresults": "د \"$1\" په نوم دوتنه و نه موندل شوه.",
        "specialpages": "ځانگړي مخونه",
        "specialpages-note-top": "څرگندونې",
+       "specialpages-note-restricted": "* نورماله ځانگړي مخونه.\n* <strong class=\"mw-specialpagerestricted\">محدوده ځانگړي مخونه.</strong>",
        "specialpages-group-maintenance": "د څارنې راپورونه",
        "specialpages-group-other": "نور ځانگړي مخونه",
        "specialpages-group-login": "ننوتل / گڼون جوړول",
index 43b0032..1ceac81 100644 (file)
        "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",
-       "blockedtext": "'''O seu nome de usuário ou endereço de IP foi bloqueado.'''\n\nO bloqueio foi realizado por $1.\nO motivo apresentado foi ''$2''.\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destino do bloqueio: $7\n\nVocê pode contatar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir sobre o bloqueio.\n\nVocê só poderá utilizar a funcionalidade \"Contatar usuário\" se um endereço de ''e-mail'' válido estiver especificado em suas [[Special:Preferences|preferências de usuário]] e você não tiver sido bloqueado de utilizar tal recurso.\nO seu endereço de IP atual é $3 e a ID de bloqueio é #$5.\nPor favor, inclua todos os detalhes acima em quaisquer tentativas de esclarecimento.",
-       "autoblockedtext": "O seu endereço de IP foi bloqueado de forma automática, uma vez que foi utilizado recentemente por outro usuário, o qual foi bloqueado por $1.\nO motivo apresentado foi:\n\n:''$2''\n\n* Início do bloqueio: $8\n* Expiração do bloqueio: $6\n* Destino do bloqueio: $7\n\nVocê pode contatar $1 ou outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir sobre o bloqueio.\n\nNote que não poderá utilizar a funcionalidade \"Contatar usuário\" se não possuir uma conta nesta wiki ({{SITENAME}}) com um endereço de ''e-mail'' válido indicado nas suas [[Special:Preferences|preferências de usuário]] ou se tiver sido bloqueado de utilizar tal recurso.\n\nSeu endereço de IP no momento é $3 e sua ID de bloqueio é #$5.\nPor favor, inclua tais dados em qualquer tentativa de esclarecimentos que for realizar.",
+       "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.",
        "blockednoreason": "sem motivo especificado",
        "whitelistedittext": "Você precisa $1 para poder editar páginas.",
        "protectedtitles-submit": "Mostrar títulos",
        "listusers": "Lista de usuários",
        "listusers-editsonly": "Mostrar apenas usuários com edições",
+       "listusers-temporarygroupsonly": "Mostrar apenas usuários em grupos de usuários temporários",
        "listusers-creationsort": "Ordenar por data de criação",
        "listusers-desc": "Listar em ordem decrescente",
        "usereditcount": "$1 {{PLURAL:$1|edição|edições}}",
        "whatlinkshere": "Páginas afluentes",
        "whatlinkshere-title": "Páginas que têm links para \"$1\"",
        "whatlinkshere-page": "Página:",
-       "linkshere": "As seguintes páginas possuem links para '''[[:$1]]''':",
-       "nolinkshere": "Não há afluentes para '''[[:$1]]''' com as condições especificadas.",
-       "nolinkshere-ns": "Não há links para '''[[:$1]]''' no espaço nominal selecionado.",
+       "linkshere-2": "As seguintes páginas possuem links para '''$1''':",
+       "nolinkshere-2": "Não há afluentes para '''$1''' com as condições especificadas.",
+       "nolinkshere-ns-2": "Não há links para '''$1''' no espaço nominal selecionado.",
        "isredirect": "página de redirecionamento",
        "istemplate": "transclusão",
        "isimage": "link para o arquivo",
        "pagedata-title": "Dados de página",
        "pagedata-text": "Esta página fornece uma interface de dados para páginas. Forneça o título da página no URL, usando a sintaxe de subpáginas, por favor.\n* Aplica-se a negociação de conteúdo com base no cabeçalho Accept do seu cliente. Isto significa que os dados da página serão fornecidos no formato preferido do seu cliente.",
        "pagedata-not-acceptable": "Nenhum formato correspondente encontrado. Tipos MIME suportados: $1",
-       "pagedata-bad-title": "Título inválido: $1."
+       "pagedata-bad-title": "Título inválido: $1.",
+       "unregistered-user-config": "Por razões de segurança as subpáginas de utilizador com JavaScript, CSS e JSON não podem ser carregadas para usuários não registados."
 }
index 85ad5b4..b769e52 100644 (file)
        "whatlinkshere": "Páginas afluentes",
        "whatlinkshere-title": "Páginas com hiperligações para \"$1\"",
        "whatlinkshere-page": "Página:",
-       "linkshere": "As seguintes páginas têm hiperligações para <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Não existem afluentes para <strong>[[:$1]]</strong> com as condições especificadas.",
-       "nolinkshere-ns": "Não existem afluentes para <strong>[[:$1]]</strong> no espaço nominal selecionado.",
+       "linkshere-2": "As seguintes páginas têm hiperligações para <strong>$1</strong>:",
+       "nolinkshere-2": "Não existem afluentes para <strong>$1</strong> com as condições especificadas.",
+       "nolinkshere-ns-2": "Não existem afluentes para <strong>$1</strong> no espaço nominal selecionado.",
        "isredirect": "página de redirecionamento",
        "istemplate": "inclusão",
        "isimage": "hiperligação para ficheiro",
index 0947db2..809e488 100644 (file)
        "listusers": "{{doc-special|ListUsers}}",
        "listusers-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Listusers]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
        "listusers-editsonly": "Option in [[Special:ListUsers]].",
+       "listusers-temporarygroupsonly": "Option in [[Special:ListUsers]].",
        "listusers-creationsort": "Option in [[Special:ListUsers]].",
        "listusers-desc": "Used as label for the checkbox on [[Special:ListUsers]].",
        "usereditcount": "Shown behind every username on [[Special:ListUsers]]. Parameters:\n* $1 - number of edits",
        "whatlinkshere-title": "Title of the special page [[Special:WhatLinksHere]]. This page appears when you click on the 'What links here' button in the toolbox. $1 is the name of the page concerned.",
        "whatlinkshere-summary": "{{doc-specialpagesummary|whatlinkshere}}",
        "whatlinkshere-page": "{{Identical|Page}}",
-       "linkshere": "This message is the header line of the [[Special:WhatLinksHere/$1]] page generated by clicking \"What links here\" in the sidebar toolbox.\n\nIt is followed by a navigation bar built using {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - page title",
-       "nolinkshere": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Nolinkshere-ns}}",
-       "nolinkshere-ns": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - page title\nSee also:\n* {{msg-mw|Nolinkshere}}",
+       "linkshere-2": "This message is the header line of the [[Special:WhatLinksHere/$1]] page generated by clicking \"What links here\" in the sidebar toolbox.\n\nIt is followed by a navigation bar built using {{msg-mw|Viewprevnext}}.\n\nParameters:\n* $1 - HTML link to the page.",
+       "nolinkshere-2": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - HTML link to the page\nSee also:\n* {{msg-mw|Nolinkshere-ns-html}}",
+       "nolinkshere-ns-2": "Used in [[Special:WhatLinksHere]] if empty. Parameters:\n* $1 - HTML link to the page\nSee also:\n* {{msg-mw|Nolinkshere-html}}",
        "isredirect": "Displayed in [[Special:WhatLinksHere]] (see [{{fullurl:Special:WhatLinksHere/Project:Translator|hidelinks=1}} Special:WhatLinksHere/Project:Translator] for example).\n\n{{Identical|Redirect page}}",
        "istemplate": "Means that a page (a template, specifically) is used as <code><nowiki>{{Page name}}</nowiki></code>.\nDisplayed in [[Special:WhatLinksHere]] (see [[Special:WhatLinksHere/Template:New portal]] for example).\nIf you are not sure how to translate this term, think of something like \"inclusion\", \"embedding\", or \"insertion\".\n{{Identical|Transclusion}}",
        "isimage": "This message is displayed on [[Special:WhatLinksHere]] for images. It means that the image is used on the page (as opposed to just being linked to like an non-image page).\n{{Identical|File link}}",
        "pagedata-text": "Error shown when none of the formats acceptable to the client is supported (HTTP error 406). Parameters:\n* $1 - the list of supported MIME types",
        "pagedata-not-acceptable": "No matching format found. Supported MIME types: $1",
        "pagedata-bad-title": "Error shown when the requested title is invalid. Parameters:\n* $1: the malformed ID",
-       "unregistered-user-config": "Shown when viewing a user JS, CSS or JSON subpage with ?action=raw&ctype=<mime type> where there is no such user. It is shown as a paragraph after a header saying 'Forbidden'."
+       "unregistered-user-config": "Shown when viewing a user JS, CSS or JSON subpage with ?action=raw&ctype=<mime type> where there is no such user. It is shown as a paragraph after a header saying 'Forbidden'.",
+       "passwordpolicies": "The name of the special page [[Special:PasswordPolicies]].",
+       "passwordpolicies-summary": "The description used on [[Special:ListGroupRights]].\n\nRefers to {{msg-mw|Passwordpolicies-helppage}}.",
+       "passwordpolicies-helppage": "The link used on [[Special:PasswordPolicies]].",
+       "passwordpolicies-group": "The title of the column in the table, about user groups (like you are in the ''translator'' group).\n\n{{Identical|Group}}\n{{Related|Passwordpolicies}}",
+       "passwordpolicies-policies": "The title of the column in the table, about password policies.\n{{Related|Passwordpolicies}}",
+       "passwordpolicies-policy-display": "{{optional}}\nParameters:\n* $1 - the text from the \"passwordpolicies-policy-...\" messages, i.e. {{msg-mw|passwordpolicies-policy-minimalpasswordlength}}\n* $2 - the name of this password policy",
+       "passwordpolicies-policy-minimalpasswordlength": "Password policy that enforces a minimum number of characters a password must be. $1 - minimum number of characters that a password can be",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "Password policy that enforces a minimum number of characters a password must be to be able to login to the wiki. $1 - minimum number of characters that a password can be to be able to login",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Password policy that enforces that the password of the account cannot be the same as the username",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "Password policy that enforces that passwords are not on a list of blacklisted passwords (often previously used during MediaWiki automated testing)",
+       "passwordpolicies-policy-maximalpasswordlength": "Password policy that enforces a maximum number of characters a password must be. $1 - maximum number of characters that a password can be",
+       "passwordpolicies-policy-passwordcannotbepopular": "Password policy that enforces that a password is not in a list of $1 number of \"popular\" passwords. $1 - number of popular passwords the password will be checked against"
 }
index b4baa72..9d090ba 100644 (file)
        "whatlinkshere": "Kayman t'inkimuq",
        "whatlinkshere-title": "$1 sutiyuq p'anqaman t'inkimuqkuna",
        "whatlinkshere-page": "P'anqa:",
-       "linkshere": "'''[[:$1]]''' sutiyuq p'anqamanqa kay qatiq p'anqakunam t'inkimun:",
-       "nolinkshere": "Manam kachkanchu '''[[:$1]]'''-man t'inkiq p'anqa.",
-       "nolinkshere-ns": "Manam kachkanchu '''[[:$1]]'''-man t'inkiq p'anqa akllasqa suti k'itipi.",
+       "linkshere-2": "'''$1''' sutiyuq p'anqamanqa kay qatiq p'anqakunam t'inkimun:",
+       "nolinkshere-2": "Manam kachkanchu '''$1'''-man t'inkiq p'anqa.",
+       "nolinkshere-ns-2": "Manam kachkanchu '''$1'''-man t'inkiq p'anqa akllasqa suti k'itipi.",
        "isredirect": "pusapusqa p'anqa",
        "istemplate": "ch'aqtasqa",
        "isimage": "willañiqi t'inki",
        "fileduplicatesearch-noresults": "\"$1\" sutiyuq willañiqiqa manam tarisqachu.",
        "specialpages": "Sapaq p'anqakuna",
        "specialpages-note-top": "Sut'ichana",
+       "specialpages-note-restricted": "* Sapsipaq sapaq p'anqakuna.\n* <span class=\"mw-specialpagerestricted\">Sapaqkunallapaq sapaq p'anqakuna.</span>",
        "specialpages-group-maintenance": "Hatalliy willaykuna",
        "specialpages-group-other": "Huk sapaq p'anqakuna",
        "specialpages-group-login": "Yaykuy / rakiqunata kamariy",
index 8507825..0f24732 100644 (file)
        "whatlinkshere": "Kayman tinkikuna",
        "whatlinkshere-title": "$1-man tinkiyuk pankakuna",
        "whatlinkshere-page": "Panka:",
-       "linkshere": "Chay pankakunaka '''[[:$1]]'''-man tinkiyukmi kan:",
-       "nolinkshere": "Mana pankaka '''[[:$1]]'''-man tinkikunchu.",
+       "linkshere-2": "Chay pankakunaka '''$1'''-man tinkiyukmi kan:",
+       "nolinkshere-2": "Mana pankaka '''$1'''-man tinkikunchu.",
        "isredirect": "pushashka panka",
        "istemplate": "Ukupi tiyak panka (''inclusión'')",
        "isimage": "rikcha tinki",
index 905a618..a9adaa9 100644 (file)
        "whatlinkshere": "ⵎⵉⵏ ⵉⵇⵇⵏⴻⵏ ⵖⵔ ⴷⴰ",
        "whatlinkshere-title": "Tasniwin id-izedyen ɣar \"$1\"",
        "whatlinkshere-page": "ⵜⴰⵙⵏⴰ:",
-       "linkshere": "Tasna ya tzedi ɣa '''[[:$1]]''':",
-       "nolinkshere": "war tlli ca n Tasna tqqen-d da '''[[:$1]]'''.",
+       "linkshere-2": "Tasna ya tzedi ɣa '''$1''':",
+       "nolinkshere-2": "war tlli ca n Tasna tqqen-d da '''$1'''.",
        "isredirect": "Tasna n (redirect)",
        "istemplate": "Asidef",
        "isimage": "amaqqan usatul",
index b89d6f8..0a894b1 100644 (file)
        "whatlinkshere": "Colliaziuns sin questa pagina",
        "whatlinkshere-title": "Paginas ch'èn colliadas cun \"$1\"",
        "whatlinkshere-page": "Pagina:",
-       "linkshere": "Suandantas paginas èn colliadas cun '''[[:$1]]''':",
-       "nolinkshere": "Naginas paginas èn colliadas cun '''[[:$1]]'''.",
-       "nolinkshere-ns": "Naginas paginas èn colliadas cun '''[[:$1]]''' en il tip da pagina tschernì.",
+       "linkshere-2": "Suandantas paginas èn colliadas cun '''$1''':",
+       "nolinkshere-2": "Naginas paginas èn colliadas cun '''$1'''.",
+       "nolinkshere-ns-2": "Naginas paginas èn colliadas cun '''$1''' en il tip da pagina tschernì.",
        "isredirect": "Pagina che renviescha",
        "istemplate": "Integraziun da models",
        "isimage": "colliaziun da datoteca",
        "fileduplicatesearch-noresults": "Betg chattà ina datoteca cun il num \"$1\".",
        "specialpages": "Paginas spezialas",
        "specialpages-note-top": "Legenda",
+       "specialpages-note-restricted": "* Paginas spezialas normalas.\n* <span class=\"mw-specialpagerestricted\">Paginas spezialas restrenschidas.</span>",
        "specialpages-group-maintenance": "Rapports da mantegnamant",
        "specialpages-group-other": "Autras paginas spezialas",
        "specialpages-group-login": "S'annunziar / crear in conto",
index fc930a1..939d795 100644 (file)
        "whatlinkshere": "Ce trimite aici",
        "whatlinkshere-title": "Pagini care conțin legături spre „$1”",
        "whatlinkshere-page": "Pagină:",
-       "linkshere": "Următoarele pagini conțin legături către <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Nici o pagină nu trimite la '''[[:$1]]'''.",
-       "nolinkshere-ns": "Nici o pagină din spațiul de nume ales nu trimite la '''[[:$1]]'''.",
+       "linkshere-2": "Următoarele pagini conțin legături către <strong>$1</strong>:",
+       "nolinkshere-2": "Nici o pagină nu trimite la '''$1'''.",
+       "nolinkshere-ns-2": "Nici o pagină din spațiul de nume ales nu trimite la '''$1'''.",
        "isredirect": "pagină de redirecționare",
        "istemplate": "prin includerea formatului",
        "isimage": "legătură către fișier",
index b5677df..e153ec3 100644 (file)
        "whatlinkshere": "Appondene aqquà",
        "whatlinkshere-title": "Pàggene ca appondene a \"$1\"",
        "whatlinkshere-page": "Pàgene:",
-       "linkshere": "Le pàggene ca avènene appondene a '''[[:$1]]''':",
-       "nolinkshere": "Nisciuna pàgene apponde a '''[[:$1]]'''.",
-       "nolinkshere-ns": "Nisciuna pàgene apponde a '''[[:$1]]''' jndr'à 'u namespace scacchiete.",
+       "linkshere-2": "Le pàggene ca avènene appondene a '''$1''':",
+       "nolinkshere-2": "Nisciuna pàgene apponde a '''$1'''.",
+       "nolinkshere-ns-2": "Nisciuna pàgene apponde a '''$1''' jndr'à 'u namespace scacchiete.",
        "isredirect": "pàgene de ridirezionamende",
        "istemplate": "inclusione",
        "isimage": "collegamende a 'u file",
index f80a820..3cb607a 100644 (file)
        "whatlinkshere": "Ссылки сюда",
        "whatlinkshere-title": "Страницы, ссылающиеся на «$1»",
        "whatlinkshere-page": "Страница:",
-       "linkshere": "Следующие страницы ссылаются на «'''[[:$1]]'''»:",
-       "nolinkshere": "На страницу '''[[:$1]]''' отсутствуют ссылки с других страниц.",
-       "nolinkshere-ns": "В выбранном пространстве имён нет страниц, ссылающихся на '''[[:$1]]'''.",
+       "linkshere-2": "Следующие страницы ссылаются на «'''$1'''»:",
+       "nolinkshere-2": "На страницу '''$1''' отсутствуют ссылки с других страниц.",
+       "nolinkshere-ns-2": "В выбранном пространстве имён нет страниц, ссылающихся на '''$1'''.",
        "isredirect": "страница-перенаправление",
        "istemplate": "включение",
        "isimage": "файловая ссылка",
index fc487f7..99b4dd0 100644 (file)
        "whatlinkshere": "Одказы на тоту сторінку",
        "whatlinkshere-title": "Сторінкы, што ся одказують на \"$1\"",
        "whatlinkshere-page": "Сторінка:",
-       "linkshere": "Наслїдуючі сторінкы ся одказують на '''[[:$1]]''':",
-       "nolinkshere": "Жадна сторінка на '''[[:$1]]''' не одказує.",
-       "nolinkshere-ns": "У выбранім просторї назв на '''[[:$1]]''' не одказує жадна сторінка.",
+       "linkshere-2": "Наслїдуючі сторінкы ся одказують на '''$1''':",
+       "nolinkshere-2": "Жадна сторінка на '''$1''' не одказує.",
+       "nolinkshere-ns-2": "У выбранім просторї назв на '''$1''' не одказує жадна сторінка.",
        "isredirect": "сторінка напрямлена",
        "istemplate": "вложіня",
        "isimage": "Одказ на файл",
        "fileduplicatesearch-noresults": "Файл з назвов «$1» ненайдженый.",
        "specialpages": "Шпеціалны сторінкы",
        "specialpages-note-top": "Леґенда",
+       "specialpages-note-restricted": "!!FUZZY!!* Звычайны шпеціалны сторінкы.\n* <span class=\"mw-specialpagerestricted\">Шпеціалны сторінкы з&nbsp;обмедженым приступом</span>\n* <span class=\"mw-specialpagecached\">Кешованы шпеціалны сторінкы</span>",
        "specialpages-group-maintenance": "Технічны репорты",
        "specialpages-group-other": "Іншы",
        "specialpages-group-login": "Приголошіня / створїня конта",
index 857ba29..6b9a08a 100644 (file)
        "whatlinkshere": "अनेन सह सम्बद्धाः",
        "whatlinkshere-title": "\"$1\" सम्बद्धानि पृष्ठानि",
        "whatlinkshere-page": "पृष्ठम्:",
-       "linkshere": "'''[[:$1]]''' इत्यनेन सह अधो लिखितानां पृष्ठानां परिसन्धिं करोतु:",
-       "nolinkshere": "'''[[:$1]]''' इत्यनेन सह न किमपि पृष्ठं परिसन्धितम्",
-       "nolinkshere-ns": "चितनामस्थानात्  '''[[:$1]]''' इत्येनं योजनयोग्यं पृष्ठं नास्ति  ।",
+       "linkshere-2": "'''$1''' इत्यनेन सह अधो लिखितानां पृष्ठानां परिसन्धिं करोतु:",
+       "nolinkshere-2": "'''$1''' इत्यनेन सह न किमपि पृष्ठं परिसन्धितम्",
+       "nolinkshere-ns-2": "चितनामस्थानात्  '''$1''' इत्येनं योजनयोग्यं पृष्ठं नास्ति  ।",
        "isredirect": "अनुप्रेषण-पृष्ठम्",
        "istemplate": "अन्यलेखभागः (transclusion)",
        "isimage": "सञ्चिकासम्बन्धः",
        "fileduplicatesearch-noresults": "\"$1\" इति नाम्ना सञ्चिका न दृष्टा ।",
        "specialpages": "विशिष्टपृष्ठानि",
        "specialpages-note-top": "तालिका",
+       "specialpages-note-restricted": "* विशिष्टपृष्ठानि । \n* <span class=\"mw-specialpagerestricted\"> प्रतिबन्धितानि विशिष्टपृष्ठानि ।</span>",
        "specialpages-group-maintenance": "निर्वहणवृत्तानि ।",
        "specialpages-group-other": "अन्यविशेषपुटानि ।",
        "specialpages-group-login": "प्रविश्यताम् / लेखा सृज्यताम्",
index 3f6a245..3dc7eb0 100644 (file)
        "whatlinkshere": "Манна сигэнэллэр",
        "whatlinkshere-title": "Сирэй манна сигэнэр \"$1\"",
        "whatlinkshere-page": "Сирэй:",
-       "linkshere": "'''[[:$1]]''' билэҕэ манна көрдөрүллүбүт сирэйдэр сигэнэллэр:",
-       "nolinkshere": "'''[[:$1]]''' сирэйгэ сигэнэр сирэйдэр суохтар.",
-       "nolinkshere-ns": "Талыллыбыт бөлөххө (namespace) бу '''[[:$1]]''' сирэйгэ сигэнэр сирэйдэр суохтар.",
+       "linkshere-2": "'''$1''' билэҕэ манна көрдөрүллүбүт сирэйдэр сигэнэллэр:",
+       "nolinkshere-2": "'''$1''' сирэйгэ сигэнэр сирэйдэр суохтар.",
+       "nolinkshere-ns-2": "Талыллыбыт бөлөххө (namespace) бу '''$1''' сирэйгэ сигэнэр сирэйдэр суохтар.",
        "isredirect": "көлбөрүтэр сирэй",
        "istemplate": "иһинээҕи",
        "isimage": "билэ сигэтэ",
index 81537a0..16618df 100644 (file)
        "whatlinkshere": "ᱱᱚᱸᱰᱮ ᱫᱚ ᱪᱮᱫ ᱡᱚᱱᱚᱲ ᱠᱳ",
        "whatlinkshere-title": "ᱚᱠᱟ ᱥᱟᱦᱴᱟ ᱠᱚᱫᱚ \"$1\" ᱨᱮ ᱡᱚᱱᱚᱲ ᱢᱮᱱᱟᱜ-ᱟ",
        "whatlinkshere-page": "ᱥᱟᱦᱴᱟ:",
-       "linkshere": "ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ ᱫᱚ <strong>[[:$1]]</strong> ᱥᱟᱶ ᱡᱚᱱᱚᱲ ᱢᱮᱱᱟᱜ-ᱟ :",
-       "nolinkshere": "ᱥᱟᱦᱴᱟ ᱡᱚᱱᱚᱲ ᱵᱟᱱᱩᱜ-ᱟ ᱱᱤᱭᱟᱹ <strong>[[:$1]]</strong>.",
+       "linkshere-2": "ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ ᱥᱟᱦᱴᱟᱠᱚ ᱫᱚ <strong>$1</strong> ᱥᱟᱶ ᱡᱚᱱᱚᱲ ᱢᱮᱱᱟᱜ-ᱟ :",
+       "nolinkshere-2": "ᱥᱟᱦᱴᱟ ᱡᱚᱱᱚᱲ ᱵᱟᱱᱩᱜ-ᱟ ᱱᱤᱭᱟᱹ <strong>$1</strong>.",
        "isredirect": "ᱵᱟᱝ ᱥᱚᱡᱽᱦᱮ ᱥᱟᱦᱴᱟ",
        "istemplate": "ᱥᱮᱞᱮᱫ",
        "isimage": "ᱨᱮᱫ ᱡᱚᱱᱚᱲ",
index 4e2d7aa..52e2f63 100644 (file)
        "whatlinkshere": "Pàginas chi ligant a custa",
        "whatlinkshere-title": "Pàginas chi ligant a \"$1\"",
        "whatlinkshere-page": "Pàgina:",
-       "linkshere": "Is pàginas chi sighint ligant a '''[[:$1]]''':",
-       "nolinkshere": "Peruna pàgina ligat a '''[[:$1]]'''.",
-       "nolinkshere-ns": "Peruna pàgina ligat a '''[[:$1]]''' in su nùmene-logu seberadu.",
+       "linkshere-2": "Is pàginas chi sighint ligant a '''$1''':",
+       "nolinkshere-2": "Peruna pàgina ligat a '''$1'''.",
+       "nolinkshere-ns-2": "Peruna pàgina ligat a '''$1''' in su nùmene-logu seberadu.",
        "isredirect": "pàgina de reindiritzamentu",
        "istemplate": "inclusione",
        "isimage": "ligòngiu a documentu",
index 65b1624..9903b2a 100644 (file)
        "whatlinkshere": "Chi punta ccà",
        "whatlinkshere-title": "Pàggini ca pùntanu a \"$1\"",
        "whatlinkshere-page": "Pàggina:",
-       "linkshere": "Sti pàggini hannu nu liami a '''[[:$1]]''':",
-       "nolinkshere": "Nudda pàggina havi nu liami a '''[[:$1]]'''.",
-       "nolinkshere-ns": "Nun ci sugnu pàggini chi puntano a '''[[:$1]]''' ntô namespace silizziunatu.",
+       "linkshere-2": "Sti pàggini hannu nu liami a '''$1''':",
+       "nolinkshere-2": "Nudda pàggina havi nu liami a '''$1'''.",
+       "nolinkshere-ns-2": "Nun ci sugnu pàggini chi puntano a '''$1''' ntô namespace silizziunatu.",
        "isredirect": "pàggina di rinnirizzamentu",
        "istemplate": "nclusioni",
        "isimage": "lijami ô file",
        "fileduplicatesearch-noresults": "Nuddu file chiamatu \"$1\" fu attruvatu.",
        "specialpages": "Pàggini spiciali",
        "specialpages-note-top": "Liggenna",
+       "specialpages-note-restricted": "* Pàggini spiciali nurmali.\n* <span class=\"mw-specialpagerestricted\">Pàggini spiciali risirvati.</strong>",
        "specialpages-group-maintenance": "Resucunti di manutinzioni",
        "specialpages-group-other": "Àutri pàggini spiciali",
        "specialpages-group-login": "Trasuta / criazzioni di cunti",
index 9de0674..b09b2ef 100644 (file)
        "whatlinkshere": "Whit airts here",
        "whatlinkshere-title": "Pages that link til \"$1\"",
        "whatlinkshere-page": "Page:",
-       "linkshere": "The follaein pages link til <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Nae pages link wi '''[[:$1]]'''.",
-       "nolinkshere-ns": "No pages aiet til <strong>[[:$1]]</strong> in the chosen namespace.",
+       "linkshere-2": "The follaein pages link til <strong>$1</strong>:",
+       "nolinkshere-2": "Nae pages link wi '''$1'''.",
+       "nolinkshere-ns-2": "No pages aiet til <strong>$1</strong> in the chosen namespace.",
        "isredirect": "reguidal page",
        "istemplate": "transclusion",
        "isimage": "file airtin",
        "fileduplicatesearch-noresults": "Naw file named \"$1\" foond.",
        "specialpages": "Byordinar pages",
        "specialpages-note-top": "The Legend",
+       "specialpages-note-restricted": "* Normal byordinair pages.\n* <span class=\"mw-specialpagerestricted\">Restreected byordinair pages.</span>",
        "specialpages-group-maintenance": "Maintenance reports",
        "specialpages-group-other": "Ither byordinair pages",
        "specialpages-group-login": "Login / cræft accoont",
index 0a17742..deec6e6 100644 (file)
        "whatlinkshere": "هتان ڇا ڳنڍيل آهي",
        "whatlinkshere-title": "\"$1\" سان ڳنڍيندڙ صفحا",
        "whatlinkshere-page": "صفحو:",
-       "linkshere": "هيٺيان صفحا <strong>[[:$1]]</strong> سان ڳنڍيل آهن:",
-       "nolinkshere": "'''[[:$1]]''' سان ڪو بہ صفحو ڳنڍيل ناهي.",
+       "linkshere-2": "هيٺيان صفحا <strong>$1</strong> سان ڳنڍيل آهن:",
+       "nolinkshere-2": "'''$1''' سان ڪو بہ صفحو ڳنڍيل ناهي.",
        "isredirect": "چورڻو صفحو",
        "istemplate": "شموليت",
        "isimage": "فائيل جو ڳنڍڻو",
index 06de033..6976bd4 100644 (file)
        "whatlinkshere": "Puntani inogghi",
        "whatlinkshere-title": "Pàgini chi pùntani a \"$1\"",
        "whatlinkshere-page": "Pàgina:",
-       "linkshere": "Li sighenti pàgini cuntenani cullegamenti a '''[[:$1]]''':",
-       "nolinkshere": "Nisciuna pàgina cunteni dei cullegamenti chi pùntani a '''[[:$1]]'''.",
-       "nolinkshere-ns": "Nò vi so pàgini chi pùntani a '''[[:$1]]''' i' lu namespace sciubaraddu.",
+       "linkshere-2": "Li sighenti pàgini cuntenani cullegamenti a '''$1''':",
+       "nolinkshere-2": "Nisciuna pàgina cunteni dei cullegamenti chi pùntani a '''$1'''.",
+       "nolinkshere-ns-2": "Nò vi so pàgini chi pùntani a '''$1''' i' lu namespace sciubaraddu.",
        "isredirect": "rinviu",
        "istemplate": "incrusioni",
        "isimage": "Cullegamentu a file",
index 7077d5e..c39abf8 100644 (file)
        "whatlinkshere": "بەسیارەگان وە ئێرە",
        "whatlinkshere-title": "ئەو پەڕەیلە ک وە «$1» بەسیار دێرن",
        "whatlinkshere-page": "پەڕە:",
-       "linkshere": "ئەی پەڕەیلە بەستیار دێرن وە '''[[:$1]]''':",
-       "nolinkshere": "هۊچ لاپەڕەێگ بەسیار وە '''[[:$1]]''' نەێرێد .",
+       "linkshere-2": "ئەی پەڕەیلە بەستیار دێرن وە '''$1''':",
+       "nolinkshere-2": "هۊچ لاپەڕەێگ بەسیار وە '''$1''' نەێرێد .",
        "isredirect": "پەڕەێ ڕەوانەکەر",
        "istemplate": "ناوتەپیاێەگان (transclusions)",
        "isimage": "بەسیار پەڕگە",
index 29fa5fc..a33423a 100644 (file)
        "sp-contributions-submit": "Oza",
        "whatlinkshere": "Siiddut mat čujuhit deike",
        "whatlinkshere-title": "Siiddut mat čujuhit $1",
-       "linkshere": "Čuovvovaš siidduin lea liŋka siidui <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Siidui <strong>[[:$1]]</strong> eai leat liŋkkat.",
-       "nolinkshere-ns": "Siidui <strong>[[:$1]]</strong> eai leat liŋkkat válljejuvvon nammagomuvuođas.",
+       "linkshere-2": "Čuovvovaš siidduin lea liŋka siidui <strong>$1</strong>:",
+       "nolinkshere-2": "Siidui <strong>$1</strong> eai leat liŋkkat.",
+       "nolinkshere-ns-2": "Siidui <strong>$1</strong> eai leat liŋkkat válljejuvvon nammagomuvuođas.",
        "isredirect": "ođđasitstivrensiidu",
        "istemplate": "lasihuvvon mállevuođđui",
        "whatlinkshere-prev": "← {{PLURAL:$1|ovddit siidu|$1 ovddit siiddu}}",
index 7308705..6e99960 100644 (file)
        "whatlinkshere": "Kaŋ ga dobu ne",
        "whatlinkshere-title": "Moɲey kaŋ ga dobu \"$1\" ga",
        "whatlinkshere-page": "Moo:",
-       "linkshere": "Moɲey wey ga dobu <strong>[[:$1]]</strong> ga:",
-       "nolinkshere": "Mooyaŋ kul ši dobu <strong>[[:$1]]</strong> ga.",
-       "nolinkshere-ns": "Mooyaŋ kul ši dobu <strong>[[:$1]]</strong> ga maafarru suubantaa ra.",
+       "linkshere-2": "Moɲey wey ga dobu <strong>$1</strong> ga:",
+       "nolinkshere-2": "Mooyaŋ kul ši dobu <strong>$1</strong> ga.",
+       "nolinkshere-ns-2": "Mooyaŋ kul ši dobu <strong>$1</strong> ga maafarru suubantaa ra.",
        "isredirect": "moo kuubi",
        "istemplate": "kanandiyan",
        "isimage": "tuku dobu",
        "fileduplicatesearch-noresults": "Tuku kul ši bara nda \"$1\" maa.  \\",
        "specialpages": "Moo cerecerantey",
        "specialpages-note-top": "Šilbaymaana",
+       "specialpages-note-restricted": "* Hankul cerecere moɲey.\n* <span class=\"mw-specialpagerestricted\">Fondo-kankamante cerecere moɲey.</span>",
        "specialpages-group-maintenance": "Alhaadimay bayrandey",
        "specialpages-group-other": "Cerecere moo taney",
        "specialpages-group-login": "Huru / kontu tee",
index e2918bd..d489059 100644 (file)
        "whatlinkshere": "Sosėjė̄ straipsnē",
        "whatlinkshere-title": "Poslapē, katrėi ruod i \"$1\"",
        "whatlinkshere-page": "Poslapis:",
-       "linkshere": "Anėi poslapē ruod i '''[[:$1]]''':",
-       "nolinkshere": "I '''[[:$1]]''' nūruodu nier.",
-       "nolinkshere-ns": "Nurodītuo vardū srėtī anė vėins poslapis neruod i '''[[:$1]]'''.",
+       "linkshere-2": "Anėi poslapē ruod i '''$1''':",
+       "nolinkshere-2": "I '''$1''' nūruodu nier.",
+       "nolinkshere-ns-2": "Nurodītuo vardū srėtī anė vėins poslapis neruod i '''$1'''.",
        "isredirect": "nusokėma poslapis",
        "istemplate": "īspraudėms",
        "isimage": "abruozdielė nūruoda",
        "fileduplicatesearch-info": "$1 × $2 pėkseliu<br />Faila dėdoms: $3<br />MIME tėps: $4",
        "specialpages": "Specēlė̄jė poslapē",
        "specialpages-note-top": "Pāiškėnėmā",
+       "specialpages-note-restricted": "* Normalūs specēlė̅jė puslapē.\n* <strong class=\"mw-specialpagerestricted\">Apribuotė specēlė̅jė puslapē.</strong>",
        "specialpages-group-maintenance": "Sėstemas palaikīma pranešėmā",
        "specialpages-group-other": "Kėtė specēlė̄jė poslapē",
        "specialpages-group-login": "Prisėjongėms / Registracėjė",
index 7290d42..6db45ed 100644 (file)
        "whatlinkshere": "Što upućuje ovamo",
        "whatlinkshere-title": "Stranice koje vode / Странице које воде до $1",
        "whatlinkshere-page": "Stranica:",
-       "linkshere": "Sljedeće stranice vode na '''[[:$1]]''':",
-       "nolinkshere": "Nema linkova na '''[[:$1]]'''.",
-       "nolinkshere-ns": "Nijedna stranica nije povezana sa '''[[:$1]]''' u odabranom imenskom prostoru.",
+       "linkshere-2": "Sljedeće stranice vode na '''$1''':",
+       "nolinkshere-2": "Nema linkova na '''$1'''.",
+       "nolinkshere-ns-2": "Nijedna stranica nije povezana sa '''$1''' u odabranom imenskom prostoru.",
        "isredirect": "preusmjeri stranicu",
        "istemplate": "kao šablon",
        "isimage": "link na datoteku",
        "fileduplicatesearch-result-n": "Datoteka \"$1\" ima {{PLURAL:$2|1 identičnog|$2 identična|$2 identičnih}} dvojnika.",
        "fileduplicatesearch-noresults": "Nije pronađena datoteka sa imenom \"$1\".",
        "specialpages": "Posebne stranice",
+       "specialpages-note-restricted": "!!FUZZY!!* Normalne posebne stranice.\n* <span class=\"mw-specialpagerestricted\">Ograničene posebne stranice.</span>\n* <span class=\"mw-specialpagecached\">Keširane posebne stranice (mogu biti zastarjele).</span>",
        "specialpages-group-maintenance": "Izvještaji o održavanju / Извјештаји о одржавању",
        "specialpages-group-other": "Ostale posebne stranice - Остале посебне странице",
        "specialpages-group-login": "Prijava / Пријава",
index 7d7adf5..1e52adb 100644 (file)
        "whatlinkshere": "ⵎⴰⴷ ⵉⵜⵜⴰⵡⵉⵏ ⵙ ⵖⵉⴷ",
        "whatlinkshere-title": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⵜⵜⴰⵡⵉⵏⵉⵏ ⵙ \"$1\"",
        "whatlinkshere-page": "ⵜⴰⵙⵏⴰ:",
-       "linkshere": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴷ ⴹⴼⴰⵔⵏⵉⵏ ⴰⵔ ⵜⵜⴰⵡⵉⵏⵜ ⵙ <strong>[[:$1]]</strong>:",
-       "nolinkshere": "ⵓⵍⴰ ⴽⵔⴰ ⵏ ⵜⴰⵙⵏⴰ ⵓⵔ ⴰⵔ ⵜⴻⵜⵜⴰⵡⵉ ⵙ <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "Ur tlla kra n tasna izdin d  '''[[:$1]]''' ɣ tɣult l-ittuystayn.",
+       "linkshere-2": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴷ ⴹⴼⴰⵔⵏⵉⵏ ⴰⵔ ⵜⵜⴰⵡⵉⵏⵜ ⵙ <strong>$1</strong>:",
+       "nolinkshere-2": "ⵓⵍⴰ ⴽⵔⴰ ⵏ ⵜⴰⵙⵏⴰ ⵓⵔ ⴰⵔ ⵜⴻⵜⵜⴰⵡⵉ ⵙ <strong>$1</strong>.",
+       "nolinkshere-ns-2": "Ur tlla kra n tasna izdin d  '''$1''' ɣ tɣult l-ittuystayn.",
        "isredirect": "Tasna immutin",
        "istemplate": "Illa gis",
        "isimage": "ⴰⵍⵉⵏⴽ ⵏ ⵓⴼⴰⵢⵍⵓ",
index d886354..62a1800 100644 (file)
        "whatlinkshere": "ႁဵင်းၵွင်ႉ ဢၼ်မီးတီႈၼႆႈပဵၼ်သင်",
        "whatlinkshere-title": "ၼႃႈလိၵ်ႈၸိူဝ်းလိင်ႉၸူး \"$1\"",
        "whatlinkshere-page": "ၼႃႈလိၵ်ႈ",
-       "linkshere": "ၼႃႈလိၵ်ႈၽၢႆႇတႂ်ႈၼႆႉ မၼ်းၵွင်ႉသၢၼ် ဝႆႉၸူး <strong>[[:$1]]</strong>:",
-       "nolinkshere": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး<strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး <strong>[[:$1]]</strong>တီႈၼႂ်း လွၵ်းၸိုဝ်ႈ ဢၼ်လိူၵ်ႈဝႆႉၼၼ်ႉ။",
+       "linkshere-2": "ၼႃႈလိၵ်ႈၽၢႆႇတႂ်ႈၼႆႉ မၼ်းၵွင်ႉသၢၼ် ဝႆႉၸူး <strong>$1</strong>:",
+       "nolinkshere-2": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး<strong>$1</strong>.",
+       "nolinkshere-ns-2": "ဢမ်ႇမီးၼႃႈလိၵ်ႈ ၸိူဝ်းၵွင်ႉၸူး <strong>$1</strong>တီႈၼႂ်း လွၵ်းၸိုဝ်ႈ ဢၼ်လိူၵ်ႈဝႆႉၼၼ်ႉ။",
        "isredirect": "ပိၼ်ႇႁူဝ်ၼႃႈလိၵ်ႈ",
        "istemplate": "တူဝ်ၶဝ်ႈပႃး",
        "isimage": "ၾၢႆႇၵွင်ႉ",
index 1618bf5..277a0c9 100644 (file)
        "whatlinkshere": "මෙතනට සබැඳෙන්නේ කුමක්ද",
        "whatlinkshere-title": "\"$1\" වෙත සබැ‍ඳෙන පිටු",
        "whatlinkshere-page": "පිටුව:",
-       "linkshere": "ඉදිරියෙහි දැක්වෙන පිටු, '''[[:$1]]''' වෙත සබැඳෙයි:",
-       "nolinkshere": "'''[[:$1]]''' වෙත කිසිදු පිටුවක් සබැඳී නොමැත.",
-       "nolinkshere-ns": "තෝරාගෙන ඇති නාම-අවකාශය තුලදී, කිසිදු පිටුවක්, '''[[:$1]]''' වෙත නොබැඳෙයි.",
+       "linkshere-2": "ඉදිරියෙහි දැක්වෙන පිටු, '''$1''' වෙත සබැඳෙයි:",
+       "nolinkshere-2": "'''$1''' වෙත කිසිදු පිටුවක් සබැඳී නොමැත.",
+       "nolinkshere-ns-2": "තෝරාගෙන ඇති නාම-අවකාශය තුලදී, කිසිදු පිටුවක්, '''$1''' වෙත නොබැඳෙයි.",
        "isredirect": "පිටුව යළි-යොමුකරන්න",
        "istemplate": "අන්තහ්කරණය",
        "isimage": "ගොනු සබැඳිය",
        "fileduplicatesearch-noresults": "\"$1\" නමින් ගොනුවක් හමු නොවුණි",
        "specialpages": "විශේෂ පිටු",
        "specialpages-note-top": "ප්‍රබන්ධය",
+       "specialpages-note-restricted": "* සාමාන්‍ය විශේෂ පිටු.\n* <span class=\"mw-specialpagerestricted\">සීමිත විශේෂ පිටු.</span>\n* <span class=\"mw-specialpagecached\">සීමිත කළ වි‍ශේෂ පිටු.</span>",
        "specialpages-group-maintenance": "නඩත්තු වාර්තා",
        "specialpages-group-other": "අනෙකුත් විශේෂ පිටු",
        "specialpages-group-login": "පිවිසෙන්න / ගිණුමක් තනන්න",
index a5f5931..7518cc7 100644 (file)
        "whatlinkshere": "Odkazy na túto stránku",
        "whatlinkshere-title": "Stránky odkazujúce na „$1“",
        "whatlinkshere-page": "Page:",
-       "linkshere": "Nasledujúce stránky odkazujú na '''[[:$1]]''':",
-       "nolinkshere": "Žiadne stránky neodkazujú na '''[[:$1]]'''.",
-       "nolinkshere-ns": "Žiadne stránky neodkazujú na '''[[:$1]]''' vo zvolenom mennom priestore.",
+       "linkshere-2": "Nasledujúce stránky odkazujú na '''$1''':",
+       "nolinkshere-2": "Žiadne stránky neodkazujú na '''$1'''.",
+       "nolinkshere-ns-2": "Žiadne stránky neodkazujú na '''$1''' vo zvolenom mennom priestore.",
        "isredirect": "presmerovacia stránka",
        "istemplate": "použitá",
        "isimage": "odkaz na súbor",
        "fileduplicatesearch-noresults": "Súbor s názvom „$1“ nebol nájdený.",
        "specialpages": "Špeciálne stránky",
        "specialpages-note-top": "Legenda",
+       "specialpages-note-restricted": "* Bežné špeciálne stránky.\n* <strong class=\"mw-specialpagerestricted\">Špeciálne stránky s obmedzeným prístupom.</strong>",
        "specialpages-group-maintenance": "Údržbové správy",
        "specialpages-group-other": "Iné špeciálne stránky",
        "specialpages-group-login": "Prihlásenie / registrácia",
index d549a85..588058b 100644 (file)
        "whatlinkshere": "مربوط ورقے",
        "whatlinkshere-title": "«$1» دے نال جُڑے ہوے ورقے",
        "whatlinkshere-page": "ورقہ",
-       "linkshere": "<strong>[[:$1]]</strong> نال درج ذیل ورقے مربوط ہن:",
-       "nolinkshere": "<strong>[[:$1]]</strong> نال کوئی ورقہ مربوط کائنی۔",
+       "linkshere-2": "<strong>$1</strong> نال درج ذیل ورقے مربوط ہن:",
+       "nolinkshere-2": "<strong>$1</strong> نال کوئی ورقہ مربوط کائنی۔",
        "isredirect": "ورقہ ریڈائریکٹ کرو",
        "istemplate": "شامل شدہ",
        "isimage": "فائل دا ربط",
index c5a1874..db23653 100644 (file)
        "whatlinkshere": "Kaj se povezuje sem",
        "whatlinkshere-title": "Strani, ki se povezujejo na $1",
        "whatlinkshere-page": "Stran:",
-       "linkshere": "Na '''[[:$1]]''' kažejo naslednje strani:",
-       "nolinkshere": "Nobena stran ne kaže na '''[[:$1]]'''.",
-       "nolinkshere-ns": "Nobena stran se ne povezuje na '''[[:$1]]''' v izbranem imenskem prostoru.",
+       "linkshere-2": "Na '''$1''' kažejo naslednje strani:",
+       "nolinkshere-2": "Nobena stran ne kaže na '''$1'''.",
+       "nolinkshere-ns-2": "Nobena stran se ne povezuje na '''$1''' v izbranem imenskem prostoru.",
        "isredirect": "preusmeritvena stran",
        "istemplate": "vključitev",
        "isimage": "povezava na datoteko",
index 41e2e1b..5220062 100644 (file)
        "whatlinkshere": "Links uff de Seite",
        "whatlinkshere-title": "Seyta, de uff „$1“ verlinka",
        "whatlinkshere-page": "Seite:",
-       "linkshere": "De folgenden Seyta verlinka uff '''„[[:$1]]“''':",
-       "nolinkshere": "Kenne Seite verlinkt uff '''„[[:$1]]“'''.",
-       "nolinkshere-ns": "Kenne Seite verlinkt uff '''„[[:$1]]“''' eim gewählta Noamasraum.",
+       "linkshere-2": "De folgenden Seyta verlinka uff '''„$1“''':",
+       "nolinkshere-2": "Kenne Seite verlinkt uff '''„$1“'''.",
+       "nolinkshere-ns-2": "Kenne Seite verlinkt uff '''„$1“''' eim gewählta Noamasraum.",
        "isredirect": "Weiterleitungsseyte",
        "istemplate": "Vorlageneinbindung",
        "isimage": "Dateilink",
        "fileduplicatesearch-result-1": "De Datei „$1“ hoot keene identischa Duplikate.",
        "fileduplicatesearch-result-n": "De Datei „$1“ hoot {{PLURAL:$2|1 identisches Duplikat|$2 identische Duplikate}}.",
        "specialpages": "Spezialseyta",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* Spezialseyta fier Jedermoan\n* <strong class=\"mw-specialpagerestricted\">Spezialseyta fier Nutzer miet erweiterta Rechta</strong>",
        "specialpages-group-other": "Andere Spezialseyta",
        "specialpages-group-login": "Oamelda",
        "specialpages-group-changes": "Letzte Änderunga und Logbicher",
index c043222..1aac592 100644 (file)
        "whatlinkshere": "Maxaa meeshaan la xiriiro",
        "whatlinkshere-title": "Boggaga la xiriiro \"$1\"",
        "whatlinkshere-page": "Bogga:",
-       "linkshere": "Bogyaashaan waxey la xiriiraan  '''[[:$1]]''':",
-       "nolinkshere": "Boggag la xiriiro   '''[[:$1]]''' ma jirto.",
+       "linkshere-2": "Bogyaashaan waxey la xiriiraan  '''$1''':",
+       "nolinkshere-2": "Boggag la xiriiro   '''$1''' ma jirto.",
        "isredirect": "bogga loo sii toosiyay",
        "istemplate": "ku jiri kara",
        "isimage": "faylka la xiriiro",
index 0654224..a0cf5bf 100644 (file)
        "whatlinkshere": "Lidhjet këtu",
        "whatlinkshere-title": "Faqe që lidhen tek $1",
        "whatlinkshere-page": "Faqja:",
-       "linkshere": "Faqet e mëposhtme lidhen këtu '''[[:$1]]''':",
-       "nolinkshere": "Asnjë faqe nuk lidhet tek '''[[:$1]]'''.",
-       "nolinkshere-ns": "Nuk ka faqe në hapësirën e zgjedhur që lidhen tek '''[[:$1]]'''.",
+       "linkshere-2": "Faqet e mëposhtme lidhen këtu '''$1''':",
+       "nolinkshere-2": "Asnjë faqe nuk lidhet tek '''$1'''.",
+       "nolinkshere-ns-2": "Nuk ka faqe në hapësirën e zgjedhur që lidhen tek '''$1'''.",
        "isredirect": "faqe përcjellëse",
        "istemplate": "përfshirë",
        "isimage": "Lidhja e dokumentit",
        "fileduplicatesearch-noresults": "Nuk u gjet asnjë skedë me emrin \"$1\".",
        "specialpages": "Faqet speciale",
        "specialpages-note-top": "Legjenda",
+       "specialpages-note-restricted": "* Faqet speciale normale.\n* <span class=\"mw-specialpagerestricted\">Faqet speciale të kufizuara.</span>",
        "specialpages-group-maintenance": "Përmbledhje mirëmbajtjeje",
        "specialpages-group-other": "Faqe speciale të tjera",
        "specialpages-group-login": "Hyrë / hap llogari",
index c0e0968..e7a03f1 100644 (file)
        "whatlinkshere": "Шта води овде",
        "whatlinkshere-title": "Странице које су повезане са „$1”",
        "whatlinkshere-page": "Страница:",
-       "linkshere": "Следеће странице имају везу до <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Ниједна страница није повезана са: <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "Ниједна страница не води до '''[[:$1]]''' у изабраном именском простору.",
+       "linkshere-2": "Следеће странице имају везу до <strong>$1</strong>:",
+       "nolinkshere-2": "Ниједна страница није повезана са: <strong>$1</strong>.",
+       "nolinkshere-ns-2": "Ниједна страница не води до '''$1''' у изабраном именском простору.",
        "isredirect": "преусмерење",
        "istemplate": "укључивање",
        "isimage": "веза до датотеке",
index f464cf2..d947d2a 100644 (file)
        "whatlinkshere": "Šta vodi ovde",
        "whatlinkshere-title": "Stranice koje su povezane sa „$1”",
        "whatlinkshere-page": "Stranica:",
-       "linkshere": "Sledeće stranice imaju vezu do '''[[:$1]]''':",
-       "nolinkshere": "Nijedna stranica nije povezana sa: '''[[:$1]]'''.",
-       "nolinkshere-ns": "Nijedna stranica ne vodi do '''[[:$1]]''' u izabranom imenskom prostoru.",
+       "linkshere-2": "Sledeće stranice imaju vezu do '''$1''':",
+       "nolinkshere-2": "Nijedna stranica nije povezana sa: '''$1'''.",
+       "nolinkshere-ns-2": "Nijedna stranica ne vodi do '''$1''' u izabranom imenskom prostoru.",
        "isredirect": "preusmerenje",
        "istemplate": "uključivanje",
        "isimage": "veza ka datoteci",
index 322487c..7d99603 100644 (file)
        "sp-contributions-submit": "Suku",
        "whatlinkshere": "San e miti kon dyaso",
        "whatlinkshere-title": "Papira di e sori go na $1",
-       "linkshere": "Den papira disi e miti go na '''[[:$1]]''':",
-       "nolinkshere": "No wan papira e miti kon na '''[[:$1]]'''.",
+       "linkshere-2": "Den papira disi e miti go na '''$1''':",
+       "nolinkshere-2": "No wan papira e miti kon na '''$1'''.",
        "isredirect": "papira fu drai go",
        "istemplate": "poti leki wan template",
        "whatlinkshere-prev": "{{PLURAL:$1|a wan|den $1}} di psa",
index 61b8e02..f8fa151 100644 (file)
        "whatlinkshere": "Links ap disse Siede",
        "whatlinkshere-title": "Sieden, do der ap \"$1\" linkje",
        "whatlinkshere-page": "Siede:",
-       "linkshere": "Do foulgjende Sieden ferwiese hierhäär:  '''[[:$1]]''': <br /><small>(Moonige Sieden wäide eventuell moorfooldich liested, konnen in säildene Falle oawers uk miste. Dät kumt fon oolde Failere in dän Software häär, man skoadet fääre niks.)</small>",
-       "nolinkshere": "Naan Artikkel ferwiest hierhäär: '''[[:$1]]'''.",
-       "nolinkshere-ns": "Neen Siede ferlinket ap '''„[[:$1]]“''' in dän wäälde Noomensruum.",
+       "linkshere-2": "Do foulgjende Sieden ferwiese hierhäär:  '''$1''': <br /><small>(Moonige Sieden wäide eventuell moorfooldich liested, konnen in säildene Falle oawers uk miste. Dät kumt fon oolde Failere in dän Software häär, man skoadet fääre niks.)</small>",
+       "nolinkshere-2": "Naan Artikkel ferwiest hierhäär: '''$1'''.",
+       "nolinkshere-ns-2": "Neen Siede ferlinket ap '''„$1“''' in dän wäälde Noomensruum.",
        "isredirect": "Fäärelaitengs-Siede",
        "istemplate": "Foarloagenienbiendenge",
        "isimage": "Doatäilink",
        "fileduplicatesearch-result-n": "Ju Doatäi „$1“ häd {{PLURAL:$2|1 identisk Duplikoat|$2 identiske Duplikoate}}.",
        "fileduplicatesearch-noresults": "Der wuud neen Doatäi mäd Noome \"$1\" fuunen.",
        "specialpages": "Spezioalsieden",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!* Reguläre Spezioalsieden\n* <span class=\"mw-specialpagerestricted\">Tougriepsbeskränkede Spezioalsieden</span>\n* <span class=\"mw-specialpagecached\">Cachegenerierde Spezioalsieden</span>",
        "specialpages-group-maintenance": "Fersuurgengsliesten",
        "specialpages-group-other": "Uur Spezioalsieden",
        "specialpages-group-login": "Anmäldje",
index 5c7309c..f76272f 100644 (file)
        "whatlinkshere": "Мынта ссылкалар",
        "whatlinkshere-title": "«$1» питкә йебәргән питләр",
        "whatlinkshere-page": "Пит:",
-       "linkshere": "''[[:$1]]''' питкә киләсе питләр тайанатылар:",
-       "nolinkshere": "[[:$1]] питкә пер питтән тә ссылка йуҡ.",
+       "linkshere-2": "''$1''' питкә киләсе питләр тайанатылар:",
+       "nolinkshere-2": "$1 питкә пер питтән тә ссылка йуҡ.",
        "isredirect": "йусыҡлау пит",
        "istemplate": "ҡушылыу",
        "isimage": "файллы ссылка",
index a52f6d4..0e93458 100644 (file)
        "whatlinkshere": "Anu nutumbu ka dieu",
        "whatlinkshere-title": "Kaca anu nutumbu ka \"$1\"",
        "whatlinkshere-page": "Kaca:",
-       "linkshere": "Kaca di handap ieu numbu ka '''[[:$1]]''':",
-       "nolinkshere": "Euweuh kaca anu nutumbu ka <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "Euweuh kaca anu nutumbu ka <strong>[[:$1]]</strong> dina ruang-nama anu dipilih.",
+       "linkshere-2": "Kaca di handap ieu numbu ka '''$1''':",
+       "nolinkshere-2": "Euweuh kaca anu nutumbu ka <strong>$1</strong>.",
+       "nolinkshere-ns-2": "Euweuh kaca anu nutumbu ka <strong>$1</strong> dina ruang-nama anu dipilih.",
        "isredirect": "Kaca alihan",
        "istemplate": "ku citakan",
        "isimage": "tutumbu berkas",
index 6bf1e4f..e21685b 100644 (file)
        "whatlinkshere": "Vad som länkar hit",
        "whatlinkshere-title": "Sidor som länkar till \"$1\"",
        "whatlinkshere-page": "Sida:",
-       "linkshere": "Följande sidor länkar till <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Inga sidor länkar till <strong>[[:$1]]</strong>.",
-       "nolinkshere-ns": "Inga sidor i den angivna namnrymden länkar till <strong>[[:$1]]</strong>.",
+       "linkshere-2": "Följande sidor länkar till <strong>$1</strong>:",
+       "nolinkshere-2": "Inga sidor länkar till <strong>$1</strong>.",
+       "nolinkshere-ns-2": "Inga sidor i den angivna namnrymden länkar till <strong>$1</strong>.",
        "isredirect": "omdirigeringssida",
        "istemplate": "inkluderad som mall",
        "isimage": "fillänk",
index 30f1355..7240065 100644 (file)
        "whatlinkshere": "Viungo viungavyo ukurasa huu",
        "whatlinkshere-title": "Kurasa zilizounganishwa na \"$1\"",
        "whatlinkshere-page": "Ukurasa:",
-       "linkshere": "Kurasa zifuatazo zimeunganishwa na '''[[:$1]]''':",
-       "nolinkshere": "Hakuna kurasa zilizounganishwa na '''[[:$1]]'''.",
-       "nolinkshere-ns": "Hakuna kurasa zilizounganishwa na '''[[:$1]]''' katika eneo la wiki lililochaguliwa.",
+       "linkshere-2": "Kurasa zifuatazo zimeunganishwa na '''$1''':",
+       "nolinkshere-2": "Hakuna kurasa zilizounganishwa na '''$1'''.",
+       "nolinkshere-ns-2": "!!FUZZY!!!!FUZZY!!Hakuna kurasa zilizounganishwa na '''$1''' katika eneo la wiki lililochaguliwa.",
        "isredirect": "elekeza ukurasa",
        "istemplate": "jumuisho",
        "isimage": "kiungo cha faili",
        "fileduplicatesearch-noresults": "Faili linaloitwa \"$1\" halikupatikana.",
        "specialpages": "Kurasa maalum",
        "specialpages-note-top": "Simulizi",
+       "specialpages-note-restricted": "!!FUZZY!!* Kurasa maalum za kawaida.\n* <span class=\"mw-specialpagerestricted\">Kurasa maalum zisizoonekana na wote.</span>\n* <span class=\"mw-specialpagecached\">Kurasa maalum zinazotoka \"cache\" (might be obsolete).</span>",
        "specialpages-group-maintenance": "Ripoti za kurekebisha na kutunza kurasa",
        "specialpages-group-other": "Kurasa maalum zingine",
        "specialpages-group-login": "Ingia / sajili akaunti",
index 3a94c67..07fbca7 100644 (file)
        "whatlinkshere": "Co sam linkuje",
        "whatlinkshere-title": "Zajty, kere linkujům na \"$1\"",
        "whatlinkshere-page": "Zajta:",
-       "linkshere": "Nastympůjůnce zajty sóm adrésůwane do '''[[:$1]]''':",
-       "nolinkshere": "Żodno zajta ńy je adrésowana do '''[[:$1]]'''.",
-       "nolinkshere-ns": "Žodno zajta ńy je adresowano do '''[[:$1]]''' we wybrany přestřyni mjan.",
+       "linkshere-2": "Nastympůjůnce zajty sóm adrésůwane do '''$1''':",
+       "nolinkshere-2": "Żodno zajta ńy je adrésowana do '''$1'''.",
+       "nolinkshere-ns-2": "Žodno zajta ńy je adresowano do '''$1''' we wybrany přestřyni mjan.",
        "isredirect": "překerowujůnca zajta",
        "istemplate": "dołůnczony muster",
        "isimage": "Link do plika",
        "fileduplicatesearch-result-1": "Ńy ma duplikatu pliku „$1”.",
        "fileduplicatesearch-result-n": "We {{GRAMMAR:MS.lp|{{SITENAME}}}} {{PLURAL:$2|je dodatkowo kopia|sům $2 dodatkowe kopje|je $2 dodatkowych kopii}} plika „$1”.",
        "specialpages": "Szpecjalne zajty",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* Ekstra zajty uogůlńy dostympne.\n* <strong class=\"mw-specialpagerestricted\">Ekstra zajty do kerych dostymp je uograńiczůny.</strong>",
        "specialpages-group-maintenance": "Raporty kůnserwacyjne",
        "specialpages-group-other": "Inkše ekstra zajty",
        "specialpages-group-login": "Logowańy / regisztrowańy",
index 69121fa..b2ffaad 100644 (file)
        "whatlinkshere": "இப்பக்கத்தை இணைத்தவை",
        "whatlinkshere-title": "\"$1\" பக்கத்துக்கு இணைக்கப்பட்டவை",
        "whatlinkshere-page": "பக்கம்:",
-       "linkshere": "'''[[:$1]]''' பின்வரும் பக்கங்களில் இப்பக்கம் இணைக்கப்பட்டுள்ளது:",
-       "nolinkshere": "'''[[:$1]]''' எந்தப் பக்கத்திலும் இந்தப் பக்கம் இணைக்கப்படவில்லை.",
-       "nolinkshere-ns": "தெரிவு செய்யப்பட்ட பெயர்வெளியில் '''[[:$1]]''' பக்கத்துக்கு இணைக்கப்பட்ட பக்கங்கள் எதுவுமில்லை.",
+       "linkshere-2": "'''$1''' பின்வரும் பக்கங்களில் இப்பக்கம் இணைக்கப்பட்டுள்ளது:",
+       "nolinkshere-2": "'''$1''' எந்தப் பக்கத்திலும் இந்தப் பக்கம் இணைக்கப்படவில்லை.",
+       "nolinkshere-ns-2": "தெரிவு செய்யப்பட்ட பெயர்வெளியில் '''$1''' பக்கத்துக்கு இணைக்கப்பட்ட பக்கங்கள் எதுவுமில்லை.",
        "isredirect": "வழிமாற்றுப் பக்கம்",
        "istemplate": "உள்ளிடப்பட்டுள்ளது",
        "isimage": "கோப்பு இணைப்பு",
        "fileduplicatesearch-noresults": "\"$1\" என்ற பெயர் கொண்ட கோப்பு எதுவும் காணப்படவில்லை.",
        "specialpages": "சிறப்புப் பக்கங்கள்",
        "specialpages-note-top": "உள்பட்டியல்",
+       "specialpages-note-restricted": " * சராசரி சிறப்புப் பக்கங்கள்.\n * <span class=\"mw-specialpagerestricted\">வரையறுக்கப்பட்ட சிறப்புப் பக்கங்கள்.</span>",
        "specialpages-group-maintenance": "பராமரிப்பு அறிக்கைகள்",
        "specialpages-group-other": "ஏனைய சிறப்புப் பக்கங்கள்",
        "specialpages-group-login": "புகுபதிகை/பயனர் கணக்கு தொடக்கம்",
index a9a151e..1abd0a4 100644 (file)
        "whatlinkshere": "Aniy p’ubuy tay lpgan sqaniy",
        "whatlinkshere-title": "Aniy ’mubuy sa zngayan tay \"$1\"",
        "whatlinkshere-page": "Zngayan",
-       "linkshere": "Zngayan tay suruw qaniy ga aniy p’ubuy sa <strong>[[:$1]]</strong>:",
-       "nolinkshere": "Ungat zngazyan ’mubuy squw <strong>[[:$1]]</strong>.",
+       "linkshere-2": "Zngayan tay suruw qaniy ga aniy p’ubuy sa <strong>$1</strong>:",
+       "nolinkshere-2": "Ungat zngazyan ’mubuy squw <strong>$1</strong>.",
        "isredirect": "t’ringun pawsa’ sa zngayan",
        "istemplate": "’nagal sa",
        "isimage": "’ubuy sa biru’ na ana nanu’ zayzyuwaw",
index 0b7edba..581b6af 100644 (file)
        "whatlinkshere": "ಇಡೆ ವಾ ಪುಟೊ ಕೊಂಡಿ ಕೊರ್ಪುಂಡು",
        "whatlinkshere-title": "\"$1\" ಕ್ಕ್ ಸಂಪರ್ಕ ಕೊರ್ಪಿನ ಪುಟೊಕುಲು",
        "whatlinkshere-page": "ಪುಟೊ:",
-       "linkshere": "</strong>[[:$1]]<strong>ಗ್ ಈ ತಿರ್ತ್‍ದ ಪುಟೊಕುಲು ಕೊಂಡಿ ಕೊರ್ಪುಂಡು.",
-       "nolinkshere": "'''[[:$1]]''' ಗ್ ವಾ ಪುಟೊಕುಲೆಡ್ಲಾ ಲಿಂಕ್ ಇಜ್ಜಿ.",
+       "linkshere-2": "</strong>$1<strong>ಗ್ ಈ ತಿರ್ತ್‍ದ ಪುಟೊಕುಲು ಕೊಂಡಿ ಕೊರ್ಪುಂಡು.",
+       "nolinkshere-2": "'''$1''' ಗ್ ವಾ ಪುಟೊಕುಲೆಡ್ಲಾ ಲಿಂಕ್ ಇಜ್ಜಿ.",
        "isredirect": "ಪಿರ ನಿರ್ದೇಶನೊದ ಪುಟೊ",
        "istemplate": "ಸೇರಾವುನೆ",
        "isimage": "ಫೈಲ್‍ದ ಕೊಂಡಿ",
index 2442646..ad2fb34 100644 (file)
        "whatlinkshere": "ఇక్కడికి లింకైనవి",
        "whatlinkshere-title": "\"$1\"కి లింకున్న పుటలు",
        "whatlinkshere-page": "పేజీ:",
-       "linkshere": "కింది పేజీల నుండి <strong>[[:$1]]</strong>కు లింకులు ఉన్నాయి:",
-       "nolinkshere": "'''[[:$1]]'''కు ఏ పేజీ నుండీ లింకు లేదు.",
-       "nolinkshere-ns": "'''[[:$1]]''' పేజీకి లింకయ్యే పేజీలు ఎంచుకున్న నేంస్పేసులో లేవు.",
+       "linkshere-2": "కింది పేజీల నుండి <strong>$1</strong>కు లింకులు ఉన్నాయి:",
+       "nolinkshere-2": "'''$1'''కు ఏ పేజీ నుండీ లింకు లేదు.",
+       "nolinkshere-ns-2": "'''$1''' పేజీకి లింకయ్యే పేజీలు ఎంచుకున్న నేంస్పేసులో లేవు.",
        "isredirect": "దారిమార్పు పుట",
        "istemplate": "పేజీకి జతపరిచారు",
        "isimage": "దస్త్రపు లంకె",
        "fileduplicatesearch-noresults": "\"$1\" అనే పేరుగల దస్త్రమేమీ కనబడలేదు.",
        "specialpages": "ప్రత్యేక పేజీలు",
        "specialpages-note-top": "సూచిక",
+       "specialpages-note-restricted": "* మామూలు ప్రత్యేక పుటలు.\n* <span class=\"mw-specialpagerestricted\">నియంత్రిత ప్రత్యేక పుటలు.</span>",
        "specialpages-group-maintenance": "నిర్వహణా నివేదికలు",
        "specialpages-group-other": "ఇతర ప్రత్యేక పేజీలు",
        "specialpages-group-login": "లాగినవండి / ఖాతా సృష్టించుకోండి",
index bc23697..56000b2 100644 (file)
        "whatlinkshere": "Artigu sira ne'ebé bá iha ne'e",
        "whatlinkshere-title": "Pájina sira ne'ebé bá \"$1\".",
        "whatlinkshere-page": "Pájina:",
-       "linkshere": "Pájina sira ne'e link ba '''[[:$1]]''':",
+       "linkshere-2": "Pájina sira ne'e link ba '''$1''':",
        "isimage": "ligasaun ba fixeiru",
        "whatlinkshere-prev": "{{PLURAL:$1|oinmai|oinmai $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|molok|molok $1}}",
index e73941a..c7931cf 100644 (file)
        "whatlinkshere": "Пайвандҳои дар ин сахифа",
        "whatlinkshere-title": "Саҳифаҳое ки ба $1 пайванд доранд",
        "whatlinkshere-page": "Саҳифа:",
-       "linkshere": "Саҳифаҳои зерин ба '''[[:$1]]''' пайванданд:",
-       "nolinkshere": "Ягон саҳифа ба '''[[:$1]]''' пайванд нест.",
-       "nolinkshere-ns": "Ҳеҷ саҳифа аз фазоиноми интихобшуда ба '''[[:$1]]''' пайванд надорад.",
+       "linkshere-2": "Саҳифаҳои зерин ба '''$1''' пайванданд:",
+       "nolinkshere-2": "Ягон саҳифа ба '''$1''' пайванд нест.",
+       "nolinkshere-ns-2": "Ҳеҷ саҳифа аз фазоиноми интихобшуда ба '''$1''' пайванд надорад.",
        "isredirect": "саҳифаи тағйири масир",
        "istemplate": "истифодашуда дар саҳифа",
        "isimage": "пайванд ба парванда",
index 1076f8c..129b5a4 100644 (file)
        "whatlinkshere": "Pajvandhoi dar in saxifa",
        "whatlinkshere-title": "Sahifahoe ki ba $1 pajvand dorand",
        "whatlinkshere-page": "Sahifa:",
-       "linkshere": "Sahifahoi zerin ba '''[[:$1]]''' pajvandand:",
-       "nolinkshere": "Jagon sahifa ba '''[[:$1]]''' pajvand nest.",
-       "nolinkshere-ns": "Heç sahifa az fazoinomi intixobşuda ba '''[[:$1]]''' pajvand nadorad.",
+       "linkshere-2": "Sahifahoi zerin ba '''$1''' pajvandand:",
+       "nolinkshere-2": "Jagon sahifa ba '''$1''' pajvand nest.",
+       "nolinkshere-ns-2": "Heç sahifa az fazoinomi intixobşuda ba '''$1''' pajvand nadorad.",
        "isredirect": "sahifai taƣjiri masir",
        "istemplate": "istifodaşuda dar sahifa",
        "isimage": "pajvandi aks",
index dc85fa6..9671e93 100644 (file)
        "whatlinkshere": "หน้าที่ลิงก์มา",
        "whatlinkshere-title": "หน้าที่ลิงก์มา \"$1\"",
        "whatlinkshere-page": "หน้า:",
-       "linkshere": "หน้าต่อไปนี้ลิงก์มา <strong>[[:$1]]</strong>:",
-       "nolinkshere": "ไม่มีหน้าใดลิงก์มา <strong>[[:$1]]</strong>",
-       "nolinkshere-ns": "ไม่มีหน้าใดลิงก์มา <strong>[[:$1]]</strong> ในเนมสเปซที่เลือก",
+       "linkshere-2": "หน้าต่อไปนี้ลิงก์มา <strong>$1</strong>:",
+       "nolinkshere-2": "ไม่มีหน้าใดลิงก์มา <strong>$1</strong>",
+       "nolinkshere-ns-2": "ไม่มีหน้าใดลิงก์มา <strong>$1</strong> ในเนมสเปซที่เลือก",
        "isredirect": "หน้าเปลี่ยนทาง",
        "istemplate": "โดยใช้แม่แบบ",
        "isimage": "ลิงก์ไฟล์",
index 27d7d6f..4c8b58c 100644 (file)
        "whatlinkshere": "Şu ýere çykgytlar",
        "whatlinkshere-title": "\"$1\" makalasyna çykgyt berýän sahypalar",
        "whatlinkshere-page": "Sahypa:",
-       "linkshere": "'''[[:$1]]''' sahypasyna çykgyt berýän sahypalar:",
-       "nolinkshere": "'''[[:$1]]''' sahypasyna çykgyt berýän sahypa ýok.",
-       "nolinkshere-ns": "Saýlanyp alynan at giňişliginde hiçbir sahypa '''[[:$1]]''' sahypasyna çykgyt bermeýär.",
+       "linkshere-2": "'''$1''' sahypasyna çykgyt berýän sahypalar:",
+       "nolinkshere-2": "'''$1''' sahypasyna çykgyt berýän sahypa ýok.",
+       "nolinkshere-ns-2": "Saýlanyp alynan at giňişliginde hiçbir sahypa '''$1''' sahypasyna çykgyt bermeýär.",
        "isredirect": "gönükdirme sahypasy",
        "istemplate": "atanaklaýyn girizme",
        "isimage": "faýl çykgydy",
        "fileduplicatesearch-result-1": "\"$1\" faýlynyň meňzeş dublikaty ýok.",
        "fileduplicatesearch-result-n": "\"$1\" faýlynyň {{PLURAL:$2|1 sany meňzeş dublikaty|$2 sany meňzeş dublikaty}} bar.",
        "specialpages": "Ýörite sahypalar",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* Adaty ýörite sahypalar.\n* <strong class=\"mw-specialpagerestricted\">Çäklendirilen ýörite sahypalar.</strong>",
        "specialpages-group-maintenance": "Tehniki abatlaýyş hasabatlary",
        "specialpages-group-other": "Başga ýörite sahypalar",
        "specialpages-group-login": "Hasaba gir / täze hasap aç",
index 6266763..49a4969 100644 (file)
        "whatlinkshere": "Mga nakaturo dito",
        "whatlinkshere-title": "Mga pahinang kumakawing sa $1",
        "whatlinkshere-page": "Pahina:",
-       "linkshere": "Nakakawing ang sumusunod na mga pahina sa '''[[:$1]]''':",
-       "nolinkshere": "Walang pahinang nakakawing sa '''[[:$1]]'''.",
-       "nolinkshere-ns": "Walang pahinang nakakawing sa '''[[:$1]]''' mula sa loob ng napiling espasyo ng pangalan.",
+       "linkshere-2": "Nakakawing ang sumusunod na mga pahina sa '''$1''':",
+       "nolinkshere-2": "Walang pahinang nakakawing sa '''$1'''.",
+       "nolinkshere-ns-2": "Walang pahinang nakakawing sa '''$1''' mula sa loob ng napiling espasyo ng pangalan.",
        "isredirect": "pahinang panturo/panuto",
        "istemplate": "pagsasali",
        "isimage": "link ng file",
        "fileduplicatesearch-result-n": "Ang talaksan na \"$1\" ay may {{PLURAL:$2|1 kapareho|$2 mga kapareho}}.",
        "fileduplicatesearch-noresults": "Walang natagpuang talaksan na may pangalang \"$1\".",
        "specialpages": "Mga natatanging pahina",
+       "specialpages-note-restricted": "!!FUZZY!!* Normal na natatanging mga pahina.\n* <span class=\"mw-specialpagerestricted\">Pinaghihigpitang natatanging mga pahina.</span>",
        "specialpages-group-maintenance": "Mga pagpapanatiling ulat",
        "specialpages-group-other": "Iba pang natatanging mga pahina",
        "specialpages-group-login": "Mag-login / lumikha ng account",
index 02f50c0..fe377e5 100644 (file)
        "whatlinkshere": "Сәбонон ијо",
        "whatlinkshere-title": "Сәһифон, сәбон вардән бә \"$1\"",
        "whatlinkshere-page": "Сәһифә:",
-       "linkshere": "Ым сәһифон сәбон вардән ијо ''[[:$1]]''':",
-       "nolinkshere": "Бә ым сәһифә ҹо сәһифонку сәбонон нин '''[[:$1]]'''.",
+       "linkshere-2": "Ым сәһифон сәбон вардән ијо ''$1''':",
+       "nolinkshere-2": "Бә ым сәһифә ҹо сәһифонку сәбонон нин '''$1'''.",
        "isredirect": "унвони дәгиш кардә сәһифәје",
        "istemplate": "әловә",
        "isimage": "фајлинә сәбон",
index 422b905..c9a65d6 100644 (file)
        "sp-contributions-talk": "Alea",
        "whatlinkshere": "Ngaahi fehokotaki ki heni",
        "whatlinkshere-page": "Peesi:",
-       "linkshere": "ʻOku fehokotaki ki heni ʻa e ngaahi peesi:",
-       "nolinkshere": "ʻOku ʻikai ha ngaahi kupu fehokotaki ki heni.",
+       "linkshere-2": "!!FUZZY!!ʻOku fehokotaki ki heni ʻa e ngaahi peesi:",
+       "nolinkshere-2": "!!FUZZY!!ʻOku ʻikai ha ngaahi kupu fehokotaki ki heni.",
        "isredirect": "Peesi leʻei",
        "istemplate": "kātoi",
        "whatlinkshere-links": "← fehokotaki",
index db9fe96..77ac675 100644 (file)
        "whatlinkshere": "Sayfaya bağlantılar",
        "whatlinkshere-title": "\"$1\" sayfasına bağlantı veren sayfalar",
        "whatlinkshere-page": "Sayfa:",
-       "linkshere": "'''[[:$1]]''' sayfasına bağlantısı olan sayfalar:",
-       "nolinkshere": "'''[[:$1]]''' sayfasına bağlantı veren sayfa yok.",
-       "nolinkshere-ns": "Seçilen ad alanında hiçbir sayfa '''[[:$1]]''' sayfasına bağlanmıyor.",
+       "linkshere-2": "'''$1''' sayfasına bağlantısı olan sayfalar:",
+       "nolinkshere-2": "'''$1''' sayfasına bağlantı veren sayfa yok.",
+       "nolinkshere-ns-2": "Seçilen ad alanında hiçbir sayfa '''$1''' sayfasına bağlanmıyor.",
        "isredirect": "yönlendirme sayfası",
        "istemplate": "dönüştürülme",
        "isimage": "dosya bağlantısı",
index 405c5cb..be26c1f 100644 (file)
        "whatlinkshere": "Asirwoṭo biFaṭaṭe",
        "whatlinkshere-title": "Faṭoṭe dkitte Asiruṭo 3am\"$1\"",
        "whatlinkshere-page": "Faṭo",
-       "linkshere": "aFaṭoṭani masre ne 3am '''[[:$1]]''':",
-       "nolinkshere": "Layto Faṭoṭe dkitte Asiruṭo 3am '''[[:$1]]'''.",
+       "linkshere-2": "aFaṭoṭani masre ne 3am '''$1''':",
+       "nolinkshere-2": "Layto Faṭoṭe dkitte Asiruṭo 3am '''$1'''.",
        "isredirect": "redirect page",
        "istemplate": "transclusion",
        "isimage": "Asiruṭo duFayl",
index 06917aa..b541bc6 100644 (file)
        "whatlinkshere": "Leswi khwekelaka laha",
        "whatlinkshere-title": "Matluka lama khwekelaka eka $1",
        "whatlinkshere-page": "Tluka:",
-       "linkshere": "Matluka lama landzelaka makhwekela eka '''[[:$1]]''':",
-       "nolinkshere": "Kuhava matluka lama khwekelaka eka  '''[[:$1]]'''.",
+       "linkshere-2": "Matluka lama landzelaka makhwekela eka '''$1''':",
+       "nolinkshere-2": "Kuhava matluka lama khwekelaka eka  '''$1'''.",
        "isredirect": "Tluka ro kongomisa",
        "istemplate": "Swisivela ndhzawu",
        "isimage": "Xikhwekerisi xa fayili",
index c15d558..1a68426 100644 (file)
        "whatlinkshere": "Бирегә нәрсә сылтый",
        "whatlinkshere-title": "$1 битенә сылтый торган битләр",
        "whatlinkshere-page": "Бит:",
-       "linkshere": "'''[[:$1]]''' битенә чираттагы битләр сылтый:",
-       "nolinkshere": "'''[[:$1]]''' битенә башка битләр сылтамыйлар.",
+       "linkshere-2": "'''$1''' битенә чираттагы битләр сылтый:",
+       "nolinkshere-2": "'''$1''' битенә башка битләр сылтамыйлар.",
        "isredirect": "юнәлтү бите",
        "istemplate": "кертүләр",
        "isimage": "файл сылтамасы",
        "fileduplicatesearch": "Бер үк файлларны эзләү",
        "fileduplicatesearch-submit": "Эзләү",
        "specialpages": "Махсус битләр",
+       "specialpages-note-restricted": "* Гади махсус битләр.\n* <span class=\"mw-specialpagerestricted\">Чикләнелгән махсус битләр.</span>",
        "specialpages-group-maintenance": "Техник карау хисапнамәсе",
        "specialpages-group-other": "Башка махсус битләр",
        "specialpages-group-login": "Керү / Теркәлү",
index da6e606..2f696e5 100644 (file)
        "whatlinkshere": "Biregä närsä sıltıy",
        "whatlinkshere-title": "$1 bitenä sıltıy torğan bitlär",
        "whatlinkshere-page": "Bit:",
-       "linkshere": "'''[[:$1]]''' bitenä çirattağı bitlär sıltıy:",
-       "nolinkshere": "'''[[:$1]]''' bitenä başqa bitlär sıltamıylar.",
+       "linkshere-2": "'''$1''' bitenä çirattağı bitlär sıltıy:",
+       "nolinkshere-2": "'''$1''' bitenä başqa bitlär sıltamıylar.",
        "isredirect": "yünältü bite",
        "istemplate": "kertülär",
        "isimage": "fayl qullanılışı",
        "version-software-version": "Versiä",
        "fileduplicatesearch-submit": "Ezläw",
        "specialpages": "Maxsus bitlär",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* Ğädi maxsus bitlär.\n* <strong class=\"mw-specialpagerestricted\">Çiklänelgän ğädi maxsus bitlär</strong>",
        "specialpages-group-maintenance": "Texnik qaraw xisapnamäse",
        "specialpages-group-other": "Başqa maxsus bitlär",
        "specialpages-group-login": "Kerü / terkälü",
index b60268e..d8971d5 100644 (file)
        "whatlinkshere": "Аргышкан арыннар",
        "whatlinkshere-title": "«$1» деп арынче айтып турар тускай арыннар",
        "whatlinkshere-page": "Арын:",
-       "linkshere": "Адаандагы арыннар бээр «'''[[:$1]]'''» шөлүдүп турарлар:",
-       "nolinkshere": "'''[[:$1]]''' деп арынче шөлүтткен арыннар чок.",
+       "linkshere-2": "Адаандагы арыннар бээр «'''$1'''» шөлүдүп турарлар:",
+       "nolinkshere-2": "'''$1''' деп арынче шөлүтткен арыннар чок.",
        "isredirect": "шиглидер арын",
        "istemplate": "киирткен арыннар",
        "isimage": "файлдың холбаазы",
index e0819e6..c37a572 100644 (file)
        "whatlinkshere": "Татчы чӧлсконъёс",
        "whatlinkshere-title": "«$1» вылэ чӧлскись бамъёс",
        "whatlinkshere-page": "Бам:",
-       "linkshere": "Та бамъёс <strong>[[:$1]]</strong> вылэ чӧлско:",
+       "linkshere-2": "Та бамъёс <strong>$1</strong> вылэ чӧлско:",
        "isredirect": "ыстӥсь бам",
        "istemplate": "пыртон",
        "isimage": "файл линк",
index b6d2f49..1597e1e 100644 (file)
        "whatlinkshere": "بۇ جايدىكى ئۇلانما",
        "whatlinkshere-title": "\"$1\" بەتكە ئۇلانغان بەتلەر",
        "whatlinkshere-page": "بەت:",
-       "linkshere": "تۆۋەندىكى بەتلەر '''[[:$1]]'''غا ئۇلانغان:",
-       "nolinkshere": "'''[[:$1]]'''غا ئۇلانغان بەت يوق.",
-       "nolinkshere-ns": "تاللانغان ئات بوشلۇقىدا '''[[:$1]]''' غا ئۇلانغان بەت يوق.",
+       "linkshere-2": "تۆۋەندىكى بەتلەر '''$1'''غا ئۇلانغان:",
+       "nolinkshere-2": "'''$1'''غا ئۇلانغان بەت يوق.",
+       "nolinkshere-ns-2": "تاللانغان ئات بوشلۇقىدا '''$1''' غا ئۇلانغان بەت يوق.",
        "isredirect": "قايتا نىشان بەلگىلەنگەن بەت",
        "istemplate": "ئۆز ئىچىگە ئالغان",
        "isimage": "ھۆججەت ئۇلانما",
        "fileduplicatesearch-result-n": " \"$1\" ھۆججەتنىڭ تامامەن ئوخشاش {{PLURAL:$2|1 تەكرار|$2 تەكرار}} نۇسخىسى بار.",
        "fileduplicatesearch-noresults": "\"$1\" ئاتلىق ھۆججەت تېپىلمىدى.",
        "specialpages": "ئالاھىدە بەتلەر",
+       "specialpages-note-restricted": "!!FUZZY!!* ئادەتتىكى ئالاھىدە بەت.\n* <strong class=\"mw-specialpagerestricted\">چەكلىمىلىك ئالاھىدە بەتلەر.</strong>\n* <span class=\"mw-specialpagecached\">غەملەنگەن ئالاھىدە بەتلەر(ۋاقتى ئۆتكەن بولۇشى مۇمكىن).</span>",
        "specialpages-group-maintenance": "ئاسراش دوكلاتى",
        "specialpages-group-other": "باشقا ئالاھىدە بەتلەر",
        "specialpages-group-login": "تىزىملىتىش / كىرىش",
index 32a5e95..cbe479d 100644 (file)
        "whatlinkshere": "Посилання сюди",
        "whatlinkshere-title": "Сторінки, що посилаються на «$1»",
        "whatlinkshere-page": "Сторінка:",
-       "linkshere": "Такі сторінки посилаються на '''[[:$1]]''':",
-       "nolinkshere": "На статтю '''[[:$1]]''' не вказує жодна стаття.",
-       "nolinkshere-ns": "У вибраному просторі назв нема сторінок, що посилаються на '''[[:$1]]'''.",
+       "linkshere-2": "Такі сторінки посилаються на '''$1''':",
+       "nolinkshere-2": "На статтю '''$1''' не вказує жодна стаття.",
+       "nolinkshere-ns-2": "У вибраному просторі назв нема сторінок, що посилаються на '''$1'''.",
        "isredirect": "сторінка-перенаправлення",
        "istemplate": "включення",
        "isimage": "посилання на файл",
index 7f10673..fa0f81b 100644 (file)
        "whatlinkshere": "مربوط صفحات",
        "whatlinkshere-title": "«$1» سے مربوط صفحات",
        "whatlinkshere-page": "صفحہ:",
-       "linkshere": "<strong>[[:$1]]</strong> سے درج ذیل صفحات مربوط ہیں:",
-       "nolinkshere": "<strong>[[:$1]]</strong> سے کوئی صفحہ مربوط نہیں ہے۔",
-       "nolinkshere-ns": "منتخب نام فضا میں <strong>[[:$1]]</strong> سے مربوط کوئی صفحہ نہیں ہے۔",
+       "linkshere-2": "<strong>$1</strong> سے درج ذیل صفحات مربوط ہیں:",
+       "nolinkshere-2": "<strong>$1</strong> سے کوئی صفحہ مربوط نہیں ہے۔",
+       "nolinkshere-ns-2": "منتخب نام فضا میں <strong>$1</strong> سے مربوط کوئی صفحہ نہیں ہے۔",
        "isredirect": "رجوع مکرر صفحہ",
        "istemplate": "شامل شدہ",
        "isimage": "فائل کا ربط",
index 09c9da0..71afccf 100644 (file)
        "whatlinkshere": "Bogʻliq sahifalar",
        "whatlinkshere-title": "„$1“ga bogʻlangan sahifalar",
        "whatlinkshere-page": "Sahifa:",
-       "linkshere": "Quyidagi sahifalar '''[[:$1]]''' sahifasiga bogʻlangan:",
-       "nolinkshere": "'''[[:$1]]''' sahifasiga hech qaysi sahifa bog‘lanmagan.",
-       "nolinkshere-ns": "Tanlangan nomfazoda '''[[:$1]]'''ga bog‘langan sahifalar mavjud emas.",
+       "linkshere-2": "Quyidagi sahifalar '''$1''' sahifasiga bogʻlangan:",
+       "nolinkshere-2": "'''$1''' sahifasiga hech qaysi sahifa bog‘lanmagan.",
+       "nolinkshere-ns-2": "Tanlangan nomfazoda '''$1'''ga bog‘langan sahifalar mavjud emas.",
        "isredirect": "yoʻnaltiruvchi sahifa",
        "istemplate": "qoʻshimcha",
        "isimage": "faylli havola",
index b853818..ca2c385 100644 (file)
        "whatlinkshere": "Punta qua",
        "whatlinkshere-title": "Pagine che ponta a ''$1''",
        "whatlinkshere-page": "Pagina:",
-       "linkshere": "Ste pagine qua le ponta a '''[[:$1]]''':",
-       "nolinkshere": "Nissuna pagina la contien colegamenti che punta a '''[[:$1]]'''.",
-       "nolinkshere-ns": "No ghe xe pagine che punta a '''[[:$1]]''' nel namespace selezionà.",
+       "linkshere-2": "Ste pagine qua le ponta a '''$1''':",
+       "nolinkshere-2": "Nissuna pagina la contien colegamenti che punta a '''$1'''.",
+       "nolinkshere-ns-2": "No ghe xe pagine che punta a '''$1''' nel namespace selezionà.",
        "isredirect": "Pagina de rimando",
        "istemplate": "inclusion",
        "isimage": "colegamento verso file",
        "fileduplicatesearch-noresults": "Nisun file de nome \"$1\" trovà.",
        "specialpages": "Pagine speciali",
        "specialpages-note-top": "Legenda",
+       "specialpages-note-restricted": "!!FUZZY!!* Pàjine speciałi normałi.\n* <span class=\"mw-specialpagerestricted\">Pàjine speciałi a aceso limità.</span>",
        "specialpages-group-maintenance": "Resoconti de manutenzion",
        "specialpages-group-other": "Altre pagine speciali",
        "specialpages-group-login": "Login / registrasion",
index 6a40619..5bf60b2 100644 (file)
        "whatlinkshere": "Kosketused - nakhu",
        "whatlinkshere-title": "Lehtpoled, kudambad kosketadas \"$1\"-lehtpolen",
        "whatlinkshere-page": "Lehtpol’:",
-       "linkshere": "Nened lehtpoled kosketadas '''[[:$1]]''':",
-       "nolinkshere": "'''[[:$1]]'''-lehtpol't ei kosketa ni üks' lehtpol'.",
-       "nolinkshere-ns": "'''[[:$1]]'''-lehtpol't ei kosketa ni üks' lehtpol' valitud nimiavarudes.",
+       "linkshere-2": "Nened lehtpoled kosketadas '''$1''':",
+       "nolinkshere-2": "'''$1'''-lehtpol't ei kosketa ni üks' lehtpol'.",
+       "nolinkshere-ns-2": "'''$1'''-lehtpol't ei kosketa ni üks' lehtpol' valitud nimiavarudes.",
        "isredirect": "Oigendai lehtpol'",
        "istemplate": "mülütand",
        "isimage": "Kosketuz failale",
        "fileduplicatesearch-result-1": "\"$1\"-failal ei ole identižid dublikatoid.",
        "fileduplicatesearch-result-n": "\"$1\"-failal om {{PLURAL:$2|1 identine kopii|$2 identišt kopijad}}.",
        "specialpages": "Specialižed lehtpoled",
+       "specialpages-note-restricted": "!!FUZZY!!* Järgeližed specialižed lehtpoled.\n* <span class=\"mw-specialpagerestricted\">Kaitud specialižed lehtpoled.</span>",
        "specialpages-group-maintenance": "Tehnižen holitandan satusenladindad",
        "specialpages-group-other": "Toižed specialižed lehtpoled",
        "specialpages-group-login": "Kirjutadas sistemha / Sada registracii",
index aa78905..3c34fe8 100644 (file)
        "whatlinkshere": "Các liên kết đến đây",
        "whatlinkshere-title": "Các trang liên kết đến “$1”",
        "whatlinkshere-page": "Trang:",
-       "linkshere": "Các trang sau liên kết đến '''[[:$1]]''':",
-       "nolinkshere": "Không có trang nào liên kết đến '''[[:$1]]'''.",
-       "nolinkshere-ns": "Không có trang nào liên kết đến '''[[:$1]]''' trong không gian tên đã chọn.",
+       "linkshere-2": "Các trang sau liên kết đến '''$1''':",
+       "nolinkshere-2": "Không có trang nào liên kết đến '''$1'''.",
+       "nolinkshere-ns-2": "Không có trang nào liên kết đến '''$1''' trong không gian tên đã chọn.",
        "isredirect": "trang đổi hướng",
        "istemplate": "được nhúng vào",
        "isimage": "liên kết tập tin",
index a8988bf..6fa865f 100644 (file)
        "whatlinkshere": "Linggs af däj Saidn",
        "whatlinkshere-title": "Sajdn, di af „$1“ fârwajsn",
        "whatlinkshere-page": "Sajdn:",
-       "linkshere": "Dii afgfiirdn sajdn fârwajsn af ''„[[:$1]]“''':",
-       "nolinkshere": "Ka Seidn verlingt af '''„[[:$1]]“'''.",
+       "linkshere-2": "Dii afgfiirdn sajdn fârwajsn af ''„$1“''':",
+       "nolinkshere-2": "Ka Seidn verlingt af '''„$1“'''.",
        "isredirect": "Wajdârlajdungssajdn",
        "istemplate": "Foorlaachn-ajbindung",
        "isimage": "Daddeilink",
index 43a7b83..4885cf7 100644 (file)
        "whatlinkshere": "Yüms isio",
        "whatlinkshere-title": "Pads ad \"$1\" yumöls",
        "whatlinkshere-page": "Pad:",
-       "linkshere": "Pads sököl payümons ko '''[[:$1]]''':",
-       "nolinkshere": "Pads nonik peyümons lü '''[[:$1]]'''.",
-       "nolinkshere-ns": "Pads nonik yumons lü pad: '''[[:$1]]''' in nemaspad pevälöl.",
+       "linkshere-2": "Pads sököl payümons ko '''$1''':",
+       "nolinkshere-2": "Pads nonik peyümons lü '''$1'''.",
+       "nolinkshere-ns-2": "Pads nonik yumons lü pad: '''$1''' in nemaspad pevälöl.",
        "isredirect": "lüodükömapad",
        "istemplate": "ninükam",
        "isimage": "yüm ragiva",
        "fileduplicatesearch-result-1": "Ragiv: „$1“ no labon telükoti kuratik.",
        "fileduplicatesearch-result-n": "Ragiv: „$1“ labon {{PLURAL:$2|telükoti kuratik bal|telükotis kuratik $2}}.",
        "specialpages": "Pads patik",
+       "specialpages-note-restricted": "!!FUZZY!!* Pads patik nomik.\n* <span class=\"mw-specialpagerestricted\">Pads patik pemiedüköl.</span>",
        "specialpages-group-maintenance": "Nunods tefü kiped",
        "specialpages-group-other": "Pads patik votik",
        "specialpages-group-login": "Nunädön oki / jafön kali",
index f888f7b..97d736b 100644 (file)
        "whatlinkshere": "Linkid tänne",
        "whatlinkshere-title": "Cüľľed, kummad näütellä cüľľelle \"$1\"",
        "whatlinkshere-page": "Cülci:",
-       "linkshere": "Vahtiaavilt cülciilt on linkki cüľľelle '''[[:$1]]''':",
-       "nolinkshere": "Mitäid eb viitata '''[[:$1]]-sõ'''",
+       "linkshere-2": "Vahtiaavilt cülciilt on linkki cüľľelle '''$1''':",
+       "nolinkshere-2": "Mitäid eb viitata '''$1-sõ'''",
        "isredirect": "mešaituzcülci",
        "istemplate": "sisällütüz šabloonii",
        "isimage": "kuvalinkki",
index 9b0c24a..53714a7 100644 (file)
        "whatlinkshere": "Siiäq näütäjäq lingiq",
        "whatlinkshere-title": "Leheq, miä näütäseq lehe \"$1\" pääle",
        "whatlinkshere-page": "Leht:",
-       "linkshere": "Lehe <b>[[:$1]]</b> pääle näütäseq lingiq lehti päält:",
-       "nolinkshere": "Lehe <b>[[:$1]]</b> pääle näütä-i linke ütegi lehe päält.",
-       "nolinkshere-ns": "Valitun nimeruumin näütä-i ütegi lehe päält linke lehe '''[[:$1]]''' pääle.",
+       "linkshere-2": "Lehe <b>$1</b> pääle näütäseq lingiq lehti päält:",
+       "nolinkshere-2": "Lehe <b>$1</b> pääle näütä-i linke ütegi lehe päält.",
+       "nolinkshere-ns-2": "Valitun nimeruumin näütä-i ütegi lehe päält linke lehe '''$1''' pääle.",
        "isredirect": "ümbresaatmislehekülg",
        "istemplate": "pruugit näüdüssen",
        "isimage": "teedüstülink",
        "fileduplicatesearch-filename": "Teedüstünimi:",
        "fileduplicatesearch-submit": "Otsiq",
        "specialpages": "Tallitusleheküleq",
+       "specialpages-note-restricted": "!!FUZZY!!!!FUZZY!!!!FUZZY!!* Hariliguq tallitusleheq.\n* <strong class=\"mw-specialpagerestricted\">Piiredüq tallitusleheq.</strong>",
        "specialpages-group-maintenance": "Kõrranpidämisteedüseq",
        "specialpages-group-other": "Muuq tallitusleheq",
        "specialpages-group-login": "Nimega sisseminek / Pruukjanime luuminõ",
index 946da53..20a8a69 100644 (file)
        "whatlinkshere": "Pådjes ki loynut chal",
        "whatlinkshere-title": "Pådjes ki loynut aviè «$1»",
        "whatlinkshere-page": "Pådje:",
-       "linkshere": "Les pådjes ki shuvèt ont des loyéns viè '''[[:$1]]''':",
-       "nolinkshere": "Nole pådje avou des loyéns viè '''[[:$1]]'''.",
+       "linkshere-2": "Les pådjes ki shuvèt ont des loyéns viè '''$1''':",
+       "nolinkshere-2": "Nole pådje avou des loyéns viè '''$1'''.",
        "isredirect": "pådje di redjiblaedje",
        "isimage": "loyén viè l' fitchî",
        "whatlinkshere-prev": "{{PLURAL:$1|di dvant|$1 di dvant}}",
index b03b0a9..7f8ae9a 100644 (file)
        "whatlinkshere": "Mga nasumpay dinhi",
        "whatlinkshere-title": "Mga pakli nga nasumpay ngadto ha \"$1\"",
        "whatlinkshere-page": "Pakli:",
-       "linkshere": "An masunod nga mga pakli in nasumpay ha '''[[:$1]]''':",
-       "nolinkshere": "Waray mga pakli nga nasumpay ha '''[[:$1]]'''",
+       "linkshere-2": "An masunod nga mga pakli in nasumpay ha '''$1''':",
+       "nolinkshere-2": "Waray mga pakli nga nasumpay ha '''$1'''",
        "isredirect": "Redirek nga pakli",
        "istemplate": "transklusyon",
        "isimage": "sumpay han fayl",
index f1cbdda..80f245a 100644 (file)
        "whatlinkshere": "Xët yi mu lëkkalool",
        "whatlinkshere-title": "Xët yi lëkkalook wii « $1 »",
        "whatlinkshere-page": "Xët :",
-       "linkshere": "Xët yii ci suuf am nañ ab lëkkalekaay buy jëm <b>[[:$1]]</b> :",
-       "nolinkshere": "Amul wenn xët wu lëkkalook wii <b>[[:$1]]</b>.",
-       "nolinkshere-ns": "Amul wenn xët wu lëkkalook wii '''[[:$1]]''' ci barabu tur bi nga tànn.",
+       "linkshere-2": "Xët yii ci suuf am nañ ab lëkkalekaay buy jëm <b>$1</b> :",
+       "nolinkshere-2": "Amul wenn xët wu lëkkalook wii <b>$1</b>.",
+       "nolinkshere-ns-2": "Amul wenn xët wu lëkkalook wii '''$1''' ci barabu tur bi nga tànn.",
        "isredirect": "Xëtu jubluwaat",
        "istemplate": "mboole",
        "isimage": "lëkkalekaayu dencukaay bi",
index 3e1f16e..0136f2e 100644 (file)
        "whatlinkshere": "链进来点啥",
        "whatlinkshere-title": "链接到“$1”个页面",
        "whatlinkshere-page": "页面:",
-       "linkshere": "下头个页链到[[:$1]]:",
-       "nolinkshere": "呒不页面链到<strong>[[:$1]]</strong>。",
+       "linkshere-2": "下头个页链到$1:",
+       "nolinkshere-2": "呒不页面链到<strong>$1</strong>。",
        "isredirect": "转戳页",
        "istemplate": "包括",
        "isimage": "文件鏈接",
index 4bec10d..8fb37e0 100644 (file)
        "whatlinkshere": "Эн һазрур заалһуд",
        "whatlinkshere-title": "«$1» гидг нерәдлһтә халхд заалдг халхс",
        "whatlinkshere-page": "Халх:",
-       "linkshere": "Тер халхс '''[[:$1]]''' халхд заалдг:",
+       "linkshere-2": "Тер халхс '''$1''' халхд заалдг:",
        "isredirect": "авч оддг халх",
        "istemplate": "оруллһн",
        "isimage": "зургин  заалһ",
index aec1a47..1930403 100644 (file)
        "whatlinkshere": "სოვრეშე რე თე ხასჷლა წურაფილი",
        "whatlinkshere-title": "ხასჷლეფი, ნამუთ გინორცხილ რე $1-შა",
        "whatlinkshere-page": "ხასჷლა:",
-       "linkshere": "გეჸვენჯ ხასჷლეფი გინარცხუაფუ '''[[:$1]]'''-ეფს",
-       "nolinkshere": "ნამთინ ხასილა ვა რე გინორცხილ '''[[:$1]]'''-შა.",
+       "linkshere-2": "გეჸვენჯ ხასჷლეფი გინარცხუაფუ '''$1'''-ეფს",
+       "nolinkshere-2": "ნამთინ ხასილა ვა რე გინორცხილ '''$1'''-შა.",
        "isredirect": "გინოწურაფაშ ხასჷლა",
        "istemplate": "ტრანსკლუზია",
        "isimage": "ფაილიშ რცხი",
        "fileduplicatesearch-submit": "გორუა",
        "specialpages": "გჷშაკერძაფილი ხასჷლეფი",
        "specialpages-note-top": "ლეგენდა",
+       "specialpages-note-restricted": "* ჩვეულებრივი სპეცგვერდები.\n* <span class=\"mw-specialpagerestricted\">სპეცგვერდები შეზღუდული წვდომით.</span>",
        "specialpages-group-maintenance": "ტექნიკური მომსახურების ანგარიშები",
        "specialpages-group-other": "სხვა სპეციალური გვერდები",
        "specialpages-group-login": "მიშულა/ანგარიშიშ გონწყუმა",
index c9a0170..200fc66 100644 (file)
        "whatlinkshere": "װאָס פֿאַרבינדט אַהער",
        "whatlinkshere-title": "בלעטער וואס פֿארבינדן צו $1",
        "whatlinkshere-page": "בלאַט:",
-       "linkshere": "די פאלגנדע בלעטער פארבינדן צום בלאט '''[[:$1]]''':",
-       "nolinkshere": "קיין שום בלאט פארבינדט נישט צו '''[[:$1]]'''.",
-       "nolinkshere-ns": "קיין בלעטער פֿאַרבינדן נישט צו '''[[:$1]]''' אינעם אויסגעקליבענעם נאמענטייל.",
+       "linkshere-2": "די פאלגנדע בלעטער פארבינדן צום בלאט '''$1''':",
+       "nolinkshere-2": "קיין שום בלאט פארבינדט נישט צו '''$1'''.",
+       "nolinkshere-ns-2": "קיין בלעטער פֿאַרבינדן נישט צו '''$1''' אינעם אויסגעקליבענעם נאמענטייל.",
        "isredirect": "ווײַטערפירן בלאט",
        "istemplate": "אײַנשליסן",
        "isimage": "!טעקע לינק",
        "fileduplicatesearch-noresults": "קיין טעקע מיטן נאמען \"$1\" נישט געטראפֿן.",
        "specialpages": "ספעציעלע בלעטער",
        "specialpages-note-top": "לעגענדע",
+       "specialpages-note-restricted": "* נארמאַלע באַזונדערע בלעטער.\n* <span class=\"mw-specialpagerestricted\">באַגרענעצטע באַזונדערע בלעטער.</span>",
        "specialpages-group-maintenance": "אויפֿהאַלטונג באַריכטן",
        "specialpages-group-other": "אַנדערע ספעציעלע בלעטער",
        "specialpages-group-login": "ארײַנלאגירן / שאַפֿן קאנטע",
index 38f7e62..5ec040a 100644 (file)
        "whatlinkshere": "Ìjápọ̀ mọ́ ojúewé yí",
        "whatlinkshere-title": "Àwọn ojúewé tó jápọ̀ mọ́ \"$1\"",
        "whatlinkshere-page": "Ojúewé:",
-       "linkshere": "Àwọn ojúewé wọ̀nyí jápọ̀ mọ́ '''[[:$1]]''':",
-       "nolinkshere": "Kò sí ojúewé tó jápọ̀ mọ́ '''[[:$1]]'''.",
-       "nolinkshere-ns": "Kò sí ojúewé kankan tó jápọ̀ mọ́ '''[[:$1]]''' nínú orúkọàyè yíyàn.",
+       "linkshere-2": "Àwọn ojúewé wọ̀nyí jápọ̀ mọ́ '''$1''':",
+       "nolinkshere-2": "Kò sí ojúewé tó jápọ̀ mọ́ '''$1'''.",
+       "nolinkshere-ns-2": "Kò sí ojúewé kankan tó jápọ̀ mọ́ '''$1''' nínú orúkọàyè yíyàn.",
        "isredirect": "àtúnjúwe ojúewé",
        "istemplate": "ìkómọ́ra",
        "isimage": "ìjápọ̀ fáìlì",
        "fileduplicatesearch-result-n": "Fáìlì \"$1\" ní {{PLURAL:$2|ìdáwòkọ jíjọra 1|ìdáwòkọ jíjọra $2}}.",
        "fileduplicatesearch-noresults": "Kò sí fáìlì tó únjẹ́ \"$1\".",
        "specialpages": "Àwọn ojúewé pàtàkì",
+       "specialpages-note-restricted": "!!FUZZY!!* Àwọn ojúewé pàtàkì onídéédé.\n* <span class=\"mw-specialpagerestricted\">Àwọn ojúewé pàtàkì àìgbàláyè.</span>",
        "specialpages-group-maintenance": "Àwọn ìjábọ̀ ìtọ́jú",
        "specialpages-group-other": "Àwọn ojúewé pàtàkì míràn",
        "specialpages-group-login": "Ìwọlé / ìdá àpamọ́",
index 0710586..b7c88ff 100644 (file)
        "whatlinkshere": "有乜嘢連結來呢度",
        "whatlinkshere-title": "連到「$1」嘅頁",
        "whatlinkshere-page": "頁:",
-       "linkshere": "呢啲頁連結到'''[[:$1]]''':",
-       "nolinkshere": "無一頁連結到'''[[:$1]]'''。",
-       "nolinkshere-ns": "響已經揀咗嘅空間名無嘢連結到'''[[:$1]]'''。",
+       "linkshere-2": "呢啲頁連結到'''$1''':",
+       "nolinkshere-2": "無一頁連結到'''$1'''。",
+       "nolinkshere-ns-2": "響已經揀咗嘅空間名無嘢連結到'''$1'''。",
        "isredirect": "跳轉頁",
        "istemplate": "包含",
        "isimage": "檔案連結",
        "fileduplicatesearch-result-n": "個檔案 \"$1\" 有$2項完全相同嘅重覆。",
        "fileduplicatesearch-noresults": "檔案名\"$1\"找不到",
        "specialpages": "特別頁",
+       "specialpages-note-restricted": "* 標準特別頁。\n* <span class=\"mw-specialpagerestricted\">有限制嘅特別頁。</span>",
        "specialpages-group-maintenance": "維護報告",
        "specialpages-group-other": "其它特別頁",
        "specialpages-group-login": "簽到/開新戶口",
index f8c6f24..a545f62 100644 (file)
        "whatlinkshere": "Links nae deze bladzie",
        "whatlinkshere-title": "Pagina's die verwiez'n nir \"$1\"",
        "whatlinkshere-page": "Pagina:",
-       "linkshere": "De volhende pagina's verwieze nir '''[[:$1]]''':",
-       "nolinkshere": "Hin enkele pagina verwies nir '''[[:$1]]'''.",
+       "linkshere-2": "De volhende pagina's verwieze nir '''$1''':",
+       "nolinkshere-2": "Hin enkele pagina verwies nir '''$1'''.",
        "isredirect": "deurverwiespagina",
        "istemplate": "ingevoegd as sjabloon",
        "isimage": "bestandsverwiezienge",
index 8e18bf7..d72a4e9 100644 (file)
        "whatlinkshere": "ⵎⴰ ⴰⵢⴷ ⵉⵇⵇⵏⵏ ⵙ ⴷⴰ",
        "whatlinkshere-title": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⵉⵣⴷⵉⵏ ⵖⵔ $1",
        "whatlinkshere-page": "ⵜⴰⵙⵏⴰ:",
-       "linkshere": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴷ ⵣⴷⵉⵏ ⵖⵔ <strong>[[:$1]]</strong>:",
-       "nolinkshere": "ⵓⵔ ⵍⵍⵉⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵉⵣⴷⵉⵏ ⵖⵔ <strong>[[:$1]]</strong>",
+       "linkshere-2": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴷ ⵣⴷⵉⵏ ⵖⵔ <strong>$1</strong>:",
+       "nolinkshere-2": "ⵓⵔ ⵍⵍⵉⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵉⵣⴷⵉⵏ ⵖⵔ <strong>$1</strong>",
        "isredirect": "ⵙⵡⴰⵍⴰ ⵜⴰⵙⵏⴰ",
        "istemplate": "ⴰⵙⵙⵓⵎⵢ",
        "isimage": "ⴰⵙⵖⵓⵏ ⵏ ⵓⴼⴰⵢⵍⵓ",
index c890f9a..4bac2bb 100644 (file)
        "apisandbox-dynamic-parameters-add-label": "添加参数:",
        "apisandbox-dynamic-parameters-add-placeholder": "参数名称",
        "apisandbox-dynamic-error-exists": "已存在名为“$1”的参数。",
+       "apisandbox-templated-parameter-reason": "此[[Special:ApiHelp/main#main/templatedparams|模板参数]]已基于$2的{{PLURAL:$1|值}}提供。",
        "apisandbox-deprecated-parameters": "弃用参数",
        "apisandbox-fetch-token": "自动填充令牌",
        "apisandbox-add-multi": "添加",
        "whatlinkshere": "链入页面",
        "whatlinkshere-title": "链接至“$1”的页面",
        "whatlinkshere-page": "页面:",
-       "linkshere": "以下页面链接至<strong>[[:$1]]</strong>:",
-       "nolinkshere": "没有页面链接至'''[[:$1]]'''。",
-       "nolinkshere-ns": "在所选的名字空间内没有页面链接到'''[[:$1]]'''。",
+       "linkshere-2": "以下页面链接至<strong>$1</strong>:",
+       "nolinkshere-2": "没有页面链接至'''$1'''。",
+       "nolinkshere-ns-2": "在所选的名字空间内没有页面链接到'''$1'''。",
        "isredirect": "重定向页面",
        "istemplate": "嵌入",
        "isimage": "文件链接",
        "pagedata-title": "页面数据",
        "pagedata-text": "此页面提供相关页面的数据界面。请在URL中,使用子页面语法提供页面标题。\n* 内容协商基于您客户端的接受标头应用。这意味着页面数据将以您客户端首选的格式提供。",
        "pagedata-not-acceptable": "没有找到匹配的格式。支持的MIME类型:$1",
-       "pagedata-bad-title": "无效标题:$1。"
+       "pagedata-bad-title": "无效标题:$1。",
+       "unregistered-user-config": "由于安全原因,JavaScript、CSS和JSON用户子页面不能为非注册用户加载。"
 }
index 39f8361..7d331e1 100644 (file)
        "protectedtitles-submit": "顯示標題",
        "listusers": "使用者清單",
        "listusers-editsonly": "只顯示有編輯的使用者",
+       "listusers-temporarygroupsonly": "僅顯示在臨時使用者群組的使用者",
        "listusers-creationsort": "依建立日期排序",
        "listusers-desc": "使用降冪排序",
        "usereditcount": "$1 次{{PLURAL:$1|編輯}}",
        "apisandbox-dynamic-parameters-add-label": "加入參數:",
        "apisandbox-dynamic-parameters-add-placeholder": "參數名稱",
        "apisandbox-dynamic-error-exists": "命名的參數 \"$1\" 已經存在。",
+       "apisandbox-templated-parameter-reason": "此[[Special:ApiHelp/main#main/templatedparams|模板參數]]基於 $2 裡的{{PLURAL:$1|值|值}}來提供。",
        "apisandbox-deprecated-parameters": "停用的參數",
        "apisandbox-fetch-token": "自動填寫密鑰",
        "apisandbox-add-multi": "新增",
        "whatlinkshere": "連結至此的頁面",
        "whatlinkshere-title": "連結至「$1」的頁面",
        "whatlinkshere-page": "頁面:",
-       "linkshere": "以下頁面連結至 <strong>[[:$1]]</strong>:",
-       "nolinkshere": "沒有頁面連結至 <strong>[[:$1]]</strong>。",
-       "nolinkshere-ns": "已選擇的命名空間中沒有頁面連結到 [[:$1]]。",
+       "linkshere-2": "以下頁面連結至 <strong>$1</strong>:",
+       "nolinkshere-2": "沒有頁面連結至 <strong>$1</strong>。",
+       "nolinkshere-ns-2": "已選擇的命名空間中沒有頁面連結到 $1。",
        "isredirect": "重新導向頁面",
        "istemplate": "引用",
        "isimage": "檔案連結",
        "pagedata-text": "此頁面提供了至頁面的資料介面。請使用子頁面語法在 URL 裡提供頁面標題。\n* 內容協商會基於您客戶端接受標頭來套用,這代表頁面資料會以由您客戶端所首選格式來提供。",
        "pagedata-not-acceptable": "查無符合的格式,支援的 MIME 類型有:$1",
        "pagedata-bad-title": "無效的標題:$1。",
-       "unregistered-user-config": "基於安全緣故未註冊的使用者不會載入 JavaScript、CSS,以及 JSON 使用者子頁面。"
+       "unregistered-user-config": "基於安全緣故未註冊的使用者不會載入 JavaScript、CSS,以及 JSON 使用者子頁面。",
+       "passwordpolicies": "密碼方針",
+       "passwordpolicies-summary": "這是定義在此 wiki 上可用於使用者群組的有效密碼方針清單。",
+       "passwordpolicies-group": "群組",
+       "passwordpolicies-policies": "方針",
+       "passwordpolicies-policy-minimalpasswordlength": "密碼必須至少 $1 個{{PLURAL:$1|字元|字元}}長度",
+       "passwordpolicies-policy-minimumpasswordlengthtologin": "密碼必須至少 $1 個{{PLURAL:$1|字元|字元}}長度以用於登入",
+       "passwordpolicies-policy-passwordcannotmatchusername": "密碼不可以和使用者名稱相同",
+       "passwordpolicies-policy-passwordcannotmatchblacklist": "密碼不可以同於被列入黑名單的特定密碼",
+       "passwordpolicies-policy-maximalpasswordlength": "密碼必須小於 $1 個{{PLURAL:$1|字元|字元}}長度",
+       "passwordpolicies-policy-passwordcannotbepopular": "密碼不可以是{{PLURAL:$1|常用密碼內容|在清單中的編號 $1 常用密碼}}"
 }
index 16a12de..7a7370f 100644 (file)
@@ -468,6 +468,7 @@ $specialPageAliases = [
        'PagesWithProp'             => [ 'PagesWithProp', 'Pageswithprop', 'PagesByProp', 'Pagesbyprop' ],
        'PageData'                  => [ 'PageData' ],
        'PageLanguage'              => [ 'PageLanguage' ],
+       'PasswordPolicies'          => [ 'PasswordPolicies' ],
        'PasswordReset'             => [ 'PasswordReset' ],
        'PermanentLink'             => [ 'PermanentLink', 'PermaLink' ],
        'Preferences'               => [ 'Preferences' ],
index 18eb9fa..e607992 100644 (file)
@@ -11,6 +11,8 @@
  * @author Reedy
  */
 
+$fallback = 'pt';
+
 $namespaceNames = [
        NS_MEDIA            => 'Media',
        NS_SPECIAL          => 'Espesiál',
diff --git a/maintenance/archives/patch-change_tag-tag_id.sql b/maintenance/archives/patch-change_tag-tag_id.sql
new file mode 100644 (file)
index 0000000..15b1c95
--- /dev/null
@@ -0,0 +1,7 @@
+--
+-- Add ctd_tag_id to change_tag table to normalize it
+--
+ALTER TABLE /*_*/change_tag
+  ADD COLUMN ct_tag_id int unsigned NULL;
+
+CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
diff --git a/maintenance/mssql/archives/patch-change_tag-tag_id.sql b/maintenance/mssql/archives/patch-change_tag-tag_id.sql
new file mode 100644 (file)
index 0000000..869ee11
--- /dev/null
@@ -0,0 +1,7 @@
+--
+-- Add ctd_tag_id to change_tag table to normalize it
+--
+ALTER TABLE /*_*/change_tag
+  ADD COLUMN ct_tag_id int NULL CONSTRAINT ctd_tag_id__fk FOREIGN KEY REFERENCES /*_*/change_tag_def(ctd_id);
+
+CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
index 315cb20..fbe207d 100644 (file)
@@ -1403,7 +1403,9 @@ CREATE TABLE /*_*/change_tag (
   -- Tag applied
   ct_tag nvarchar(255) NOT NULL,
   -- Parameters for the tag, presently unused
-  ct_params nvarchar(max) NULL
+  ct_params nvarchar(max) NULL,
+  -- Foreign key to change_tag_def row
+  ct_tag_id int NULL CONSTRAINT ctd_tag_id__fk FOREIGN KEY REFERENCES /*_*/change_tag_def(ctd_id)
 );
 
 CREATE UNIQUE INDEX /*i*/change_tag_rc_tag ON /*_*/change_tag (ct_rc_id,ct_tag);
@@ -1411,7 +1413,7 @@ CREATE UNIQUE INDEX /*i*/change_tag_log_tag ON /*_*/change_tag (ct_log_id,ct_tag
 CREATE UNIQUE INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag (ct_rev_id,ct_tag);
 -- Covering index, so we can pull all the info only out of the index.
 CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
-
+CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
 -- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT
 -- that only works on MySQL 4.1+
diff --git a/maintenance/oracle/archives/patch-change_tag-tag_id.sql b/maintenance/oracle/archives/patch-change_tag-tag_id.sql
new file mode 100644 (file)
index 0000000..1f4067c
--- /dev/null
@@ -0,0 +1,6 @@
+--
+-- Add ctd_tag_id to change_tag table to normalize it
+--
+ALTER TABLE &mw_prefix.change_tag ADD ( ct_tag_id NUMBER DEFAULT NULL );
+
+CREATE INDEX &mw_prefix.change_tag_i02 ON &mw_prefix.change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
index df74f64..6e36752 100644 (file)
@@ -942,13 +942,15 @@ CREATE TABLE &mw_prefix.change_tag (
   ct_log_id NUMBER NULL,
   ct_rev_id NUMBER NULL,
   ct_tag VARCHAR2(255) NOT NULL,
-  ct_params BLOB NULL
+  ct_params BLOB NULL,
+  ct_tag_id NUMBER NULL,
 );
 ALTER TABLE &mw_prefix.change_tag ADD CONSTRAINT &mw_prefix.change_tag_pk PRIMARY KEY (ct_id);
 CREATE UNIQUE INDEX &mw_prefix.change_tag_u01 ON &mw_prefix.change_tag (ct_rc_id,ct_tag);
 CREATE UNIQUE INDEX &mw_prefix.change_tag_u02 ON &mw_prefix.change_tag (ct_log_id,ct_tag);
 CREATE UNIQUE INDEX &mw_prefix.change_tag_u03 ON &mw_prefix.change_tag (ct_rev_id,ct_tag);
 CREATE INDEX &mw_prefix.change_tag_i01 ON &mw_prefix.change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
+CREATE INDEX &mw_prefix.change_tag_i02 ON &mw_prefix.change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
 CREATE TABLE &mw_prefix.tag_summary (
   ts_id NUMBER NOT NULL,
index 492a0d5..cf0eb2f 100644 (file)
@@ -807,13 +807,15 @@ CREATE TABLE change_tag (
   ct_log_id  INTEGER      NULL,
   ct_rev_id  INTEGER      NULL,
   ct_tag     TEXT     NOT NULL,
-  ct_params  TEXT         NULL
+  ct_params  TEXT         NULL,
+  ct_tag_id  INTEGER      NULL
 );
 ALTER SEQUENCE change_tag_ct_id_seq OWNED BY change_tag.ct_id;
 CREATE UNIQUE INDEX change_tag_rc_tag ON change_tag(ct_rc_id,ct_tag);
 CREATE UNIQUE INDEX change_tag_log_tag ON change_tag(ct_log_id,ct_tag);
 CREATE UNIQUE INDEX change_tag_rev_tag ON change_tag(ct_rev_id,ct_tag);
 CREATE INDEX change_tag_tag_id ON change_tag(ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
+CREATE INDEX change_tag_tag_id_id ON change_tag(ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
 CREATE SEQUENCE tag_summary_ts_id_seq;
 CREATE TABLE tag_summary (
index 231001d..889ab42 100755 (executable)
@@ -43,15 +43,15 @@ rm -r "$REPO_DIR/$TARGET_DIR"
 
 # Core and thematic code and styling
 mkdir -p "$REPO_DIR/$TARGET_DIR"
-cp ./node_modules/oojs-ui/dist/oojs-ui-core.js{,.map} "$REPO_DIR/$TARGET_DIR"
+cp ./node_modules/oojs-ui/dist/oojs-ui-core.js{,.map.json} "$REPO_DIR/$TARGET_DIR"
 cp ./node_modules/oojs-ui/dist/oojs-ui-core-{wikimediaui,apex}.css "$REPO_DIR/$TARGET_DIR"
-cp ./node_modules/oojs-ui/dist/oojs-ui-widgets.js{,.map} "$REPO_DIR/$TARGET_DIR"
+cp ./node_modules/oojs-ui/dist/oojs-ui-widgets.js{,.map.json} "$REPO_DIR/$TARGET_DIR"
 cp ./node_modules/oojs-ui/dist/oojs-ui-widgets-{wikimediaui,apex}.css "$REPO_DIR/$TARGET_DIR"
-cp ./node_modules/oojs-ui/dist/oojs-ui-toolbars.js{,.map} "$REPO_DIR/$TARGET_DIR"
+cp ./node_modules/oojs-ui/dist/oojs-ui-toolbars.js{,.map.json} "$REPO_DIR/$TARGET_DIR"
 cp ./node_modules/oojs-ui/dist/oojs-ui-toolbars-{wikimediaui,apex}.css "$REPO_DIR/$TARGET_DIR"
-cp ./node_modules/oojs-ui/dist/oojs-ui-windows.js{,.map} "$REPO_DIR/$TARGET_DIR"
+cp ./node_modules/oojs-ui/dist/oojs-ui-windows.js{,.map.json} "$REPO_DIR/$TARGET_DIR"
 cp ./node_modules/oojs-ui/dist/oojs-ui-windows-{wikimediaui,apex}.css "$REPO_DIR/$TARGET_DIR"
-cp ./node_modules/oojs-ui/dist/oojs-ui-{wikimediaui,apex}.js{,.map} "$REPO_DIR/$TARGET_DIR"
+cp ./node_modules/oojs-ui/dist/oojs-ui-{wikimediaui,apex}.js{,.map.json} "$REPO_DIR/$TARGET_DIR"
 
 # i18n
 mkdir -p "$REPO_DIR/$TARGET_DIR/i18n"
index ed3bd43..53c1529 100644 (file)
@@ -1842,10 +1842,12 @@ CREATE TABLE /*_*/change_tag (
   ct_log_id int unsigned NULL,
   -- REVID for the change
   ct_rev_id int unsigned NULL,
-  -- Tag applied
+  -- Tag applied, this will go away and be replaced with ct_tag_id
   ct_tag varchar(255) NOT NULL,
   -- Parameters for the tag; used by some extensions
-  ct_params blob NULL
+  ct_params blob NULL,
+  -- Foreign key to change_tag_def row, this will be "NOT NULL" once populated
+  ct_tag_id int unsigned NULL
 ) /*$wgDBTableOptions*/;
 
 CREATE UNIQUE INDEX /*i*/change_tag_rc_tag ON /*_*/change_tag (ct_rc_id,ct_tag);
@@ -1853,7 +1855,7 @@ CREATE UNIQUE INDEX /*i*/change_tag_log_tag ON /*_*/change_tag (ct_log_id,ct_tag
 CREATE UNIQUE INDEX /*i*/change_tag_rev_tag ON /*_*/change_tag (ct_rev_id,ct_tag);
 -- Covering index, so we can pull all the info only out of the index.
 CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
-
+CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
 -- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT
 -- that only works on MySQL 4.1+
index 77391a8..d718fb6 100644 (file)
@@ -890,75 +890,73 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.api' => [
-               'scripts' => 'resources/src/mediawiki.api.js',
+               'scripts' => [
+                       'resources/src/mediawiki.api/index.js',
+                       'resources/src/mediawiki.api/category.js',
+                       'resources/src/mediawiki.api/edit.js',
+                       'resources/src/mediawiki.api/login.js',
+                       'resources/src/mediawiki.api/messages.js',
+                       'resources/src/mediawiki.api/options.js',
+                       'resources/src/mediawiki.api/parse.js',
+                       'resources/src/mediawiki.api/rollback.js',
+                       'resources/src/mediawiki.api/upload.js',
+                       'resources/src/mediawiki.api/user.js',
+                       'resources/src/mediawiki.api/watch.js',
+               ],
                'dependencies' => [
+                       'mediawiki.Title',
                        'mediawiki.util',
                        'user.tokens',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.api.category' => [
-               'scripts' => 'resources/src/mediawiki.api.category.js',
-               'dependencies' => [
-                       'mediawiki.api',
-                       'mediawiki.Title',
-               ],
+               'deprecated' => 'Use "mediawiki.api" instead.',
+               'dependencies' => 'mediawiki.api',
        ],
        'mediawiki.api.edit' => [
-               'scripts' => 'resources/src/mediawiki.api.edit.js',
+               'deprecated' => 'Use "mediawiki.api" instead.',
                'dependencies' => [
                        'mediawiki.api',
-                       'mediawiki.user',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.api.login' => [
-               'scripts' => 'resources/src/mediawiki.api.login.js',
+               'deprecated' => 'Use "mediawiki.api" instead.',
                'dependencies' => 'mediawiki.api',
        ],
        'mediawiki.api.options' => [
-               'scripts' => 'resources/src/mediawiki.api.options.js',
+               'deprecated' => 'Use "mediawiki.api" instead.',
                'dependencies' => 'mediawiki.api',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.api.parse' => [
-               'scripts' => 'resources/src/mediawiki.api.parse.js',
+               'deprecated' => 'Use "mediawiki.api" instead.',
                'dependencies' => 'mediawiki.api',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.api.upload' => [
-               'scripts' => 'resources/src/mediawiki.api.upload.js',
-               'dependencies' => [
-                       'mediawiki.api',
-                       'mediawiki.api.edit',
-               ],
+               'deprecated' => 'Use "mediawiki.api" instead.',
+               'dependencies' => 'mediawiki.api',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.api.user' => [
-               'scripts' => 'resources/src/mediawiki.api.user.js',
-               'dependencies' => [
-                       'mediawiki.api',
-               ],
+               'deprecated' => 'Use "mediawiki.api" instead.',
+               'dependencies' => 'mediawiki.api',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.api.watch' => [
-               'scripts' => 'resources/src/mediawiki.api.watch.js',
-               'dependencies' => [
-                       'mediawiki.api',
-               ],
+               'deprecated' => 'Use "mediawiki.api" instead.',
+               'dependencies' => 'mediawiki.api',
        ],
        'mediawiki.api.messages' => [
-               'scripts' => 'resources/src/mediawiki.api.messages.js',
-               'dependencies' => [
-                       'mediawiki.api',
-               ],
+               'deprecated' => 'Use "mediawiki.api" instead.',
+               'dependencies' => 'mediawiki.api',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.api.rollback' => [
-               'scripts' => 'resources/src/mediawiki.api.rollback.js',
-               'dependencies' => [
-                       'mediawiki.api',
-               ],
+               'deprecated' => 'Use "mediawiki.api" instead.',
+               'dependencies' => 'mediawiki.api',
        ],
        'mediawiki.content.json' => [
                'styles' => 'resources/src/mediawiki.content.json.less',
@@ -1149,7 +1147,7 @@ return [
                        'resources/src/mediawiki.messagePoster.wikitext/WikitextMessagePoster.js',
                ],
                'dependencies' => [
-                       'mediawiki.api.edit',
+                       'mediawiki.api',
                        'mediawiki.messagePoster',
                ],
                'targets' => [ 'desktop', 'mobile' ],
@@ -1230,7 +1228,7 @@ return [
        'mediawiki.Upload' => [
                'scripts' => 'resources/src/mediawiki.Upload.js',
                'dependencies' => [
-                       'mediawiki.api.upload',
+                       'mediawiki.api',
                ],
        ],
        'mediawiki.ForeignUpload' => [
@@ -1330,7 +1328,7 @@ return [
                        'mediawiki.widgets.CategoryMultiselectWidget',
                        'mediawiki.widgets.DateInputWidget',
                        'mediawiki.jqueryMsg',
-                       'mediawiki.api.messages',
+                       'mediawiki.api',
                        'moment',
                        'mediawiki.libs.jpegmeta',
                ],
@@ -1371,7 +1369,6 @@ return [
                'scripts' => 'resources/src/mediawiki.user.js',
                'dependencies' => [
                        'mediawiki.api',
-                       'mediawiki.api.user',
                        'mediawiki.storage',
                        'user.options',
                        'user.tokens',
@@ -1739,7 +1736,7 @@ return [
        'mediawiki.page.watch.ajax' => [
                'scripts' => 'resources/src/mediawiki.page.watch.ajax.js',
                'dependencies' => [
-                       'mediawiki.api.watch',
+                       'mediawiki.api',
                        'mediawiki.notify',
                        'mediawiki.util',
                        'mediawiki.Title',
@@ -1764,7 +1761,7 @@ return [
        'mediawiki.page.rollback' => [
                'scripts' => 'resources/src/mediawiki.page.rollback.js',
                'dependencies' => [
-                       'mediawiki.api.rollback',
+                       'mediawiki.api',
                        'mediawiki.notify',
                        'mediawiki.util',
                        'jquery.spinner',
@@ -1812,7 +1809,6 @@ return [
                        'mediawiki.String',
                        'oojs',
                        'mediawiki.api',
-                       'mediawiki.api.options',
                        'mediawiki.jqueryMsg',
                        'mediawiki.Uri',
                        'mediawiki.user',
@@ -2276,7 +2272,6 @@ return [
                ],
                'dependencies' => [
                        'mediawiki.api',
-                       'mediawiki.api.watch',
                        'mediawiki.notify',
                        'mediawiki.Title',
                        'mediawiki.util',
@@ -2303,7 +2298,6 @@ return [
                        'jquery.spinner',
                        'mediawiki.jqueryMsg',
                        'mediawiki.api',
-                       'mediawiki.api.parse',
                        'mediawiki.libs.jpegmeta',
                        'mediawiki.Title',
                        'mediawiki.util',
@@ -2364,7 +2358,7 @@ return [
                        'watchlist-unwatch-undo',
                ],
                'dependencies' => [
-                       'mediawiki.api.watch',
+                       'mediawiki.api',
                        'mediawiki.jqueryMsg',
                        'mediawiki.Title',
                        'mediawiki.util',
@@ -2888,9 +2882,9 @@ return [
        'oojs-ui-widgets' => [
                'class' => ResourceLoaderOOUIFileModule::class,
                'scripts' => 'resources/lib/oojs-ui/oojs-ui-widgets.js',
-               'themeStyles' => 'widgets',
                'dependencies' => [
                        'oojs-ui-core',
+                       'oojs-ui-widgets.styles',
                        'oojs-ui.styles.icons-interactions',
                        'oojs-ui.styles.icons-content',
                        'oojs-ui.styles.icons-editing-advanced',
@@ -2909,6 +2903,14 @@ return [
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
+       // You should never directly load this module. The CSS classes it defines are not a public API,
+       // they depend on the internal structure of OOUI widgets, which can change at any time. If you
+       // find that you need to load this module, you're probably doing something wrong or very hacky.
+       'oojs-ui-widgets.styles' => [
+               'class' => ResourceLoaderOOUIFileModule::class,
+               'themeStyles' => 'widgets',
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
        // Toolbar and tools module.
        'oojs-ui-toolbars' => [
                'class' => ResourceLoaderOOUIFileModule::class,
index c3d7dbf..eb42311 100644 (file)
@@ -47,7 +47,6 @@
                };
 
                // Handle different kinds of elements
-
                if ( !options.plainMode && $collapsible.is( 'table' ) ) {
                        // Tables
                        // If there is a caption, hide all rows; otherwise, only hide body rows
                                $containers = $containers.not( $defaultToggle.closest( 'tr' ) );
                        }
 
-                       if ( action === 'collapse' ) {
-                               // Hide all table rows of this table
-                               // Slide doesn't work with tables, but fade does as of jQuery 1.1.3
-                               // http://stackoverflow.com/questions/467336#920480
-                               if ( options.instantHide ) {
-                                       $containers.hide();
-                                       hookCallback();
-                               } else {
-                                       $containers.stop( true, true ).fadeOut().promise().done( hookCallback );
-                               }
-                       } else {
-                               $containers.stop( true, true ).fadeIn().promise().done( hookCallback );
-                       }
-
                } else if ( !options.plainMode && ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) ) {
                        // Lists
                        $containers = $collapsible.find( '> li' );
                                // Exclude list-item containing togglelink
                                $containers = $containers.not( $defaultToggle.parent() );
                        }
-
-                       if ( action === 'collapse' ) {
-                               if ( options.instantHide ) {
-                                       $containers.hide();
-                                       hookCallback();
-                               } else {
-                                       $containers.stop( true, true ).slideUp().promise().done( hookCallback );
-                               }
-                       } else {
-                               $containers.stop( true, true ).slideDown().promise().done( hookCallback );
-                       }
-
                } else {
                        // Everything else: <div>, <p> etc.
                        $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
 
                        // If a collapsible-content is defined, act on it
                        if ( !options.plainMode && $collapsibleContent.length ) {
-                               if ( action === 'collapse' ) {
-                                       if ( options.instantHide ) {
-                                               $collapsibleContent.hide();
-                                               hookCallback();
-                                       } else {
-                                               $collapsibleContent.slideUp().promise().done( hookCallback );
-                                       }
-                               } else {
-                                       $collapsibleContent.slideDown().promise().done( hookCallback );
-                               }
+                               $containers = $collapsibleContent;
 
                        // Otherwise assume this is a customcollapse with a remote toggle
                        // .. and there is no collapsible-content because the entire element should be toggled
                        } else {
-                               if ( action === 'collapse' ) {
-                                       if ( options.instantHide ) {
-                                               $collapsible.hide();
-                                               hookCallback();
-                                       } else {
-                                               if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-                                                       $collapsible.fadeOut().promise().done( hookCallback );
-                                               } else {
-                                                       $collapsible.slideUp().promise().done( hookCallback );
-                                               }
-                                       }
-                               } else {
-                                       if ( $collapsible.is( 'tr' ) || $collapsible.is( 'td' ) || $collapsible.is( 'th' ) ) {
-                                               $collapsible.fadeIn().promise().done( hookCallback );
-                                       } else {
-                                               $collapsible.slideDown().promise().done( hookCallback );
-                                       }
-                               }
+                               $containers = $collapsible;
                        }
                }
+
+               $containers.toggle( action === 'expand' );
+               hookCallback();
        }
 
        /**
 
                        $( this ).data( 'mw-collapsible', {
                                collapse: function () {
-                                       actionHandler.call( $toggleLink.get( 0 ), null, { instantHide: true, wasCollapsed: false } );
+                                       actionHandler.call( $toggleLink.get( 0 ), null, { wasCollapsed: false } );
                                },
                                expand: function () {
-                                       actionHandler.call( $toggleLink.get( 0 ), null, { instantHide: true, wasCollapsed: true } );
+                                       actionHandler.call( $toggleLink.get( 0 ), null, { wasCollapsed: true } );
                                },
                                toggle: function () {
                                        actionHandler.call( $toggleLink.get( 0 ), null, null );
                        if ( options.collapsed || $collapsible.hasClass( 'mw-collapsed' ) ) {
                                // One toggler can hook to multiple elements, and one element can have
                                // multiple togglers. This is the sanest way to handle that.
-                               actionHandler.call( $toggleLink.get( 0 ), null, { instantHide: true, wasCollapsed: false } );
+                               actionHandler.call( $toggleLink.get( 0 ), null, { wasCollapsed: false } );
                        }
 
                } );
index bd6b5dd..eda939d 100644 (file)
@@ -1,6 +1,6 @@
 .client-js {
        // Reserve space for table sortable controls
-       table.sortable th {
+       table.sortable > thead > tr > th:not( .unsortable ) {
                padding-right: 21px;
        }
 }
index 2b76187..dcaae3e 100644 (file)
                rWhitespace = /[ _\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]+/g,
 
                // From MediaWikiTitleCodec::splitTitleString() in PHP
-               rUnicodeBidi = /[\u200E\u200F\u202A-\u202E]/g,
+               rStripCharacters = /[\u00AD\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/g,
 
                /**
                 * Slightly modified from Flinfo. Credit goes to Lupo and Flominator.
                        namespace = defaultNamespace === undefined ? NS_MAIN : defaultNamespace;
 
                        title = title
-                               // Strip Unicode bidi override characters
-                               .replace( rUnicodeBidi, '' )
+                               // Strip soft hyphens and Unicode directional formatting characters
+                               .replace( rStripCharacters, '' )
                                // Normalise whitespace to underscores and remove duplicates
                                .replace( rWhitespace, '_' )
                                // Trim underscores
diff --git a/resources/src/mediawiki.api.category.js b/resources/src/mediawiki.api.category.js
deleted file mode 100644 (file)
index 85df90e..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * @class mw.Api.plugin.category
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Determine if a category exists.
-                *
-                * @param {mw.Title|string} title
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {boolean} return.done.isCategory Whether the category exists.
-                */
-               isCategory: function ( title ) {
-                       var apiPromise = this.get( {
-                               formatversion: 2,
-                               prop: 'categoryinfo',
-                               titles: [ String( title ) ]
-                       } );
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       return !!(
-                                               data.query && // query is missing on title=""
-                                               data.query.pages && // query.pages is missing on title="#" or title="mw:"
-                                               data.query.pages[ 0 ].categoryinfo
-                                       );
-                               } )
-                               .promise( { abort: apiPromise.abort } );
-               },
-
-               /**
-                * Get a list of categories that match a certain prefix.
-                *
-                * E.g. given "Foo", return "Food", "Foolish people", "Foosball tables"...
-                *
-                * @param {string} prefix Prefix to match.
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {string[]} return.done.categories Matched categories
-                */
-               getCategoriesByPrefix: function ( prefix ) {
-                       // Fetch with allpages to only get categories that have a corresponding description page.
-                       var apiPromise = this.get( {
-                               formatversion: 2,
-                               list: 'allpages',
-                               apprefix: prefix,
-                               apnamespace: mw.config.get( 'wgNamespaceIds' ).category
-                       } );
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       return data.query.allpages.map( function ( category ) {
-                                               return new mw.Title( category.title ).getMainText();
-                                       } );
-                               } )
-                               .promise( { abort: apiPromise.abort } );
-               },
-
-               /**
-                * Get the categories that a particular page on the wiki belongs to.
-                *
-                * @param {mw.Title|string} title
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {boolean|mw.Title[]} return.done.categories List of category titles or false
-                *  if title was not found.
-                */
-               getCategories: function ( title ) {
-                       var apiPromise = this.get( {
-                               formatversion: 2,
-                               prop: 'categories',
-                               titles: [ String( title ) ]
-                       } );
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       var page;
-
-                                       if ( !data.query || !data.query.pages ) {
-                                               return false;
-                                       }
-                                       page = data.query.pages[ 0 ];
-                                       if ( !page.categories ) {
-                                               return false;
-                                       }
-                                       return page.categories.map( function ( cat ) {
-                                               return new mw.Title( cat.title );
-                                       } );
-                               } )
-                               .promise( { abort: apiPromise.abort } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.category
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api.edit.js b/resources/src/mediawiki.api.edit.js
deleted file mode 100644 (file)
index 21c55c7..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-/**
- * @class mw.Api.plugin.edit
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-
-               /**
-                * Post to API with csrf token. If we have no token, get one and try to post.
-                * If we have a cached token try using that, and if it fails, blank out the
-                * cached token and start over.
-                *
-                * @param {Object} params API parameters
-                * @param {Object} [ajaxOptions]
-                * @return {jQuery.Promise} See #post
-                */
-               postWithEditToken: function ( params, ajaxOptions ) {
-                       return this.postWithToken( 'csrf', params, ajaxOptions );
-               },
-
-               /**
-                * API helper to grab a csrf token.
-                *
-                * @return {jQuery.Promise} Received token.
-                */
-               getEditToken: function () {
-                       return this.getToken( 'csrf' );
-               },
-
-               /**
-                * Create a new page.
-                *
-                * Example:
-                *
-                *     new mw.Api().create( 'Sandbox',
-                *         { summary: 'Load sand particles.' },
-                *         'Sand.'
-                *     );
-                *
-                * @since 1.28
-                * @param {mw.Title|string} title Page title
-                * @param {Object} params Edit API parameters
-                * @param {string} params.summary Edit summary
-                * @param {string} content
-                * @return {jQuery.Promise} API response
-                */
-               create: function ( title, params, content ) {
-                       return this.postWithEditToken( $.extend( {
-                               action: 'edit',
-                               title: String( title ),
-                               text: content,
-                               formatversion: '2',
-
-                               // Protect against errors and conflicts
-                               assert: mw.user.isAnon() ? undefined : 'user',
-                               createonly: true
-                       }, params ) ).then( function ( data ) {
-                               return data.edit;
-                       } );
-               },
-
-               /**
-                * Edit an existing page.
-                *
-                * To create a new page, use #create() instead.
-                *
-                * Simple transformation:
-                *
-                *     new mw.Api()
-                *         .edit( 'Sandbox', function ( revision ) {
-                *             return revision.content.replace( 'foo', 'bar' );
-                *         } )
-                *         .then( function () {
-                *             console.log( 'Saved! ');
-                *         } );
-                *
-                * Set save parameters by returning an object instead of a string:
-                *
-                *     new mw.Api().edit(
-                *         'Sandbox',
-                *         function ( revision ) {
-                *             return {
-                *                 text: revision.content.replace( 'foo', 'bar' ),
-                *                 summary: 'Replace "foo" with "bar".',
-                *                 assert: 'bot',
-                *                 minor: true
-                *             };
-                *         }
-                *     )
-                *     .then( function () {
-                *         console.log( 'Saved! ');
-                *     } );
-                *
-                * Transform asynchronously by returning a promise.
-                *
-                *     new mw.Api()
-                *         .edit( 'Sandbox', function ( revision ) {
-                *             return Spelling
-                *                 .corrections( revision.content )
-                *                 .then( function ( report ) {
-                *                     return {
-                *                         text: report.output,
-                *                         summary: report.changelog
-                *                     };
-                *                 } );
-                *         } )
-                *         .then( function () {
-                *             console.log( 'Saved! ');
-                *         } );
-                *
-                * @since 1.28
-                * @param {mw.Title|string} title Page title
-                * @param {Function} transform Callback that prepares the edit
-                * @param {Object} transform.revision Current revision
-                * @param {string} transform.revision.content Current revision content
-                * @param {string|Object|jQuery.Promise} transform.return New content, object with edit
-                *  API parameters, or promise providing one of those.
-                * @return {jQuery.Promise} Edit API response
-                */
-               edit: function ( title, transform ) {
-                       var basetimestamp, curtimestamp,
-                               api = this;
-
-                       title = String( title );
-
-                       return api.get( {
-                               action: 'query',
-                               prop: 'revisions',
-                               rvprop: [ 'content', 'timestamp' ],
-                               titles: [ title ],
-                               formatversion: '2',
-                               curtimestamp: true
-                       } )
-                               .then( function ( data ) {
-                                       var page, revision;
-                                       if ( !data.query || !data.query.pages ) {
-                                               return $.Deferred().reject( 'unknown' );
-                                       }
-                                       page = data.query.pages[ 0 ];
-                                       if ( !page || page.invalid ) {
-                                               return $.Deferred().reject( 'invalidtitle' );
-                                       }
-                                       if ( page.missing ) {
-                                               return $.Deferred().reject( 'nocreate-missing' );
-                                       }
-                                       revision = page.revisions[ 0 ];
-                                       basetimestamp = revision.timestamp;
-                                       curtimestamp = data.curtimestamp;
-                                       return transform( {
-                                               timestamp: revision.timestamp,
-                                               content: revision.content
-                                       } );
-                               } )
-                               .then( function ( params ) {
-                                       var editParams = typeof params === 'object' ? params : { text: String( params ) };
-                                       return api.postWithEditToken( $.extend( {
-                                               action: 'edit',
-                                               title: title,
-                                               formatversion: '2',
-
-                                               // Protect against errors and conflicts
-                                               assert: mw.user.isAnon() ? undefined : 'user',
-                                               basetimestamp: basetimestamp,
-                                               starttimestamp: curtimestamp,
-                                               nocreate: true
-                                       }, editParams ) );
-                               } )
-                               .then( function ( data ) {
-                                       return data.edit;
-                               } );
-               },
-
-               /**
-                * Post a new section to the page.
-                *
-                * @see #postWithEditToken
-                * @param {mw.Title|string} title Target page
-                * @param {string} header
-                * @param {string} message wikitext message
-                * @param {Object} [additionalParams] Additional API parameters, e.g. `{ redirect: true }`
-                * @return {jQuery.Promise}
-                */
-               newSection: function ( title, header, message, additionalParams ) {
-                       return this.postWithEditToken( $.extend( {
-                               action: 'edit',
-                               section: 'new',
-                               title: String( title ),
-                               summary: header,
-                               text: message
-                       }, additionalParams ) );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.edit
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api.js b/resources/src/mediawiki.api.js
deleted file mode 100644 (file)
index 0038ed8..0000000
+++ /dev/null
@@ -1,506 +0,0 @@
-( function ( mw, $ ) {
-
-       /**
-        * @class mw.Api
-        */
-
-       /**
-        * @property {Object} defaultOptions Default options for #ajax calls. Can be overridden by passing
-        *     `options` to mw.Api constructor.
-        * @property {Object} defaultOptions.parameters Default query parameters for API requests.
-        * @property {Object} defaultOptions.ajax Default options for jQuery#ajax.
-        * @property {boolean} defaultOptions.useUS Whether to use U+001F when joining multi-valued
-        *     parameters (since 1.28). Default is true if ajax.url is not set, false otherwise for
-        *     compatibility.
-        * @private
-        */
-       var defaultOptions = {
-                       parameters: {
-                               action: 'query',
-                               format: 'json'
-                       },
-                       ajax: {
-                               url: mw.util.wikiScript( 'api' ),
-                               timeout: 30 * 1000, // 30 seconds
-                               dataType: 'json'
-                       }
-               },
-
-               // Keyed by ajax url and symbolic name for the individual request
-               promises = {};
-
-       function mapLegacyToken( action ) {
-               // Legacy types for backward-compatibility with API action=tokens.
-               var csrfActions = [
-                       'edit',
-                       'delete',
-                       'protect',
-                       'move',
-                       'block',
-                       'unblock',
-                       'email',
-                       'import',
-                       'options'
-               ];
-               if ( csrfActions.indexOf( action ) !== -1 ) {
-                       mw.track( 'mw.deprecate', 'apitoken_' + action );
-                       mw.log.warn( 'Use of the "' + action + '" token is deprecated. Use "csrf" instead.' );
-                       return 'csrf';
-               }
-               return action;
-       }
-
-       // Pre-populate with fake ajax promises to save http requests for tokens
-       // we already have on the page via the user.tokens module (T36733).
-       promises[ defaultOptions.ajax.url ] = {};
-       $.each( mw.user.tokens.get(), function ( key, value ) {
-               // This requires #getToken to use the same key as user.tokens.
-               // Format: token-type + "Token" (eg. csrfToken, patrolToken, watchToken).
-               promises[ defaultOptions.ajax.url ][ key ] = $.Deferred()
-                       .resolve( value )
-                       .promise( { abort: function () {} } );
-       } );
-
-       /**
-        * Constructor to create an object to interact with the API of a particular MediaWiki server.
-        * mw.Api objects represent the API of a particular MediaWiki server.
-        *
-        *     var api = new mw.Api();
-        *     api.get( {
-        *         action: 'query',
-        *         meta: 'userinfo'
-        *     } ).done( function ( data ) {
-        *         console.log( data );
-        *     } );
-        *
-        * Since MW 1.25, multiple values for a parameter can be specified using an array:
-        *
-        *     var api = new mw.Api();
-        *     api.get( {
-        *         action: 'query',
-        *         meta: [ 'userinfo', 'siteinfo' ] // same effect as 'userinfo|siteinfo'
-        *     } ).done( function ( data ) {
-        *         console.log( data );
-        *     } );
-        *
-        * Since MW 1.26, boolean values for a parameter can be specified directly. If the value is
-        * `false` or `undefined`, the parameter will be omitted from the request, as required by the API.
-        *
-        * @constructor
-        * @param {Object} [options] See #defaultOptions documentation above. Can also be overridden for
-        *  each individual request by passing them to #get or #post (or directly #ajax) later on.
-        */
-       mw.Api = function ( options ) {
-               options = options || {};
-
-               // Force a string if we got a mw.Uri object
-               if ( options.ajax && options.ajax.url !== undefined ) {
-                       options.ajax.url = String( options.ajax.url );
-               }
-
-               options = $.extend( { useUS: !options.ajax || !options.ajax.url }, options );
-
-               options.parameters = $.extend( {}, defaultOptions.parameters, options.parameters );
-               options.ajax = $.extend( {}, defaultOptions.ajax, options.ajax );
-
-               this.defaults = options;
-               this.requests = [];
-       };
-
-       mw.Api.prototype = {
-               /**
-                * Abort all unfinished requests issued by this Api object.
-                *
-                * @method
-                */
-               abort: function () {
-                       this.requests.forEach( function ( request ) {
-                               if ( request ) {
-                                       request.abort();
-                               }
-                       } );
-               },
-
-               /**
-                * Perform API get request
-                *
-                * @param {Object} parameters
-                * @param {Object} [ajaxOptions]
-                * @return {jQuery.Promise}
-                */
-               get: function ( parameters, ajaxOptions ) {
-                       ajaxOptions = ajaxOptions || {};
-                       ajaxOptions.type = 'GET';
-                       return this.ajax( parameters, ajaxOptions );
-               },
-
-               /**
-                * Perform API post request
-                *
-                * @param {Object} parameters
-                * @param {Object} [ajaxOptions]
-                * @return {jQuery.Promise}
-                */
-               post: function ( parameters, ajaxOptions ) {
-                       ajaxOptions = ajaxOptions || {};
-                       ajaxOptions.type = 'POST';
-                       return this.ajax( parameters, ajaxOptions );
-               },
-
-               /**
-                * Massage parameters from the nice format we accept into a format suitable for the API.
-                *
-                * NOTE: A value of undefined/null in an array will be represented by Array#join()
-                * as the empty string. Should we filter silently? Warn? Leave as-is?
-                *
-                * @private
-                * @param {Object} parameters (modified in-place)
-                * @param {boolean} useUS Whether to use U+001F when joining multi-valued parameters.
-                */
-               preprocessParameters: function ( parameters, useUS ) {
-                       var key;
-                       // Handle common MediaWiki API idioms for passing parameters
-                       for ( key in parameters ) {
-                               // Multiple values are pipe-separated
-                               if ( Array.isArray( parameters[ key ] ) ) {
-                                       if ( !useUS || parameters[ key ].join( '' ).indexOf( '|' ) === -1 ) {
-                                               parameters[ key ] = parameters[ key ].join( '|' );
-                                       } else {
-                                               parameters[ key ] = '\x1f' + parameters[ key ].join( '\x1f' );
-                                       }
-                               } else if ( parameters[ key ] === false || parameters[ key ] === undefined ) {
-                                       // Boolean values are only false when not given at all
-                                       delete parameters[ key ];
-                               }
-                       }
-               },
-
-               /**
-                * Perform the API call.
-                *
-                * @param {Object} parameters
-                * @param {Object} [ajaxOptions]
-                * @return {jQuery.Promise} Done: API response data and the jqXHR object.
-                *  Fail: Error code
-                */
-               ajax: function ( parameters, ajaxOptions ) {
-                       var token, requestIndex,
-                               api = this,
-                               apiDeferred = $.Deferred(),
-                               xhr, key, formData;
-
-                       parameters = $.extend( {}, this.defaults.parameters, parameters );
-                       ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
-
-                       // Ensure that token parameter is last (per [[mw:API:Edit#Token]]).
-                       if ( parameters.token ) {
-                               token = parameters.token;
-                               delete parameters.token;
-                       }
-
-                       this.preprocessParameters( parameters, this.defaults.useUS );
-
-                       // If multipart/form-data has been requested and emulation is possible, emulate it
-                       if (
-                               ajaxOptions.type === 'POST' &&
-                               window.FormData &&
-                               ajaxOptions.contentType === 'multipart/form-data'
-                       ) {
-
-                               formData = new FormData();
-
-                               for ( key in parameters ) {
-                                       formData.append( key, parameters[ key ] );
-                               }
-                               // If we extracted a token parameter, add it back in.
-                               if ( token ) {
-                                       formData.append( 'token', token );
-                               }
-
-                               ajaxOptions.data = formData;
-
-                               // Prevent jQuery from mangling our FormData object
-                               ajaxOptions.processData = false;
-                               // Prevent jQuery from overriding the Content-Type header
-                               ajaxOptions.contentType = false;
-                       } else {
-                               // This works because jQuery accepts data as a query string or as an Object
-                               ajaxOptions.data = $.param( parameters );
-                               // If we extracted a token parameter, add it back in.
-                               if ( token ) {
-                                       ajaxOptions.data += '&token=' + encodeURIComponent( token );
-                               }
-
-                               // Depending on server configuration, MediaWiki may forbid periods in URLs, due to an IE 6
-                               // XSS bug. So let's escape them here. See WebRequest::checkUrlExtension() and T30235.
-                               ajaxOptions.data = ajaxOptions.data.replace( /\./g, '%2E' );
-
-                               if ( ajaxOptions.contentType === 'multipart/form-data' ) {
-                                       // We were asked to emulate but can't, so drop the Content-Type header, otherwise
-                                       // it'll be wrong and the server will fail to decode the POST body
-                                       delete ajaxOptions.contentType;
-                               }
-                       }
-
-                       // Make the AJAX request
-                       xhr = $.ajax( ajaxOptions )
-                               // If AJAX fails, reject API call with error code 'http'
-                               // and details in second argument.
-                               .fail( function ( xhr, textStatus, exception ) {
-                                       apiDeferred.reject( 'http', {
-                                               xhr: xhr,
-                                               textStatus: textStatus,
-                                               exception: exception
-                                       } );
-                               } )
-                               // AJAX success just means "200 OK" response, also check API error codes
-                               .done( function ( result, textStatus, jqXHR ) {
-                                       var code;
-                                       if ( result === undefined || result === null || result === '' ) {
-                                               apiDeferred.reject( 'ok-but-empty',
-                                                       'OK response but empty result (check HTTP headers?)',
-                                                       result,
-                                                       jqXHR
-                                               );
-                                       } else if ( result.error ) {
-                                               // errorformat=bc
-                                               code = result.error.code === undefined ? 'unknown' : result.error.code;
-                                               apiDeferred.reject( code, result, result, jqXHR );
-                                       } else if ( result.errors ) {
-                                               // errorformat!=bc
-                                               code = result.errors[ 0 ].code === undefined ? 'unknown' : result.errors[ 0 ].code;
-                                               apiDeferred.reject( code, result, result, jqXHR );
-                                       } else {
-                                               apiDeferred.resolve( result, jqXHR );
-                                       }
-                               } );
-
-                       requestIndex = this.requests.length;
-                       this.requests.push( xhr );
-                       xhr.always( function () {
-                               api.requests[ requestIndex ] = null;
-                       } );
-                       // Return the Promise
-                       return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
-                               if ( !( code === 'http' && details && details.textStatus === 'abort' ) ) {
-                                       mw.log( 'mw.Api error: ', code, details );
-                               }
-                       } );
-               },
-
-               /**
-                * Post to API with specified type of token. If we have no token, get one and try to post.
-                * If we have a cached token try using that, and if it fails, blank out the
-                * cached token and start over. For example to change an user option you could do:
-                *
-                *     new mw.Api().postWithToken( 'csrf', {
-                *         action: 'options',
-                *         optionname: 'gender',
-                *         optionvalue: 'female'
-                *     } );
-                *
-                * @param {string} tokenType The name of the token, like options or edit.
-                * @param {Object} params API parameters
-                * @param {Object} [ajaxOptions]
-                * @return {jQuery.Promise} See #post
-                * @since 1.22
-                */
-               postWithToken: function ( tokenType, params, ajaxOptions ) {
-                       var api = this,
-                               abortedPromise = $.Deferred().reject( 'http',
-                                       { textStatus: 'abort', exception: 'abort' } ).promise(),
-                               abortable,
-                               aborted;
-
-                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
-                               params.token = token;
-                               // Request was aborted while token request was running, but we
-                               // don't want to unnecessarily abort token requests, so abort
-                               // a fake request instead
-                               if ( aborted ) {
-                                       return abortedPromise;
-                               }
-
-                               return ( abortable = api.post( params, ajaxOptions ) ).catch(
-                                       // Error handler
-                                       function ( code ) {
-                                               if ( code === 'badtoken' ) {
-                                                       api.badToken( tokenType );
-                                                       // Try again, once
-                                                       params.token = undefined;
-                                                       abortable = null;
-                                                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
-                                                               params.token = token;
-                                                               if ( aborted ) {
-                                                                       return abortedPromise;
-                                                               }
-
-                                                               return ( abortable = api.post( params, ajaxOptions ) );
-                                                       } );
-                                               }
-
-                                               // Let caller handle the error code
-                                               return $.Deferred().rejectWith( this, arguments );
-                                       }
-                               );
-                       } ).promise( { abort: function () {
-                               if ( abortable ) {
-                                       abortable.abort();
-                               } else {
-                                       aborted = true;
-                               }
-                       } } );
-               },
-
-               /**
-                * Get a token for a certain action from the API.
-                *
-                * The assert parameter is only for internal use by #postWithToken.
-                *
-                * @since 1.22
-                * @param {string} type Token type
-                * @param {string} [assert]
-                * @return {jQuery.Promise} Received token.
-                */
-               getToken: function ( type, assert ) {
-                       var apiPromise, promiseGroup, d, reject;
-                       type = mapLegacyToken( type );
-                       promiseGroup = promises[ this.defaults.ajax.url ];
-                       d = promiseGroup && promiseGroup[ type + 'Token' ];
-
-                       if ( !promiseGroup ) {
-                               promiseGroup = promises[ this.defaults.ajax.url ] = {};
-                       }
-
-                       if ( !d ) {
-                               apiPromise = this.get( {
-                                       action: 'query',
-                                       meta: 'tokens',
-                                       type: type,
-                                       assert: assert
-                               } );
-                               reject = function () {
-                                       // Clear promise. Do not cache errors.
-                                       delete promiseGroup[ type + 'Token' ];
-
-                                       // Let caller handle the error code
-                                       return $.Deferred().rejectWith( this, arguments );
-                               };
-                               d = apiPromise
-                                       .then( function ( res ) {
-                                               if ( !res.query ) {
-                                                       return reject( 'query-missing', res );
-                                               }
-                                               // If token type is unknown, it is omitted from the response
-                                               if ( !res.query.tokens[ type + 'token' ] ) {
-                                                       return $.Deferred().reject( 'token-missing', res );
-                                               }
-                                               return res.query.tokens[ type + 'token' ];
-                                       }, reject )
-                                       // Attach abort handler
-                                       .promise( { abort: apiPromise.abort } );
-
-                               // Store deferred now so that we can use it again even if it isn't ready yet
-                               promiseGroup[ type + 'Token' ] = d;
-                       }
-
-                       return d;
-               },
-
-               /**
-                * Indicate that the cached token for a certain action of the API is bad.
-                *
-                * Call this if you get a 'badtoken' error when using the token returned by #getToken.
-                * You may also want to use #postWithToken instead, which invalidates bad cached tokens
-                * automatically.
-                *
-                * @param {string} type Token type
-                * @since 1.26
-                */
-               badToken: function ( type ) {
-                       var promiseGroup = promises[ this.defaults.ajax.url ];
-
-                       type = mapLegacyToken( type );
-                       if ( promiseGroup ) {
-                               delete promiseGroup[ type + 'Token' ];
-                       }
-               }
-       };
-
-       /**
-        * @static
-        * @property {Array}
-        * Very incomplete and outdated list of errors we might receive from the API. Do not use.
-        * @deprecated since 1.29
-        */
-       mw.Api.errors = [
-               // occurs when POST aborted
-               // jQuery 1.4 can't distinguish abort or lost connection from 200 OK + empty result
-               'ok-but-empty',
-
-               // timeout
-               'timeout',
-
-               // really a warning, but we treat it like an error
-               'duplicate',
-               'duplicate-archive',
-
-               // upload succeeded, but no image info.
-               // this is probably impossible, but might as well check for it
-               'noimageinfo',
-               // remote errors, defined in API
-               'uploaddisabled',
-               'nomodule',
-               'mustbeposted',
-               'badaccess-groups',
-               'missingresult',
-               'missingparam',
-               'invalid-file-key',
-               'copyuploaddisabled',
-               'mustbeloggedin',
-               'empty-file',
-               'file-too-large',
-               'filetype-missing',
-               'filetype-banned',
-               'filetype-banned-type',
-               'filename-tooshort',
-               'illegal-filename',
-               'verification-error',
-               'hookaborted',
-               'unknown-error',
-               'internal-error',
-               'overwrite',
-               'badtoken',
-               'fetchfileerror',
-               'fileexists-shared-forbidden',
-               'invalidtitle',
-               'notloggedin',
-               'autoblocked',
-               'blocked',
-
-               // Stash-specific errors - expanded
-               'stashfailed',
-               'stasherror',
-               'stashedfilenotfound',
-               'stashpathinvalid',
-               'stashfilestorage',
-               'stashzerolength',
-               'stashnotloggedin',
-               'stashwrongowner',
-               'stashnosuchfilekey'
-       ];
-       mw.log.deprecate( mw.Api, 'errors', mw.Api.errors, null, 'mw.Api.errors' );
-
-       /**
-        * @static
-        * @property {Array}
-        * Very incomplete and outdated list of warnings we might receive from the API. Do not use.
-        * @deprecated since 1.29
-        */
-       mw.Api.warnings = [
-               'duplicate',
-               'exists'
-       ];
-       mw.log.deprecate( mw.Api, 'warnings', mw.Api.warnings, null, 'mw.Api.warnings' );
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api.login.js b/resources/src/mediawiki.api.login.js
deleted file mode 100644 (file)
index 2b709aa..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Make the two-step login easier.
- *
- * @author Niklas Laxström
- * @class mw.Api.plugin.login
- * @since 1.22
- */
-( function ( mw, $ ) {
-       'use strict';
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * @param {string} username
-                * @param {string} password
-                * @return {jQuery.Promise} See mw.Api#post
-                */
-               login: function ( username, password ) {
-                       var params, apiPromise, innerPromise,
-                               api = this;
-
-                       params = {
-                               action: 'login',
-                               lgname: username,
-                               lgpassword: password
-                       };
-
-                       apiPromise = api.post( params );
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       params.lgtoken = data.login.token;
-                                       innerPromise = api.post( params )
-                                               .then( function ( data ) {
-                                                       var code;
-                                                       if ( data.login.result !== 'Success' ) {
-                                                               // Set proper error code whenever possible
-                                                               code = data.error && data.error.code || 'unknown';
-                                                               return $.Deferred().reject( code, data );
-                                                       }
-                                                       return data;
-                                               } );
-                                       return innerPromise;
-                               } )
-                               .promise( {
-                                       abort: function () {
-                                               apiPromise.abort();
-                                               if ( innerPromise ) {
-                                                       innerPromise.abort();
-                                               }
-                                       }
-                               } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.login
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api.messages.js b/resources/src/mediawiki.api.messages.js
deleted file mode 100644 (file)
index 688f0b2..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * Allows to retrieve a specific or a set of
- * messages to be added to mw.messages and returned
- * by the Api.
- *
- * @class mw.Api.plugin.messages
- * @since 1.27
- */
-( function ( mw, $ ) {
-       'use strict';
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Get a set of messages.
-                *
-                * @param {Array} messages Messages to retrieve
-                * @param {Object} [options] Additional parameters for the API call
-                * @return {jQuery.Promise}
-                */
-               getMessages: function ( messages, options ) {
-                       options = options || {};
-                       return this.get( $.extend( {
-                               action: 'query',
-                               meta: 'allmessages',
-                               ammessages: messages,
-                               amlang: mw.config.get( 'wgUserLanguage' ),
-                               formatversion: 2
-                       }, options ) ).then( function ( data ) {
-                               var result = {};
-
-                               data.query.allmessages.forEach( function ( obj ) {
-                                       if ( !obj.missing ) {
-                                               result[ obj.name ] = obj.content;
-                                       }
-                               } );
-
-                               return result;
-                       } );
-               },
-
-               /**
-                * Loads a set of messages and add them to mw.messages.
-                *
-                * @param {Array} messages Messages to retrieve
-                * @param {Object} [options] Additional parameters for the API call
-                * @return {jQuery.Promise}
-                */
-               loadMessages: function ( messages, options ) {
-                       return this.getMessages( messages, options ).then( $.proxy( mw.messages, 'set' ) );
-               },
-
-               /**
-                * Loads a set of messages and add them to mw.messages. Only messages that are not already known
-                * are loaded. If all messages are known, the returned promise is resolved immediately.
-                *
-                * @param {Array} messages Messages to retrieve
-                * @param {Object} [options] Additional parameters for the API call
-                * @return {jQuery.Promise}
-                */
-               loadMessagesIfMissing: function ( messages, options ) {
-                       var missing = messages.filter( function ( msg ) {
-                               return !mw.message( msg ).exists();
-                       } );
-
-                       if ( missing.length === 0 ) {
-                               return $.Deferred().resolve();
-                       }
-
-                       return this.getMessages( missing, options ).then( $.proxy( mw.messages, 'set' ) );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.messages
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api.options.js b/resources/src/mediawiki.api.options.js
deleted file mode 100644 (file)
index 4930c4f..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * @class mw.Api.plugin.options
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-
-               /**
-                * Asynchronously save the value of a single user option using the API. See #saveOptions.
-                *
-                * @param {string} name
-                * @param {string|null} value
-                * @return {jQuery.Promise}
-                */
-               saveOption: function ( name, value ) {
-                       var param = {};
-                       param[ name ] = value;
-                       return this.saveOptions( param );
-               },
-
-               /**
-                * Asynchronously save the values of user options using the API.
-                *
-                * If a value of `null` is provided, the given option will be reset to the default value.
-                *
-                * Any warnings returned by the API, including warnings about invalid option names or values,
-                * are ignored. However, do not rely on this behavior.
-                *
-                * If necessary, the options will be saved using several sequential API requests. Only one promise
-                * is always returned that will be resolved when all requests complete.
-                *
-                * @param {Object} options Options as a `{ name: value, … }` object
-                * @return {jQuery.Promise}
-                */
-               saveOptions: function ( options ) {
-                       var name, value, bundleable,
-                               grouped = [],
-                               promise = $.Deferred().resolve();
-
-                       for ( name in options ) {
-                               value = options[ name ] === null ? null : String( options[ name ] );
-
-                               // Can we bundle this option, or does it need a separate request?
-                               if ( this.defaults.useUS ) {
-                                       bundleable = name.indexOf( '=' ) === -1;
-                               } else {
-                                       bundleable =
-                                               ( value === null || value.indexOf( '|' ) === -1 ) &&
-                                               ( name.indexOf( '|' ) === -1 && name.indexOf( '=' ) === -1 );
-                               }
-
-                               if ( bundleable ) {
-                                       if ( value !== null ) {
-                                               grouped.push( name + '=' + value );
-                                       } else {
-                                               // Omitting value resets the option
-                                               grouped.push( name );
-                                       }
-                               } else {
-                                       if ( value !== null ) {
-                                               promise = promise.then( function ( name, value ) {
-                                                       return this.postWithToken( 'csrf', {
-                                                               formatversion: 2,
-                                                               action: 'options',
-                                                               optionname: name,
-                                                               optionvalue: value
-                                                       } );
-                                               }.bind( this, name, value ) );
-                                       } else {
-                                               // Omitting value resets the option
-                                               promise = promise.then( function ( name ) {
-                                                       return this.postWithToken( 'csrf', {
-                                                               formatversion: 2,
-                                                               action: 'options',
-                                                               optionname: name
-                                                       } );
-                                               }.bind( this, name ) );
-                                       }
-                               }
-                       }
-
-                       if ( grouped.length ) {
-                               promise = promise.then( function () {
-                                       return this.postWithToken( 'csrf', {
-                                               formatversion: 2,
-                                               action: 'options',
-                                               change: grouped
-                                       } );
-                               }.bind( this ) );
-                       }
-
-                       return promise;
-               }
-
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.options
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api.parse.js b/resources/src/mediawiki.api.parse.js
deleted file mode 100644 (file)
index f38e88b..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * @class mw.Api.plugin.parse
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Convenience method for 'action=parse'.
-                *
-                * @param {string|mw.Title} content Content to parse, either as a wikitext string or
-                *   a mw.Title.
-                * @param {Object} additionalParams Parameters object to set custom settings, e.g.
-                *   redirects, sectionpreview.  prop should not be overridden.
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {string} return.done.data Parsed HTML of `wikitext`.
-                */
-               parse: function ( content, additionalParams ) {
-                       var apiPromise,
-                               config = $.extend( {
-                                       formatversion: 2,
-                                       action: 'parse',
-                                       contentmodel: 'wikitext'
-                               }, additionalParams );
-
-                       if ( mw.Title && content instanceof mw.Title ) {
-                               // Parse existing page
-                               config.page = content.getPrefixedDb();
-                       } else {
-                               // Parse wikitext from input
-                               config.text = String( content );
-                       }
-
-                       apiPromise = this.get( config );
-
-                       return apiPromise
-                               .then( function ( data ) {
-                                       return data.parse.text;
-                               } )
-                               .promise( { abort: apiPromise.abort } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.parse
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api.rollback.js b/resources/src/mediawiki.api.rollback.js
deleted file mode 100644 (file)
index 322143d..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * @class mw.Api.plugin.rollback
- * @since 1.28
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Convenience method for `action=rollback`.
-                *
-                * @param {string|mw.Title} page
-                * @param {string} user
-                * @param {Object} [params] Additional parameters
-                * @return {jQuery.Promise}
-                */
-               rollback: function ( page, user, params ) {
-                       return this.postWithToken( 'rollback', $.extend( {
-                               action: 'rollback',
-                               title: String( page ),
-                               user: user,
-                               uselang: mw.config.get( 'wgUserLanguage' )
-                       }, params ) ).then( function ( data ) {
-                               return data.rollback;
-                       } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.rollback
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api.upload.js b/resources/src/mediawiki.api.upload.js
deleted file mode 100644 (file)
index 29bd59a..0000000
+++ /dev/null
@@ -1,668 +0,0 @@
-/**
- * Provides an interface for uploading files to MediaWiki.
- *
- * @class mw.Api.plugin.upload
- * @singleton
- */
-( function ( mw, $ ) {
-       var nonce = 0,
-               fieldsAllowed = {
-                       stash: true,
-                       filekey: true,
-                       filename: true,
-                       comment: true,
-                       text: true,
-                       watchlist: true,
-                       ignorewarnings: true,
-                       chunk: true,
-                       offset: true,
-                       filesize: true,
-                       async: true
-               };
-
-       /**
-        * Get nonce for iframe IDs on the page.
-        *
-        * @private
-        * @return {number}
-        */
-       function getNonce() {
-               return nonce++;
-       }
-
-       /**
-        * Given a non-empty object, return one of its keys.
-        *
-        * @private
-        * @param {Object} obj
-        * @return {string}
-        */
-       function getFirstKey( obj ) {
-               var key;
-               for ( key in obj ) {
-                       if ( obj.hasOwnProperty( key ) ) {
-                               return key;
-                       }
-               }
-       }
-
-       /**
-        * Get new iframe object for an upload.
-        *
-        * @private
-        * @param {string} id
-        * @return {HTMLIframeElement}
-        */
-       function getNewIframe( id ) {
-               var frame = document.createElement( 'iframe' );
-               frame.id = id;
-               frame.name = id;
-               return frame;
-       }
-
-       /**
-        * Shortcut for getting hidden inputs
-        *
-        * @private
-        * @param {string} name
-        * @param {string} val
-        * @return {jQuery}
-        */
-       function getHiddenInput( name, val ) {
-               return $( '<input>' ).attr( 'type', 'hidden' )
-                       .attr( 'name', name )
-                       .val( val );
-       }
-
-       /**
-        * Process the result of the form submission, returned to an iframe.
-        * This is the iframe's onload event.
-        *
-        * @param {HTMLIframeElement} iframe Iframe to extract result from
-        * @return {Object} Response from the server. The return value may or may
-        *   not be an XMLDocument, this code was copied from elsewhere, so if you
-        *   see an unexpected return type, please file a bug.
-        */
-       function processIframeResult( iframe ) {
-               var json,
-                       doc = iframe.contentDocument || frames[ iframe.id ].document;
-
-               if ( doc.XMLDocument ) {
-                       // The response is a document property in IE
-                       return doc.XMLDocument;
-               }
-
-               if ( doc.body ) {
-                       // Get the json string
-                       // We're actually searching through an HTML doc here --
-                       // according to mdale we need to do this
-                       // because IE does not load JSON properly in an iframe
-                       json = $( doc.body ).find( 'pre' ).text();
-
-                       return JSON.parse( json );
-               }
-
-               // Response is a xml document
-               return doc;
-       }
-
-       function formDataAvailable() {
-               return window.FormData !== undefined &&
-                       window.File !== undefined &&
-                       window.File.prototype.slice !== undefined;
-       }
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Upload a file to MediaWiki.
-                *
-                * The file will be uploaded using AJAX and FormData, if the browser supports it, or via an
-                * iframe if it doesn't.
-                *
-                * Caveats of iframe upload:
-                * - The returned jQuery.Promise will not receive `progress` notifications during the upload
-                * - It is incompatible with uploads to a foreign wiki using mw.ForeignApi
-                * - You must pass a HTMLInputElement and not a File for it to be possible
-                *
-                * @param {HTMLInputElement|File|Blob} file HTML input type=file element with a file already inside
-                *  of it, or a File object.
-                * @param {Object} data Other upload options, see action=upload API docs for more
-                * @return {jQuery.Promise}
-                */
-               upload: function ( file, data ) {
-                       var isFileInput, canUseFormData;
-
-                       isFileInput = file && file.nodeType === Node.ELEMENT_NODE;
-
-                       if ( formDataAvailable() && isFileInput && file.files ) {
-                               file = file.files[ 0 ];
-                       }
-
-                       if ( !file ) {
-                               throw new Error( 'No file' );
-                       }
-
-                       // Blobs are allowed in formdata uploads, it turns out
-                       canUseFormData = formDataAvailable() && ( file instanceof window.File || file instanceof window.Blob );
-
-                       if ( !isFileInput && !canUseFormData ) {
-                               throw new Error( 'Unsupported argument type passed to mw.Api.upload' );
-                       }
-
-                       if ( canUseFormData ) {
-                               return this.uploadWithFormData( file, data );
-                       }
-
-                       return this.uploadWithIframe( file, data );
-               },
-
-               /**
-                * Upload a file to MediaWiki with an iframe and a form.
-                *
-                * This method is necessary for browsers without the File/FormData
-                * APIs, and continues to work in browsers with those APIs.
-                *
-                * The rough sketch of how this method works is as follows:
-                * 1. An iframe is loaded with no content.
-                * 2. A form is submitted with the passed-in file input and some extras.
-                * 3. The MediaWiki API receives that form data, and sends back a response.
-                * 4. The response is sent to the iframe, because we set target=(iframe id)
-                * 5. The response is parsed out of the iframe's document, and passed back
-                *    through the promise.
-                *
-                * @private
-                * @param {HTMLInputElement} file The file input with a file in it.
-                * @param {Object} data Other upload options, see action=upload API docs for more
-                * @return {jQuery.Promise}
-                */
-               uploadWithIframe: function ( file, data ) {
-                       var key,
-                               tokenPromise = $.Deferred(),
-                               api = this,
-                               deferred = $.Deferred(),
-                               nonce = getNonce(),
-                               id = 'uploadframe-' + nonce,
-                               $form = $( '<form>' ),
-                               iframe = getNewIframe( id ),
-                               $iframe = $( iframe );
-
-                       for ( key in data ) {
-                               if ( !fieldsAllowed[ key ] ) {
-                                       delete data[ key ];
-                               }
-                       }
-
-                       data = $.extend( {}, this.defaults.parameters, { action: 'upload' }, data );
-                       $form.addClass( 'mw-api-upload-form' );
-
-                       $form.css( 'display', 'none' )
-                               .attr( {
-                                       action: this.defaults.ajax.url,
-                                       method: 'POST',
-                                       target: id,
-                                       enctype: 'multipart/form-data'
-                               } );
-
-                       $iframe.one( 'load', function () {
-                               $iframe.one( 'load', function () {
-                                       var result = processIframeResult( iframe );
-                                       deferred.notify( 1 );
-
-                                       if ( !result ) {
-                                               deferred.reject( 'ok-but-empty', 'No response from API on upload attempt.' );
-                                       } else if ( result.error ) {
-                                               if ( result.error.code === 'badtoken' ) {
-                                                       api.badToken( 'csrf' );
-                                               }
-
-                                               deferred.reject( result.error.code, result );
-                                       } else if ( result.upload && result.upload.warnings ) {
-                                               deferred.reject( getFirstKey( result.upload.warnings ), result );
-                                       } else {
-                                               deferred.resolve( result );
-                                       }
-                               } );
-                               tokenPromise.done( function () {
-                                       $form.submit();
-                               } );
-                       } );
-
-                       $iframe.on( 'error', function ( error ) {
-                               deferred.reject( 'http', error );
-                       } );
-
-                       $iframe.prop( 'src', 'about:blank' ).hide();
-
-                       file.name = 'file';
-
-                       $.each( data, function ( key, val ) {
-                               $form.append( getHiddenInput( key, val ) );
-                       } );
-
-                       if ( !data.filename && !data.stash ) {
-                               throw new Error( 'Filename not included in file data.' );
-                       }
-
-                       if ( this.needToken() ) {
-                               this.getEditToken().then( function ( token ) {
-                                       $form.append( getHiddenInput( 'token', token ) );
-                                       tokenPromise.resolve();
-                               }, tokenPromise.reject );
-                       } else {
-                               tokenPromise.resolve();
-                       }
-
-                       $( 'body' ).append( $form, $iframe );
-
-                       deferred.always( function () {
-                               $form.remove();
-                               $iframe.remove();
-                       } );
-
-                       return deferred.promise();
-               },
-
-               /**
-                * Uploads a file using the FormData API.
-                *
-                * @private
-                * @param {File} file
-                * @param {Object} data Other upload options, see action=upload API docs for more
-                * @return {jQuery.Promise}
-                */
-               uploadWithFormData: function ( file, data ) {
-                       var key, request,
-                               deferred = $.Deferred();
-
-                       for ( key in data ) {
-                               if ( !fieldsAllowed[ key ] ) {
-                                       delete data[ key ];
-                               }
-                       }
-
-                       data = $.extend( {}, this.defaults.parameters, { action: 'upload' }, data );
-                       if ( !data.chunk ) {
-                               data.file = file;
-                       }
-
-                       if ( !data.filename && !data.stash ) {
-                               throw new Error( 'Filename not included in file data.' );
-                       }
-
-                       // Use this.postWithEditToken() or this.post()
-                       request = this[ this.needToken() ? 'postWithEditToken' : 'post' ]( data, {
-                               // Use FormData (if we got here, we know that it's available)
-                               contentType: 'multipart/form-data',
-                               // No timeout (default from mw.Api is 30 seconds)
-                               timeout: 0,
-                               // Provide upload progress notifications
-                               xhr: function () {
-                                       var xhr = $.ajaxSettings.xhr();
-                                       if ( xhr.upload ) {
-                                               // need to bind this event before we open the connection (see note at
-                                               // https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest#Monitoring_progress)
-                                               xhr.upload.addEventListener( 'progress', function ( ev ) {
-                                                       if ( ev.lengthComputable ) {
-                                                               deferred.notify( ev.loaded / ev.total );
-                                                       }
-                                               } );
-                                       }
-                                       return xhr;
-                               }
-                       } )
-                               .done( function ( result ) {
-                                       deferred.notify( 1 );
-                                       if ( result.upload && result.upload.warnings ) {
-                                               deferred.reject( getFirstKey( result.upload.warnings ), result );
-                                       } else {
-                                               deferred.resolve( result );
-                                       }
-                               } )
-                               .fail( function ( errorCode, result ) {
-                                       deferred.notify( 1 );
-                                       deferred.reject( errorCode, result );
-                               } );
-
-                       return deferred.promise( { abort: request.abort } );
-               },
-
-               /**
-                * Upload a file in several chunks.
-                *
-                * @param {File} file
-                * @param {Object} data Other upload options, see action=upload API docs for more
-                * @param {number} [chunkSize] Size (in bytes) per chunk (default: 5MB)
-                * @param {number} [chunkRetries] Amount of times to retry a failed chunk (default: 1)
-                * @return {jQuery.Promise}
-                */
-               chunkedUpload: function ( file, data, chunkSize, chunkRetries ) {
-                       var start, end, promise, next, active,
-                               deferred = $.Deferred();
-
-                       chunkSize = chunkSize === undefined ? 5 * 1024 * 1024 : chunkSize;
-                       chunkRetries = chunkRetries === undefined ? 1 : chunkRetries;
-
-                       if ( !data.filename ) {
-                               throw new Error( 'Filename not included in file data.' );
-                       }
-
-                       // Submit first chunk to get the filekey
-                       active = promise = this.uploadChunk( file, data, 0, chunkSize, '', chunkRetries )
-                               .done( chunkSize >= file.size ? deferred.resolve : null )
-                               .fail( deferred.reject )
-                               .progress( deferred.notify );
-
-                       // Now iteratively submit the rest of the chunks
-                       for ( start = chunkSize; start < file.size; start += chunkSize ) {
-                               end = Math.min( start + chunkSize, file.size );
-                               next = $.Deferred();
-
-                               // We could simply chain one this.uploadChunk after another with
-                               // .then(), but then we'd hit an `Uncaught RangeError: Maximum
-                               // call stack size exceeded` at as low as 1024 calls in Firefox
-                               // 47. This'll work around it, but comes with the drawback of
-                               // having to properly relay the results to the returned promise.
-                               // eslint-disable-next-line no-loop-func
-                               promise.done( function ( start, end, next, result ) {
-                                       var filekey = result.upload.filekey;
-                                       active = this.uploadChunk( file, data, start, end, filekey, chunkRetries )
-                                               .done( end === file.size ? deferred.resolve : next.resolve )
-                                               .fail( deferred.reject )
-                                               .progress( deferred.notify );
-                               // start, end & next must be bound to closure, or they'd have
-                               // changed by the time the promises are resolved
-                               }.bind( this, start, end, next ) );
-
-                               promise = next;
-                       }
-
-                       return deferred.promise( { abort: active.abort } );
-               },
-
-               /**
-                * Uploads 1 chunk.
-                *
-                * @private
-                * @param {File} file
-                * @param {Object} data Other upload options, see action=upload API docs for more
-                * @param {number} start Chunk start position
-                * @param {number} end Chunk end position
-                * @param {string} [filekey] File key, for follow-up chunks
-                * @param {number} [retries] Amount of times to retry request
-                * @return {jQuery.Promise}
-                */
-               uploadChunk: function ( file, data, start, end, filekey, retries ) {
-                       var upload,
-                               api = this,
-                               chunk = this.slice( file, start, end );
-
-                       // When uploading in chunks, we're going to be issuing a lot more
-                       // requests and there's always a chance of 1 getting dropped.
-                       // In such case, it could be useful to try again: a network hickup
-                       // doesn't necessarily have to result in upload failure...
-                       retries = retries === undefined ? 1 : retries;
-
-                       data.filesize = file.size;
-                       data.chunk = chunk;
-                       data.offset = start;
-
-                       // filekey must only be added when uploading follow-up chunks; the
-                       // first chunk should never have a filekey (it'll be generated)
-                       if ( filekey && start !== 0 ) {
-                               data.filekey = filekey;
-                       }
-
-                       upload = this.uploadWithFormData( file, data );
-                       return upload.then(
-                               null,
-                               function ( code, result ) {
-                                       var retry;
-
-                                       // uploadWithFormData will reject uploads with warnings, but
-                                       // these warnings could be "harmless" or recovered from
-                                       // (e.g. exists-normalized, when it'll be renamed later)
-                                       // In the case of (only) a warning, we still want to
-                                       // continue the chunked upload until it completes: then
-                                       // reject it - at least it's been fully uploaded by then and
-                                       // failure handlers have a complete result object (including
-                                       // possibly more warnings, e.g. duplicate)
-                                       // This matches .upload, which also completes the upload.
-                                       if ( result.upload && result.upload.warnings && code in result.upload.warnings ) {
-                                               if ( end === file.size ) {
-                                                       // uploaded last chunk = reject with result data
-                                                       return $.Deferred().reject( code, result );
-                                               } else {
-                                                       // still uploading chunks = resolve to keep going
-                                                       return $.Deferred().resolve( result );
-                                               }
-                                       }
-
-                                       if ( retries === 0 ) {
-                                               return $.Deferred().reject( code, result );
-                                       }
-
-                                       // If the call flat out failed, we may want to try again...
-                                       retry = api.uploadChunk.bind( this, file, data, start, end, filekey, retries - 1 );
-                                       return api.retry( code, result, retry );
-                               },
-                               function ( fraction ) {
-                                       // Since we're only uploading small parts of a file, we
-                                       // need to adjust the reported progress to reflect where
-                                       // we actually are in the combined upload
-                                       return ( start + fraction * ( end - start ) ) / file.size;
-                               }
-                       ).promise( { abort: upload.abort } );
-               },
-
-               /**
-                * Launch the upload anew if it failed because of network issues.
-                *
-                * @private
-                * @param {string} code Error code
-                * @param {Object} result API result
-                * @param {Function} callable
-                * @return {jQuery.Promise}
-                */
-               retry: function ( code, result, callable ) {
-                       var uploadPromise,
-                               retryTimer,
-                               deferred = $.Deferred(),
-                               // Wrap around the callable, so that once it completes, it'll
-                               // resolve/reject the promise we'll return
-                               retry = function () {
-                                       uploadPromise = callable();
-                                       uploadPromise.then( deferred.resolve, deferred.reject );
-                               };
-
-                       // Don't retry if the request failed because we aborted it (or if
-                       // it's another kind of request failure)
-                       if ( code !== 'http' || result.textStatus === 'abort' ) {
-                               return deferred.reject( code, result );
-                       }
-
-                       retryTimer = setTimeout( retry, 1000 );
-                       return deferred.promise( { abort: function () {
-                               // Clear the scheduled upload, or abort if already in flight
-                               if ( retryTimer ) {
-                                       clearTimeout( retryTimer );
-                               }
-                               if ( uploadPromise.abort ) {
-                                       uploadPromise.abort();
-                               }
-                       } } );
-               },
-
-               /**
-                * Slice a chunk out of a File object.
-                *
-                * @private
-                * @param {File} file
-                * @param {number} start
-                * @param {number} stop
-                * @return {Blob}
-                */
-               slice: function ( file, start, stop ) {
-                       if ( file.mozSlice ) {
-                               // FF <= 12
-                               return file.mozSlice( start, stop, file.type );
-                       } else if ( file.webkitSlice ) {
-                               // Chrome <= 20
-                               return file.webkitSlice( start, stop, file.type );
-                       } else {
-                               // On really old browser versions (before slice was prefixed),
-                               // slice() would take (start, length) instead of (start, end)
-                               // We'll ignore that here...
-                               return file.slice( start, stop, file.type );
-                       }
-               },
-
-               /**
-                * This function will handle how uploads to stash (via uploadToStash or
-                * chunkedUploadToStash) are resolved/rejected.
-                *
-                * After a successful stash, it'll resolve with a callback which, when
-                * called, will finalize the upload in stash (with the given data, or
-                * with additional/conflicting data)
-                *
-                * A failed stash can still be recovered from as long as 'filekey' is
-                * present. In that case, it'll also resolve with the callback to
-                * finalize the upload (all warnings are then ignored.)
-                * Otherwise, it'll just reject as you'd expect, with code & result.
-                *
-                * @private
-                * @param {jQuery.Promise} uploadPromise
-                * @param {Object} data
-                * @return {jQuery.Promise}
-                * @return {Function} return.finishUpload Call this function to finish the upload.
-                * @return {Object} return.finishUpload.data Additional data for the upload.
-                * @return {jQuery.Promise} return.finishUpload.return API promise for the final upload
-                * @return {Object} return.finishUpload.return.data API return value for the final upload
-                */
-               finishUploadToStash: function ( uploadPromise, data ) {
-                       var filekey,
-                               api = this;
-
-                       function finishUpload( moreData ) {
-                               return api.uploadFromStash( filekey, $.extend( data, moreData ) );
-                       }
-
-                       return uploadPromise.then(
-                               function ( result ) {
-                                       filekey = result.upload.filekey;
-                                       return finishUpload;
-                               },
-                               function ( errorCode, result ) {
-                                       if ( result && result.upload && result.upload.filekey ) {
-                                               // Ignore any warnings if 'filekey' was returned, that's all we care about
-                                               filekey = result.upload.filekey;
-                                               return $.Deferred().resolve( finishUpload );
-                                       }
-                                       return $.Deferred().reject( errorCode, result );
-                               }
-                       );
-               },
-
-               /**
-                * Upload a file to the stash.
-                *
-                * This function will return a promise, which when resolved, will pass back a function
-                * to finish the stash upload. You can call that function with an argument containing
-                * more, or conflicting, data to pass to the server. For example:
-                *
-                *     // upload a file to the stash with a placeholder filename
-                *     api.uploadToStash( file, { filename: 'testing.png' } ).done( function ( finish ) {
-                *         // finish is now the function we can use to finalize the upload
-                *         // pass it a new filename from user input to override the initial value
-                *         finish( { filename: getFilenameFromUser() } ).done( function ( data ) {
-                *             // the upload is complete, data holds the API response
-                *         } );
-                *     } );
-                *
-                * @param {File|HTMLInputElement} file
-                * @param {Object} [data]
-                * @return {jQuery.Promise}
-                * @return {Function} return.finishUpload Call this function to finish the upload.
-                * @return {Object} return.finishUpload.data Additional data for the upload.
-                * @return {jQuery.Promise} return.finishUpload.return API promise for the final upload
-                * @return {Object} return.finishUpload.return.data API return value for the final upload
-                */
-               uploadToStash: function ( file, data ) {
-                       var promise;
-
-                       if ( !data.filename ) {
-                               throw new Error( 'Filename not included in file data.' );
-                       }
-
-                       promise = this.upload( file, { stash: true, filename: data.filename } );
-
-                       return this.finishUploadToStash( promise, data );
-               },
-
-               /**
-                * Upload a file to the stash, in chunks.
-                *
-                * This function will return a promise, which when resolved, will pass back a function
-                * to finish the stash upload.
-                *
-                * @see #method-uploadToStash
-                * @param {File|HTMLInputElement} file
-                * @param {Object} [data]
-                * @param {number} [chunkSize] Size (in bytes) per chunk (default: 5MB)
-                * @param {number} [chunkRetries] Amount of times to retry a failed chunk (default: 1)
-                * @return {jQuery.Promise}
-                * @return {Function} return.finishUpload Call this function to finish the upload.
-                * @return {Object} return.finishUpload.data Additional data for the upload.
-                * @return {jQuery.Promise} return.finishUpload.return API promise for the final upload
-                * @return {Object} return.finishUpload.return.data API return value for the final upload
-                */
-               chunkedUploadToStash: function ( file, data, chunkSize, chunkRetries ) {
-                       var promise;
-
-                       if ( !data.filename ) {
-                               throw new Error( 'Filename not included in file data.' );
-                       }
-
-                       promise = this.chunkedUpload(
-                               file,
-                               { stash: true, filename: data.filename },
-                               chunkSize,
-                               chunkRetries
-                       );
-
-                       return this.finishUploadToStash( promise, data );
-               },
-
-               /**
-                * Finish an upload in the stash.
-                *
-                * @param {string} filekey
-                * @param {Object} data
-                * @return {jQuery.Promise}
-                */
-               uploadFromStash: function ( filekey, data ) {
-                       data.filekey = filekey;
-                       data.action = 'upload';
-                       data.format = 'json';
-
-                       if ( !data.filename ) {
-                               throw new Error( 'Filename not included in file data.' );
-                       }
-
-                       return this.postWithEditToken( data ).then( function ( result ) {
-                               if ( result.upload && result.upload.warnings ) {
-                                       return $.Deferred().reject( getFirstKey( result.upload.warnings ), result ).promise();
-                               }
-                               return result;
-                       } );
-               },
-
-               needToken: function () {
-                       return true;
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.upload
-        */
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api.user.js b/resources/src/mediawiki.api.user.js
deleted file mode 100644 (file)
index e7b4b6d..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * @class mw.Api.plugin.user
- * @since 1.27
- */
-( function ( mw, $ ) {
-
-       $.extend( mw.Api.prototype, {
-
-               /**
-                * Get the current user's groups and rights.
-                *
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {Object} return.done.userInfo
-                * @return {string[]} return.done.userInfo.groups User groups that the current user belongs to
-                * @return {string[]} return.done.userInfo.rights Current user's rights
-                */
-               getUserInfo: function () {
-                       return this.get( {
-                               action: 'query',
-                               meta: 'userinfo',
-                               uiprop: [ 'groups', 'rights' ]
-                       } ).then( function ( data ) {
-                               if ( data.query && data.query.userinfo ) {
-                                       return data.query.userinfo;
-                               }
-                               return $.Deferred().reject().promise();
-                       } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.user
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api.watch.js b/resources/src/mediawiki.api.watch.js
deleted file mode 100644 (file)
index 025c111..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * @class mw.Api.plugin.watch
- * @since 1.19
- */
-( function ( mw, $ ) {
-
-       /**
-        * @private
-        * @static
-        * @context mw.Api
-        *
-        * @param {string|mw.Title|string[]|mw.Title[]} pages Full page name or instance of mw.Title, or an
-        *  array thereof. If an array is passed, the return value passed to the promise will also be an
-        *  array of appropriate objects.
-        * @param {Object} [addParams]
-        * @return {jQuery.Promise}
-        * @return {Function} return.done
-        * @return {Object|Object[]} return.done.watch Object or list of objects (depends on the `pages`
-        *  parameter)
-        * @return {string} return.done.watch.title Full pagename
-        * @return {boolean} return.done.watch.watched Whether the page is now watched or unwatched
-        */
-       function doWatchInternal( pages, addParams ) {
-               // XXX: Parameter addParams is undocumented because we inherit this
-               // documentation in the public method...
-               var apiPromise = this.postWithToken( 'watch',
-                       $.extend(
-                               {
-                                       formatversion: 2,
-                                       action: 'watch',
-                                       titles: Array.isArray( pages ) ? pages : String( pages )
-                               },
-                               addParams
-                       )
-               );
-
-               return apiPromise
-                       .then( function ( data ) {
-                               // If a single page was given (not an array) respond with a single item as well.
-                               return Array.isArray( pages ) ? data.watch : data.watch[ 0 ];
-                       } )
-                       .promise( { abort: apiPromise.abort } );
-       }
-
-       $.extend( mw.Api.prototype, {
-               /**
-                * Convenience method for `action=watch`.
-                *
-                * @inheritdoc #doWatchInternal
-                */
-               watch: function ( pages ) {
-                       return doWatchInternal.call( this, pages );
-               },
-
-               /**
-                * Convenience method for `action=watch&unwatch=1`.
-                *
-                * @inheritdoc #doWatchInternal
-                */
-               unwatch: function ( pages ) {
-                       return doWatchInternal.call( this, pages, { unwatch: 1 } );
-               }
-       } );
-
-       /**
-        * @class mw.Api
-        * @mixins mw.Api.plugin.watch
-        */
-
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/category.js b/resources/src/mediawiki.api/category.js
new file mode 100644 (file)
index 0000000..85df90e
--- /dev/null
@@ -0,0 +1,101 @@
+/**
+ * @class mw.Api.plugin.category
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Determine if a category exists.
+                *
+                * @param {mw.Title|string} title
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {boolean} return.done.isCategory Whether the category exists.
+                */
+               isCategory: function ( title ) {
+                       var apiPromise = this.get( {
+                               formatversion: 2,
+                               prop: 'categoryinfo',
+                               titles: [ String( title ) ]
+                       } );
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       return !!(
+                                               data.query && // query is missing on title=""
+                                               data.query.pages && // query.pages is missing on title="#" or title="mw:"
+                                               data.query.pages[ 0 ].categoryinfo
+                                       );
+                               } )
+                               .promise( { abort: apiPromise.abort } );
+               },
+
+               /**
+                * Get a list of categories that match a certain prefix.
+                *
+                * E.g. given "Foo", return "Food", "Foolish people", "Foosball tables"...
+                *
+                * @param {string} prefix Prefix to match.
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string[]} return.done.categories Matched categories
+                */
+               getCategoriesByPrefix: function ( prefix ) {
+                       // Fetch with allpages to only get categories that have a corresponding description page.
+                       var apiPromise = this.get( {
+                               formatversion: 2,
+                               list: 'allpages',
+                               apprefix: prefix,
+                               apnamespace: mw.config.get( 'wgNamespaceIds' ).category
+                       } );
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       return data.query.allpages.map( function ( category ) {
+                                               return new mw.Title( category.title ).getMainText();
+                                       } );
+                               } )
+                               .promise( { abort: apiPromise.abort } );
+               },
+
+               /**
+                * Get the categories that a particular page on the wiki belongs to.
+                *
+                * @param {mw.Title|string} title
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {boolean|mw.Title[]} return.done.categories List of category titles or false
+                *  if title was not found.
+                */
+               getCategories: function ( title ) {
+                       var apiPromise = this.get( {
+                               formatversion: 2,
+                               prop: 'categories',
+                               titles: [ String( title ) ]
+                       } );
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       var page;
+
+                                       if ( !data.query || !data.query.pages ) {
+                                               return false;
+                                       }
+                                       page = data.query.pages[ 0 ];
+                                       if ( !page.categories ) {
+                                               return false;
+                                       }
+                                       return page.categories.map( function ( cat ) {
+                                               return new mw.Title( cat.title );
+                                       } );
+                               } )
+                               .promise( { abort: apiPromise.abort } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.category
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/edit.js b/resources/src/mediawiki.api/edit.js
new file mode 100644 (file)
index 0000000..e6f5668
--- /dev/null
@@ -0,0 +1,199 @@
+/**
+ * @class mw.Api.plugin.edit
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+
+               /**
+                * Post to API with csrf token. If we have no token, get one and try to post.
+                * If we have a cached token try using that, and if it fails, blank out the
+                * cached token and start over.
+                *
+                * @param {Object} params API parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise} See #post
+                */
+               postWithEditToken: function ( params, ajaxOptions ) {
+                       return this.postWithToken( 'csrf', params, ajaxOptions );
+               },
+
+               /**
+                * API helper to grab a csrf token.
+                *
+                * @return {jQuery.Promise} Received token.
+                */
+               getEditToken: function () {
+                       return this.getToken( 'csrf' );
+               },
+
+               /**
+                * Create a new page.
+                *
+                * Example:
+                *
+                *     new mw.Api().create( 'Sandbox',
+                *         { summary: 'Load sand particles.' },
+                *         'Sand.'
+                *     );
+                *
+                * @since 1.28
+                * @param {mw.Title|string} title Page title
+                * @param {Object} params Edit API parameters
+                * @param {string} params.summary Edit summary
+                * @param {string} content
+                * @return {jQuery.Promise} API response
+                */
+               create: function ( title, params, content ) {
+                       return this.postWithEditToken( $.extend( {
+                               action: 'edit',
+                               title: String( title ),
+                               text: content,
+                               formatversion: '2',
+
+                               // Protect against errors and conflicts
+                               assert: mw.config.get( 'wgUserName' ) ? 'user' : undefined,
+                               createonly: true
+                       }, params ) ).then( function ( data ) {
+                               return data.edit;
+                       } );
+               },
+
+               /**
+                * Edit an existing page.
+                *
+                * To create a new page, use #create() instead.
+                *
+                * Simple transformation:
+                *
+                *     new mw.Api()
+                *         .edit( 'Sandbox', function ( revision ) {
+                *             return revision.content.replace( 'foo', 'bar' );
+                *         } )
+                *         .then( function () {
+                *             console.log( 'Saved! ');
+                *         } );
+                *
+                * Set save parameters by returning an object instead of a string:
+                *
+                *     new mw.Api().edit(
+                *         'Sandbox',
+                *         function ( revision ) {
+                *             return {
+                *                 text: revision.content.replace( 'foo', 'bar' ),
+                *                 summary: 'Replace "foo" with "bar".',
+                *                 assert: 'bot',
+                *                 minor: true
+                *             };
+                *         }
+                *     )
+                *     .then( function () {
+                *         console.log( 'Saved! ');
+                *     } );
+                *
+                * Transform asynchronously by returning a promise.
+                *
+                *     new mw.Api()
+                *         .edit( 'Sandbox', function ( revision ) {
+                *             return Spelling
+                *                 .corrections( revision.content )
+                *                 .then( function ( report ) {
+                *                     return {
+                *                         text: report.output,
+                *                         summary: report.changelog
+                *                     };
+                *                 } );
+                *         } )
+                *         .then( function () {
+                *             console.log( 'Saved! ');
+                *         } );
+                *
+                * @since 1.28
+                * @param {mw.Title|string} title Page title
+                * @param {Function} transform Callback that prepares the edit
+                * @param {Object} transform.revision Current revision
+                * @param {string} transform.revision.content Current revision content
+                * @param {string|Object|jQuery.Promise} transform.return New content, object with edit
+                *  API parameters, or promise providing one of those.
+                * @return {jQuery.Promise} Edit API response
+                */
+               edit: function ( title, transform ) {
+                       var basetimestamp, curtimestamp,
+                               api = this;
+
+                       title = String( title );
+
+                       return api.get( {
+                               action: 'query',
+                               prop: 'revisions',
+                               rvprop: [ 'content', 'timestamp' ],
+                               titles: [ title ],
+                               formatversion: '2',
+                               curtimestamp: true
+                       } )
+                               .then( function ( data ) {
+                                       var page, revision;
+                                       if ( !data.query || !data.query.pages ) {
+                                               return $.Deferred().reject( 'unknown' );
+                                       }
+                                       page = data.query.pages[ 0 ];
+                                       if ( !page || page.invalid ) {
+                                               return $.Deferred().reject( 'invalidtitle' );
+                                       }
+                                       if ( page.missing ) {
+                                               return $.Deferred().reject( 'nocreate-missing' );
+                                       }
+                                       revision = page.revisions[ 0 ];
+                                       basetimestamp = revision.timestamp;
+                                       curtimestamp = data.curtimestamp;
+                                       return transform( {
+                                               timestamp: revision.timestamp,
+                                               content: revision.content
+                                       } );
+                               } )
+                               .then( function ( params ) {
+                                       var editParams = typeof params === 'object' ? params : { text: String( params ) };
+                                       return api.postWithEditToken( $.extend( {
+                                               action: 'edit',
+                                               title: title,
+                                               formatversion: '2',
+
+                                               // Protect against errors and conflicts
+                                               assert: mw.config.get( 'wgUserName' ) ? 'user' : undefined,
+                                               basetimestamp: basetimestamp,
+                                               starttimestamp: curtimestamp,
+                                               nocreate: true
+                                       }, editParams ) );
+                               } )
+                               .then( function ( data ) {
+                                       return data.edit;
+                               } );
+               },
+
+               /**
+                * Post a new section to the page.
+                *
+                * @see #postWithEditToken
+                * @param {mw.Title|string} title Target page
+                * @param {string} header
+                * @param {string} message wikitext message
+                * @param {Object} [additionalParams] Additional API parameters, e.g. `{ redirect: true }`
+                * @return {jQuery.Promise}
+                */
+               newSection: function ( title, header, message, additionalParams ) {
+                       return this.postWithEditToken( $.extend( {
+                               action: 'edit',
+                               section: 'new',
+                               title: String( title ),
+                               summary: header,
+                               text: message
+                       }, additionalParams ) );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.edit
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/index.js b/resources/src/mediawiki.api/index.js
new file mode 100644 (file)
index 0000000..0038ed8
--- /dev/null
@@ -0,0 +1,506 @@
+( function ( mw, $ ) {
+
+       /**
+        * @class mw.Api
+        */
+
+       /**
+        * @property {Object} defaultOptions Default options for #ajax calls. Can be overridden by passing
+        *     `options` to mw.Api constructor.
+        * @property {Object} defaultOptions.parameters Default query parameters for API requests.
+        * @property {Object} defaultOptions.ajax Default options for jQuery#ajax.
+        * @property {boolean} defaultOptions.useUS Whether to use U+001F when joining multi-valued
+        *     parameters (since 1.28). Default is true if ajax.url is not set, false otherwise for
+        *     compatibility.
+        * @private
+        */
+       var defaultOptions = {
+                       parameters: {
+                               action: 'query',
+                               format: 'json'
+                       },
+                       ajax: {
+                               url: mw.util.wikiScript( 'api' ),
+                               timeout: 30 * 1000, // 30 seconds
+                               dataType: 'json'
+                       }
+               },
+
+               // Keyed by ajax url and symbolic name for the individual request
+               promises = {};
+
+       function mapLegacyToken( action ) {
+               // Legacy types for backward-compatibility with API action=tokens.
+               var csrfActions = [
+                       'edit',
+                       'delete',
+                       'protect',
+                       'move',
+                       'block',
+                       'unblock',
+                       'email',
+                       'import',
+                       'options'
+               ];
+               if ( csrfActions.indexOf( action ) !== -1 ) {
+                       mw.track( 'mw.deprecate', 'apitoken_' + action );
+                       mw.log.warn( 'Use of the "' + action + '" token is deprecated. Use "csrf" instead.' );
+                       return 'csrf';
+               }
+               return action;
+       }
+
+       // Pre-populate with fake ajax promises to save http requests for tokens
+       // we already have on the page via the user.tokens module (T36733).
+       promises[ defaultOptions.ajax.url ] = {};
+       $.each( mw.user.tokens.get(), function ( key, value ) {
+               // This requires #getToken to use the same key as user.tokens.
+               // Format: token-type + "Token" (eg. csrfToken, patrolToken, watchToken).
+               promises[ defaultOptions.ajax.url ][ key ] = $.Deferred()
+                       .resolve( value )
+                       .promise( { abort: function () {} } );
+       } );
+
+       /**
+        * Constructor to create an object to interact with the API of a particular MediaWiki server.
+        * mw.Api objects represent the API of a particular MediaWiki server.
+        *
+        *     var api = new mw.Api();
+        *     api.get( {
+        *         action: 'query',
+        *         meta: 'userinfo'
+        *     } ).done( function ( data ) {
+        *         console.log( data );
+        *     } );
+        *
+        * Since MW 1.25, multiple values for a parameter can be specified using an array:
+        *
+        *     var api = new mw.Api();
+        *     api.get( {
+        *         action: 'query',
+        *         meta: [ 'userinfo', 'siteinfo' ] // same effect as 'userinfo|siteinfo'
+        *     } ).done( function ( data ) {
+        *         console.log( data );
+        *     } );
+        *
+        * Since MW 1.26, boolean values for a parameter can be specified directly. If the value is
+        * `false` or `undefined`, the parameter will be omitted from the request, as required by the API.
+        *
+        * @constructor
+        * @param {Object} [options] See #defaultOptions documentation above. Can also be overridden for
+        *  each individual request by passing them to #get or #post (or directly #ajax) later on.
+        */
+       mw.Api = function ( options ) {
+               options = options || {};
+
+               // Force a string if we got a mw.Uri object
+               if ( options.ajax && options.ajax.url !== undefined ) {
+                       options.ajax.url = String( options.ajax.url );
+               }
+
+               options = $.extend( { useUS: !options.ajax || !options.ajax.url }, options );
+
+               options.parameters = $.extend( {}, defaultOptions.parameters, options.parameters );
+               options.ajax = $.extend( {}, defaultOptions.ajax, options.ajax );
+
+               this.defaults = options;
+               this.requests = [];
+       };
+
+       mw.Api.prototype = {
+               /**
+                * Abort all unfinished requests issued by this Api object.
+                *
+                * @method
+                */
+               abort: function () {
+                       this.requests.forEach( function ( request ) {
+                               if ( request ) {
+                                       request.abort();
+                               }
+                       } );
+               },
+
+               /**
+                * Perform API get request
+                *
+                * @param {Object} parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise}
+                */
+               get: function ( parameters, ajaxOptions ) {
+                       ajaxOptions = ajaxOptions || {};
+                       ajaxOptions.type = 'GET';
+                       return this.ajax( parameters, ajaxOptions );
+               },
+
+               /**
+                * Perform API post request
+                *
+                * @param {Object} parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise}
+                */
+               post: function ( parameters, ajaxOptions ) {
+                       ajaxOptions = ajaxOptions || {};
+                       ajaxOptions.type = 'POST';
+                       return this.ajax( parameters, ajaxOptions );
+               },
+
+               /**
+                * Massage parameters from the nice format we accept into a format suitable for the API.
+                *
+                * NOTE: A value of undefined/null in an array will be represented by Array#join()
+                * as the empty string. Should we filter silently? Warn? Leave as-is?
+                *
+                * @private
+                * @param {Object} parameters (modified in-place)
+                * @param {boolean} useUS Whether to use U+001F when joining multi-valued parameters.
+                */
+               preprocessParameters: function ( parameters, useUS ) {
+                       var key;
+                       // Handle common MediaWiki API idioms for passing parameters
+                       for ( key in parameters ) {
+                               // Multiple values are pipe-separated
+                               if ( Array.isArray( parameters[ key ] ) ) {
+                                       if ( !useUS || parameters[ key ].join( '' ).indexOf( '|' ) === -1 ) {
+                                               parameters[ key ] = parameters[ key ].join( '|' );
+                                       } else {
+                                               parameters[ key ] = '\x1f' + parameters[ key ].join( '\x1f' );
+                                       }
+                               } else if ( parameters[ key ] === false || parameters[ key ] === undefined ) {
+                                       // Boolean values are only false when not given at all
+                                       delete parameters[ key ];
+                               }
+                       }
+               },
+
+               /**
+                * Perform the API call.
+                *
+                * @param {Object} parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise} Done: API response data and the jqXHR object.
+                *  Fail: Error code
+                */
+               ajax: function ( parameters, ajaxOptions ) {
+                       var token, requestIndex,
+                               api = this,
+                               apiDeferred = $.Deferred(),
+                               xhr, key, formData;
+
+                       parameters = $.extend( {}, this.defaults.parameters, parameters );
+                       ajaxOptions = $.extend( {}, this.defaults.ajax, ajaxOptions );
+
+                       // Ensure that token parameter is last (per [[mw:API:Edit#Token]]).
+                       if ( parameters.token ) {
+                               token = parameters.token;
+                               delete parameters.token;
+                       }
+
+                       this.preprocessParameters( parameters, this.defaults.useUS );
+
+                       // If multipart/form-data has been requested and emulation is possible, emulate it
+                       if (
+                               ajaxOptions.type === 'POST' &&
+                               window.FormData &&
+                               ajaxOptions.contentType === 'multipart/form-data'
+                       ) {
+
+                               formData = new FormData();
+
+                               for ( key in parameters ) {
+                                       formData.append( key, parameters[ key ] );
+                               }
+                               // If we extracted a token parameter, add it back in.
+                               if ( token ) {
+                                       formData.append( 'token', token );
+                               }
+
+                               ajaxOptions.data = formData;
+
+                               // Prevent jQuery from mangling our FormData object
+                               ajaxOptions.processData = false;
+                               // Prevent jQuery from overriding the Content-Type header
+                               ajaxOptions.contentType = false;
+                       } else {
+                               // This works because jQuery accepts data as a query string or as an Object
+                               ajaxOptions.data = $.param( parameters );
+                               // If we extracted a token parameter, add it back in.
+                               if ( token ) {
+                                       ajaxOptions.data += '&token=' + encodeURIComponent( token );
+                               }
+
+                               // Depending on server configuration, MediaWiki may forbid periods in URLs, due to an IE 6
+                               // XSS bug. So let's escape them here. See WebRequest::checkUrlExtension() and T30235.
+                               ajaxOptions.data = ajaxOptions.data.replace( /\./g, '%2E' );
+
+                               if ( ajaxOptions.contentType === 'multipart/form-data' ) {
+                                       // We were asked to emulate but can't, so drop the Content-Type header, otherwise
+                                       // it'll be wrong and the server will fail to decode the POST body
+                                       delete ajaxOptions.contentType;
+                               }
+                       }
+
+                       // Make the AJAX request
+                       xhr = $.ajax( ajaxOptions )
+                               // If AJAX fails, reject API call with error code 'http'
+                               // and details in second argument.
+                               .fail( function ( xhr, textStatus, exception ) {
+                                       apiDeferred.reject( 'http', {
+                                               xhr: xhr,
+                                               textStatus: textStatus,
+                                               exception: exception
+                                       } );
+                               } )
+                               // AJAX success just means "200 OK" response, also check API error codes
+                               .done( function ( result, textStatus, jqXHR ) {
+                                       var code;
+                                       if ( result === undefined || result === null || result === '' ) {
+                                               apiDeferred.reject( 'ok-but-empty',
+                                                       'OK response but empty result (check HTTP headers?)',
+                                                       result,
+                                                       jqXHR
+                                               );
+                                       } else if ( result.error ) {
+                                               // errorformat=bc
+                                               code = result.error.code === undefined ? 'unknown' : result.error.code;
+                                               apiDeferred.reject( code, result, result, jqXHR );
+                                       } else if ( result.errors ) {
+                                               // errorformat!=bc
+                                               code = result.errors[ 0 ].code === undefined ? 'unknown' : result.errors[ 0 ].code;
+                                               apiDeferred.reject( code, result, result, jqXHR );
+                                       } else {
+                                               apiDeferred.resolve( result, jqXHR );
+                                       }
+                               } );
+
+                       requestIndex = this.requests.length;
+                       this.requests.push( xhr );
+                       xhr.always( function () {
+                               api.requests[ requestIndex ] = null;
+                       } );
+                       // Return the Promise
+                       return apiDeferred.promise( { abort: xhr.abort } ).fail( function ( code, details ) {
+                               if ( !( code === 'http' && details && details.textStatus === 'abort' ) ) {
+                                       mw.log( 'mw.Api error: ', code, details );
+                               }
+                       } );
+               },
+
+               /**
+                * Post to API with specified type of token. If we have no token, get one and try to post.
+                * If we have a cached token try using that, and if it fails, blank out the
+                * cached token and start over. For example to change an user option you could do:
+                *
+                *     new mw.Api().postWithToken( 'csrf', {
+                *         action: 'options',
+                *         optionname: 'gender',
+                *         optionvalue: 'female'
+                *     } );
+                *
+                * @param {string} tokenType The name of the token, like options or edit.
+                * @param {Object} params API parameters
+                * @param {Object} [ajaxOptions]
+                * @return {jQuery.Promise} See #post
+                * @since 1.22
+                */
+               postWithToken: function ( tokenType, params, ajaxOptions ) {
+                       var api = this,
+                               abortedPromise = $.Deferred().reject( 'http',
+                                       { textStatus: 'abort', exception: 'abort' } ).promise(),
+                               abortable,
+                               aborted;
+
+                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
+                               params.token = token;
+                               // Request was aborted while token request was running, but we
+                               // don't want to unnecessarily abort token requests, so abort
+                               // a fake request instead
+                               if ( aborted ) {
+                                       return abortedPromise;
+                               }
+
+                               return ( abortable = api.post( params, ajaxOptions ) ).catch(
+                                       // Error handler
+                                       function ( code ) {
+                                               if ( code === 'badtoken' ) {
+                                                       api.badToken( tokenType );
+                                                       // Try again, once
+                                                       params.token = undefined;
+                                                       abortable = null;
+                                                       return api.getToken( tokenType, params.assert ).then( function ( token ) {
+                                                               params.token = token;
+                                                               if ( aborted ) {
+                                                                       return abortedPromise;
+                                                               }
+
+                                                               return ( abortable = api.post( params, ajaxOptions ) );
+                                                       } );
+                                               }
+
+                                               // Let caller handle the error code
+                                               return $.Deferred().rejectWith( this, arguments );
+                                       }
+                               );
+                       } ).promise( { abort: function () {
+                               if ( abortable ) {
+                                       abortable.abort();
+                               } else {
+                                       aborted = true;
+                               }
+                       } } );
+               },
+
+               /**
+                * Get a token for a certain action from the API.
+                *
+                * The assert parameter is only for internal use by #postWithToken.
+                *
+                * @since 1.22
+                * @param {string} type Token type
+                * @param {string} [assert]
+                * @return {jQuery.Promise} Received token.
+                */
+               getToken: function ( type, assert ) {
+                       var apiPromise, promiseGroup, d, reject;
+                       type = mapLegacyToken( type );
+                       promiseGroup = promises[ this.defaults.ajax.url ];
+                       d = promiseGroup && promiseGroup[ type + 'Token' ];
+
+                       if ( !promiseGroup ) {
+                               promiseGroup = promises[ this.defaults.ajax.url ] = {};
+                       }
+
+                       if ( !d ) {
+                               apiPromise = this.get( {
+                                       action: 'query',
+                                       meta: 'tokens',
+                                       type: type,
+                                       assert: assert
+                               } );
+                               reject = function () {
+                                       // Clear promise. Do not cache errors.
+                                       delete promiseGroup[ type + 'Token' ];
+
+                                       // Let caller handle the error code
+                                       return $.Deferred().rejectWith( this, arguments );
+                               };
+                               d = apiPromise
+                                       .then( function ( res ) {
+                                               if ( !res.query ) {
+                                                       return reject( 'query-missing', res );
+                                               }
+                                               // If token type is unknown, it is omitted from the response
+                                               if ( !res.query.tokens[ type + 'token' ] ) {
+                                                       return $.Deferred().reject( 'token-missing', res );
+                                               }
+                                               return res.query.tokens[ type + 'token' ];
+                                       }, reject )
+                                       // Attach abort handler
+                                       .promise( { abort: apiPromise.abort } );
+
+                               // Store deferred now so that we can use it again even if it isn't ready yet
+                               promiseGroup[ type + 'Token' ] = d;
+                       }
+
+                       return d;
+               },
+
+               /**
+                * Indicate that the cached token for a certain action of the API is bad.
+                *
+                * Call this if you get a 'badtoken' error when using the token returned by #getToken.
+                * You may also want to use #postWithToken instead, which invalidates bad cached tokens
+                * automatically.
+                *
+                * @param {string} type Token type
+                * @since 1.26
+                */
+               badToken: function ( type ) {
+                       var promiseGroup = promises[ this.defaults.ajax.url ];
+
+                       type = mapLegacyToken( type );
+                       if ( promiseGroup ) {
+                               delete promiseGroup[ type + 'Token' ];
+                       }
+               }
+       };
+
+       /**
+        * @static
+        * @property {Array}
+        * Very incomplete and outdated list of errors we might receive from the API. Do not use.
+        * @deprecated since 1.29
+        */
+       mw.Api.errors = [
+               // occurs when POST aborted
+               // jQuery 1.4 can't distinguish abort or lost connection from 200 OK + empty result
+               'ok-but-empty',
+
+               // timeout
+               'timeout',
+
+               // really a warning, but we treat it like an error
+               'duplicate',
+               'duplicate-archive',
+
+               // upload succeeded, but no image info.
+               // this is probably impossible, but might as well check for it
+               'noimageinfo',
+               // remote errors, defined in API
+               'uploaddisabled',
+               'nomodule',
+               'mustbeposted',
+               'badaccess-groups',
+               'missingresult',
+               'missingparam',
+               'invalid-file-key',
+               'copyuploaddisabled',
+               'mustbeloggedin',
+               'empty-file',
+               'file-too-large',
+               'filetype-missing',
+               'filetype-banned',
+               'filetype-banned-type',
+               'filename-tooshort',
+               'illegal-filename',
+               'verification-error',
+               'hookaborted',
+               'unknown-error',
+               'internal-error',
+               'overwrite',
+               'badtoken',
+               'fetchfileerror',
+               'fileexists-shared-forbidden',
+               'invalidtitle',
+               'notloggedin',
+               'autoblocked',
+               'blocked',
+
+               // Stash-specific errors - expanded
+               'stashfailed',
+               'stasherror',
+               'stashedfilenotfound',
+               'stashpathinvalid',
+               'stashfilestorage',
+               'stashzerolength',
+               'stashnotloggedin',
+               'stashwrongowner',
+               'stashnosuchfilekey'
+       ];
+       mw.log.deprecate( mw.Api, 'errors', mw.Api.errors, null, 'mw.Api.errors' );
+
+       /**
+        * @static
+        * @property {Array}
+        * Very incomplete and outdated list of warnings we might receive from the API. Do not use.
+        * @deprecated since 1.29
+        */
+       mw.Api.warnings = [
+               'duplicate',
+               'exists'
+       ];
+       mw.log.deprecate( mw.Api, 'warnings', mw.Api.warnings, null, 'mw.Api.warnings' );
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/login.js b/resources/src/mediawiki.api/login.js
new file mode 100644 (file)
index 0000000..2b709aa
--- /dev/null
@@ -0,0 +1,60 @@
+/**
+ * Make the two-step login easier.
+ *
+ * @author Niklas Laxström
+ * @class mw.Api.plugin.login
+ * @since 1.22
+ */
+( function ( mw, $ ) {
+       'use strict';
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * @param {string} username
+                * @param {string} password
+                * @return {jQuery.Promise} See mw.Api#post
+                */
+               login: function ( username, password ) {
+                       var params, apiPromise, innerPromise,
+                               api = this;
+
+                       params = {
+                               action: 'login',
+                               lgname: username,
+                               lgpassword: password
+                       };
+
+                       apiPromise = api.post( params );
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       params.lgtoken = data.login.token;
+                                       innerPromise = api.post( params )
+                                               .then( function ( data ) {
+                                                       var code;
+                                                       if ( data.login.result !== 'Success' ) {
+                                                               // Set proper error code whenever possible
+                                                               code = data.error && data.error.code || 'unknown';
+                                                               return $.Deferred().reject( code, data );
+                                                       }
+                                                       return data;
+                                               } );
+                                       return innerPromise;
+                               } )
+                               .promise( {
+                                       abort: function () {
+                                               apiPromise.abort();
+                                               if ( innerPromise ) {
+                                                       innerPromise.abort();
+                                               }
+                                       }
+                               } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.login
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/messages.js b/resources/src/mediawiki.api/messages.js
new file mode 100644 (file)
index 0000000..688f0b2
--- /dev/null
@@ -0,0 +1,78 @@
+/**
+ * Allows to retrieve a specific or a set of
+ * messages to be added to mw.messages and returned
+ * by the Api.
+ *
+ * @class mw.Api.plugin.messages
+ * @since 1.27
+ */
+( function ( mw, $ ) {
+       'use strict';
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Get a set of messages.
+                *
+                * @param {Array} messages Messages to retrieve
+                * @param {Object} [options] Additional parameters for the API call
+                * @return {jQuery.Promise}
+                */
+               getMessages: function ( messages, options ) {
+                       options = options || {};
+                       return this.get( $.extend( {
+                               action: 'query',
+                               meta: 'allmessages',
+                               ammessages: messages,
+                               amlang: mw.config.get( 'wgUserLanguage' ),
+                               formatversion: 2
+                       }, options ) ).then( function ( data ) {
+                               var result = {};
+
+                               data.query.allmessages.forEach( function ( obj ) {
+                                       if ( !obj.missing ) {
+                                               result[ obj.name ] = obj.content;
+                                       }
+                               } );
+
+                               return result;
+                       } );
+               },
+
+               /**
+                * Loads a set of messages and add them to mw.messages.
+                *
+                * @param {Array} messages Messages to retrieve
+                * @param {Object} [options] Additional parameters for the API call
+                * @return {jQuery.Promise}
+                */
+               loadMessages: function ( messages, options ) {
+                       return this.getMessages( messages, options ).then( $.proxy( mw.messages, 'set' ) );
+               },
+
+               /**
+                * Loads a set of messages and add them to mw.messages. Only messages that are not already known
+                * are loaded. If all messages are known, the returned promise is resolved immediately.
+                *
+                * @param {Array} messages Messages to retrieve
+                * @param {Object} [options] Additional parameters for the API call
+                * @return {jQuery.Promise}
+                */
+               loadMessagesIfMissing: function ( messages, options ) {
+                       var missing = messages.filter( function ( msg ) {
+                               return !mw.message( msg ).exists();
+                       } );
+
+                       if ( missing.length === 0 ) {
+                               return $.Deferred().resolve();
+                       }
+
+                       return this.getMessages( missing, options ).then( $.proxy( mw.messages, 'set' ) );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.messages
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/options.js b/resources/src/mediawiki.api/options.js
new file mode 100644 (file)
index 0000000..4930c4f
--- /dev/null
@@ -0,0 +1,102 @@
+/**
+ * @class mw.Api.plugin.options
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+
+               /**
+                * Asynchronously save the value of a single user option using the API. See #saveOptions.
+                *
+                * @param {string} name
+                * @param {string|null} value
+                * @return {jQuery.Promise}
+                */
+               saveOption: function ( name, value ) {
+                       var param = {};
+                       param[ name ] = value;
+                       return this.saveOptions( param );
+               },
+
+               /**
+                * Asynchronously save the values of user options using the API.
+                *
+                * If a value of `null` is provided, the given option will be reset to the default value.
+                *
+                * Any warnings returned by the API, including warnings about invalid option names or values,
+                * are ignored. However, do not rely on this behavior.
+                *
+                * If necessary, the options will be saved using several sequential API requests. Only one promise
+                * is always returned that will be resolved when all requests complete.
+                *
+                * @param {Object} options Options as a `{ name: value, … }` object
+                * @return {jQuery.Promise}
+                */
+               saveOptions: function ( options ) {
+                       var name, value, bundleable,
+                               grouped = [],
+                               promise = $.Deferred().resolve();
+
+                       for ( name in options ) {
+                               value = options[ name ] === null ? null : String( options[ name ] );
+
+                               // Can we bundle this option, or does it need a separate request?
+                               if ( this.defaults.useUS ) {
+                                       bundleable = name.indexOf( '=' ) === -1;
+                               } else {
+                                       bundleable =
+                                               ( value === null || value.indexOf( '|' ) === -1 ) &&
+                                               ( name.indexOf( '|' ) === -1 && name.indexOf( '=' ) === -1 );
+                               }
+
+                               if ( bundleable ) {
+                                       if ( value !== null ) {
+                                               grouped.push( name + '=' + value );
+                                       } else {
+                                               // Omitting value resets the option
+                                               grouped.push( name );
+                                       }
+                               } else {
+                                       if ( value !== null ) {
+                                               promise = promise.then( function ( name, value ) {
+                                                       return this.postWithToken( 'csrf', {
+                                                               formatversion: 2,
+                                                               action: 'options',
+                                                               optionname: name,
+                                                               optionvalue: value
+                                                       } );
+                                               }.bind( this, name, value ) );
+                                       } else {
+                                               // Omitting value resets the option
+                                               promise = promise.then( function ( name ) {
+                                                       return this.postWithToken( 'csrf', {
+                                                               formatversion: 2,
+                                                               action: 'options',
+                                                               optionname: name
+                                                       } );
+                                               }.bind( this, name ) );
+                                       }
+                               }
+                       }
+
+                       if ( grouped.length ) {
+                               promise = promise.then( function () {
+                                       return this.postWithToken( 'csrf', {
+                                               formatversion: 2,
+                                               action: 'options',
+                                               change: grouped
+                                       } );
+                               }.bind( this ) );
+                       }
+
+                       return promise;
+               }
+
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.options
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/parse.js b/resources/src/mediawiki.api/parse.js
new file mode 100644 (file)
index 0000000..f38e88b
--- /dev/null
@@ -0,0 +1,49 @@
+/**
+ * @class mw.Api.plugin.parse
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Convenience method for 'action=parse'.
+                *
+                * @param {string|mw.Title} content Content to parse, either as a wikitext string or
+                *   a mw.Title.
+                * @param {Object} additionalParams Parameters object to set custom settings, e.g.
+                *   redirects, sectionpreview.  prop should not be overridden.
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {string} return.done.data Parsed HTML of `wikitext`.
+                */
+               parse: function ( content, additionalParams ) {
+                       var apiPromise,
+                               config = $.extend( {
+                                       formatversion: 2,
+                                       action: 'parse',
+                                       contentmodel: 'wikitext'
+                               }, additionalParams );
+
+                       if ( mw.Title && content instanceof mw.Title ) {
+                               // Parse existing page
+                               config.page = content.getPrefixedDb();
+                       } else {
+                               // Parse wikitext from input
+                               config.text = String( content );
+                       }
+
+                       apiPromise = this.get( config );
+
+                       return apiPromise
+                               .then( function ( data ) {
+                                       return data.parse.text;
+                               } )
+                               .promise( { abort: apiPromise.abort } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.parse
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/rollback.js b/resources/src/mediawiki.api/rollback.js
new file mode 100644 (file)
index 0000000..322143d
--- /dev/null
@@ -0,0 +1,33 @@
+/**
+ * @class mw.Api.plugin.rollback
+ * @since 1.28
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Convenience method for `action=rollback`.
+                *
+                * @param {string|mw.Title} page
+                * @param {string} user
+                * @param {Object} [params] Additional parameters
+                * @return {jQuery.Promise}
+                */
+               rollback: function ( page, user, params ) {
+                       return this.postWithToken( 'rollback', $.extend( {
+                               action: 'rollback',
+                               title: String( page ),
+                               user: user,
+                               uselang: mw.config.get( 'wgUserLanguage' )
+                       }, params ) ).then( function ( data ) {
+                               return data.rollback;
+                       } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.rollback
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/upload.js b/resources/src/mediawiki.api/upload.js
new file mode 100644 (file)
index 0000000..29bd59a
--- /dev/null
@@ -0,0 +1,668 @@
+/**
+ * Provides an interface for uploading files to MediaWiki.
+ *
+ * @class mw.Api.plugin.upload
+ * @singleton
+ */
+( function ( mw, $ ) {
+       var nonce = 0,
+               fieldsAllowed = {
+                       stash: true,
+                       filekey: true,
+                       filename: true,
+                       comment: true,
+                       text: true,
+                       watchlist: true,
+                       ignorewarnings: true,
+                       chunk: true,
+                       offset: true,
+                       filesize: true,
+                       async: true
+               };
+
+       /**
+        * Get nonce for iframe IDs on the page.
+        *
+        * @private
+        * @return {number}
+        */
+       function getNonce() {
+               return nonce++;
+       }
+
+       /**
+        * Given a non-empty object, return one of its keys.
+        *
+        * @private
+        * @param {Object} obj
+        * @return {string}
+        */
+       function getFirstKey( obj ) {
+               var key;
+               for ( key in obj ) {
+                       if ( obj.hasOwnProperty( key ) ) {
+                               return key;
+                       }
+               }
+       }
+
+       /**
+        * Get new iframe object for an upload.
+        *
+        * @private
+        * @param {string} id
+        * @return {HTMLIframeElement}
+        */
+       function getNewIframe( id ) {
+               var frame = document.createElement( 'iframe' );
+               frame.id = id;
+               frame.name = id;
+               return frame;
+       }
+
+       /**
+        * Shortcut for getting hidden inputs
+        *
+        * @private
+        * @param {string} name
+        * @param {string} val
+        * @return {jQuery}
+        */
+       function getHiddenInput( name, val ) {
+               return $( '<input>' ).attr( 'type', 'hidden' )
+                       .attr( 'name', name )
+                       .val( val );
+       }
+
+       /**
+        * Process the result of the form submission, returned to an iframe.
+        * This is the iframe's onload event.
+        *
+        * @param {HTMLIframeElement} iframe Iframe to extract result from
+        * @return {Object} Response from the server. The return value may or may
+        *   not be an XMLDocument, this code was copied from elsewhere, so if you
+        *   see an unexpected return type, please file a bug.
+        */
+       function processIframeResult( iframe ) {
+               var json,
+                       doc = iframe.contentDocument || frames[ iframe.id ].document;
+
+               if ( doc.XMLDocument ) {
+                       // The response is a document property in IE
+                       return doc.XMLDocument;
+               }
+
+               if ( doc.body ) {
+                       // Get the json string
+                       // We're actually searching through an HTML doc here --
+                       // according to mdale we need to do this
+                       // because IE does not load JSON properly in an iframe
+                       json = $( doc.body ).find( 'pre' ).text();
+
+                       return JSON.parse( json );
+               }
+
+               // Response is a xml document
+               return doc;
+       }
+
+       function formDataAvailable() {
+               return window.FormData !== undefined &&
+                       window.File !== undefined &&
+                       window.File.prototype.slice !== undefined;
+       }
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Upload a file to MediaWiki.
+                *
+                * The file will be uploaded using AJAX and FormData, if the browser supports it, or via an
+                * iframe if it doesn't.
+                *
+                * Caveats of iframe upload:
+                * - The returned jQuery.Promise will not receive `progress` notifications during the upload
+                * - It is incompatible with uploads to a foreign wiki using mw.ForeignApi
+                * - You must pass a HTMLInputElement and not a File for it to be possible
+                *
+                * @param {HTMLInputElement|File|Blob} file HTML input type=file element with a file already inside
+                *  of it, or a File object.
+                * @param {Object} data Other upload options, see action=upload API docs for more
+                * @return {jQuery.Promise}
+                */
+               upload: function ( file, data ) {
+                       var isFileInput, canUseFormData;
+
+                       isFileInput = file && file.nodeType === Node.ELEMENT_NODE;
+
+                       if ( formDataAvailable() && isFileInput && file.files ) {
+                               file = file.files[ 0 ];
+                       }
+
+                       if ( !file ) {
+                               throw new Error( 'No file' );
+                       }
+
+                       // Blobs are allowed in formdata uploads, it turns out
+                       canUseFormData = formDataAvailable() && ( file instanceof window.File || file instanceof window.Blob );
+
+                       if ( !isFileInput && !canUseFormData ) {
+                               throw new Error( 'Unsupported argument type passed to mw.Api.upload' );
+                       }
+
+                       if ( canUseFormData ) {
+                               return this.uploadWithFormData( file, data );
+                       }
+
+                       return this.uploadWithIframe( file, data );
+               },
+
+               /**
+                * Upload a file to MediaWiki with an iframe and a form.
+                *
+                * This method is necessary for browsers without the File/FormData
+                * APIs, and continues to work in browsers with those APIs.
+                *
+                * The rough sketch of how this method works is as follows:
+                * 1. An iframe is loaded with no content.
+                * 2. A form is submitted with the passed-in file input and some extras.
+                * 3. The MediaWiki API receives that form data, and sends back a response.
+                * 4. The response is sent to the iframe, because we set target=(iframe id)
+                * 5. The response is parsed out of the iframe's document, and passed back
+                *    through the promise.
+                *
+                * @private
+                * @param {HTMLInputElement} file The file input with a file in it.
+                * @param {Object} data Other upload options, see action=upload API docs for more
+                * @return {jQuery.Promise}
+                */
+               uploadWithIframe: function ( file, data ) {
+                       var key,
+                               tokenPromise = $.Deferred(),
+                               api = this,
+                               deferred = $.Deferred(),
+                               nonce = getNonce(),
+                               id = 'uploadframe-' + nonce,
+                               $form = $( '<form>' ),
+                               iframe = getNewIframe( id ),
+                               $iframe = $( iframe );
+
+                       for ( key in data ) {
+                               if ( !fieldsAllowed[ key ] ) {
+                                       delete data[ key ];
+                               }
+                       }
+
+                       data = $.extend( {}, this.defaults.parameters, { action: 'upload' }, data );
+                       $form.addClass( 'mw-api-upload-form' );
+
+                       $form.css( 'display', 'none' )
+                               .attr( {
+                                       action: this.defaults.ajax.url,
+                                       method: 'POST',
+                                       target: id,
+                                       enctype: 'multipart/form-data'
+                               } );
+
+                       $iframe.one( 'load', function () {
+                               $iframe.one( 'load', function () {
+                                       var result = processIframeResult( iframe );
+                                       deferred.notify( 1 );
+
+                                       if ( !result ) {
+                                               deferred.reject( 'ok-but-empty', 'No response from API on upload attempt.' );
+                                       } else if ( result.error ) {
+                                               if ( result.error.code === 'badtoken' ) {
+                                                       api.badToken( 'csrf' );
+                                               }
+
+                                               deferred.reject( result.error.code, result );
+                                       } else if ( result.upload && result.upload.warnings ) {
+                                               deferred.reject( getFirstKey( result.upload.warnings ), result );
+                                       } else {
+                                               deferred.resolve( result );
+                                       }
+                               } );
+                               tokenPromise.done( function () {
+                                       $form.submit();
+                               } );
+                       } );
+
+                       $iframe.on( 'error', function ( error ) {
+                               deferred.reject( 'http', error );
+                       } );
+
+                       $iframe.prop( 'src', 'about:blank' ).hide();
+
+                       file.name = 'file';
+
+                       $.each( data, function ( key, val ) {
+                               $form.append( getHiddenInput( key, val ) );
+                       } );
+
+                       if ( !data.filename && !data.stash ) {
+                               throw new Error( 'Filename not included in file data.' );
+                       }
+
+                       if ( this.needToken() ) {
+                               this.getEditToken().then( function ( token ) {
+                                       $form.append( getHiddenInput( 'token', token ) );
+                                       tokenPromise.resolve();
+                               }, tokenPromise.reject );
+                       } else {
+                               tokenPromise.resolve();
+                       }
+
+                       $( 'body' ).append( $form, $iframe );
+
+                       deferred.always( function () {
+                               $form.remove();
+                               $iframe.remove();
+                       } );
+
+                       return deferred.promise();
+               },
+
+               /**
+                * Uploads a file using the FormData API.
+                *
+                * @private
+                * @param {File} file
+                * @param {Object} data Other upload options, see action=upload API docs for more
+                * @return {jQuery.Promise}
+                */
+               uploadWithFormData: function ( file, data ) {
+                       var key, request,
+                               deferred = $.Deferred();
+
+                       for ( key in data ) {
+                               if ( !fieldsAllowed[ key ] ) {
+                                       delete data[ key ];
+                               }
+                       }
+
+                       data = $.extend( {}, this.defaults.parameters, { action: 'upload' }, data );
+                       if ( !data.chunk ) {
+                               data.file = file;
+                       }
+
+                       if ( !data.filename && !data.stash ) {
+                               throw new Error( 'Filename not included in file data.' );
+                       }
+
+                       // Use this.postWithEditToken() or this.post()
+                       request = this[ this.needToken() ? 'postWithEditToken' : 'post' ]( data, {
+                               // Use FormData (if we got here, we know that it's available)
+                               contentType: 'multipart/form-data',
+                               // No timeout (default from mw.Api is 30 seconds)
+                               timeout: 0,
+                               // Provide upload progress notifications
+                               xhr: function () {
+                                       var xhr = $.ajaxSettings.xhr();
+                                       if ( xhr.upload ) {
+                                               // need to bind this event before we open the connection (see note at
+                                               // https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Using_XMLHttpRequest#Monitoring_progress)
+                                               xhr.upload.addEventListener( 'progress', function ( ev ) {
+                                                       if ( ev.lengthComputable ) {
+                                                               deferred.notify( ev.loaded / ev.total );
+                                                       }
+                                               } );
+                                       }
+                                       return xhr;
+                               }
+                       } )
+                               .done( function ( result ) {
+                                       deferred.notify( 1 );
+                                       if ( result.upload && result.upload.warnings ) {
+                                               deferred.reject( getFirstKey( result.upload.warnings ), result );
+                                       } else {
+                                               deferred.resolve( result );
+                                       }
+                               } )
+                               .fail( function ( errorCode, result ) {
+                                       deferred.notify( 1 );
+                                       deferred.reject( errorCode, result );
+                               } );
+
+                       return deferred.promise( { abort: request.abort } );
+               },
+
+               /**
+                * Upload a file in several chunks.
+                *
+                * @param {File} file
+                * @param {Object} data Other upload options, see action=upload API docs for more
+                * @param {number} [chunkSize] Size (in bytes) per chunk (default: 5MB)
+                * @param {number} [chunkRetries] Amount of times to retry a failed chunk (default: 1)
+                * @return {jQuery.Promise}
+                */
+               chunkedUpload: function ( file, data, chunkSize, chunkRetries ) {
+                       var start, end, promise, next, active,
+                               deferred = $.Deferred();
+
+                       chunkSize = chunkSize === undefined ? 5 * 1024 * 1024 : chunkSize;
+                       chunkRetries = chunkRetries === undefined ? 1 : chunkRetries;
+
+                       if ( !data.filename ) {
+                               throw new Error( 'Filename not included in file data.' );
+                       }
+
+                       // Submit first chunk to get the filekey
+                       active = promise = this.uploadChunk( file, data, 0, chunkSize, '', chunkRetries )
+                               .done( chunkSize >= file.size ? deferred.resolve : null )
+                               .fail( deferred.reject )
+                               .progress( deferred.notify );
+
+                       // Now iteratively submit the rest of the chunks
+                       for ( start = chunkSize; start < file.size; start += chunkSize ) {
+                               end = Math.min( start + chunkSize, file.size );
+                               next = $.Deferred();
+
+                               // We could simply chain one this.uploadChunk after another with
+                               // .then(), but then we'd hit an `Uncaught RangeError: Maximum
+                               // call stack size exceeded` at as low as 1024 calls in Firefox
+                               // 47. This'll work around it, but comes with the drawback of
+                               // having to properly relay the results to the returned promise.
+                               // eslint-disable-next-line no-loop-func
+                               promise.done( function ( start, end, next, result ) {
+                                       var filekey = result.upload.filekey;
+                                       active = this.uploadChunk( file, data, start, end, filekey, chunkRetries )
+                                               .done( end === file.size ? deferred.resolve : next.resolve )
+                                               .fail( deferred.reject )
+                                               .progress( deferred.notify );
+                               // start, end & next must be bound to closure, or they'd have
+                               // changed by the time the promises are resolved
+                               }.bind( this, start, end, next ) );
+
+                               promise = next;
+                       }
+
+                       return deferred.promise( { abort: active.abort } );
+               },
+
+               /**
+                * Uploads 1 chunk.
+                *
+                * @private
+                * @param {File} file
+                * @param {Object} data Other upload options, see action=upload API docs for more
+                * @param {number} start Chunk start position
+                * @param {number} end Chunk end position
+                * @param {string} [filekey] File key, for follow-up chunks
+                * @param {number} [retries] Amount of times to retry request
+                * @return {jQuery.Promise}
+                */
+               uploadChunk: function ( file, data, start, end, filekey, retries ) {
+                       var upload,
+                               api = this,
+                               chunk = this.slice( file, start, end );
+
+                       // When uploading in chunks, we're going to be issuing a lot more
+                       // requests and there's always a chance of 1 getting dropped.
+                       // In such case, it could be useful to try again: a network hickup
+                       // doesn't necessarily have to result in upload failure...
+                       retries = retries === undefined ? 1 : retries;
+
+                       data.filesize = file.size;
+                       data.chunk = chunk;
+                       data.offset = start;
+
+                       // filekey must only be added when uploading follow-up chunks; the
+                       // first chunk should never have a filekey (it'll be generated)
+                       if ( filekey && start !== 0 ) {
+                               data.filekey = filekey;
+                       }
+
+                       upload = this.uploadWithFormData( file, data );
+                       return upload.then(
+                               null,
+                               function ( code, result ) {
+                                       var retry;
+
+                                       // uploadWithFormData will reject uploads with warnings, but
+                                       // these warnings could be "harmless" or recovered from
+                                       // (e.g. exists-normalized, when it'll be renamed later)
+                                       // In the case of (only) a warning, we still want to
+                                       // continue the chunked upload until it completes: then
+                                       // reject it - at least it's been fully uploaded by then and
+                                       // failure handlers have a complete result object (including
+                                       // possibly more warnings, e.g. duplicate)
+                                       // This matches .upload, which also completes the upload.
+                                       if ( result.upload && result.upload.warnings && code in result.upload.warnings ) {
+                                               if ( end === file.size ) {
+                                                       // uploaded last chunk = reject with result data
+                                                       return $.Deferred().reject( code, result );
+                                               } else {
+                                                       // still uploading chunks = resolve to keep going
+                                                       return $.Deferred().resolve( result );
+                                               }
+                                       }
+
+                                       if ( retries === 0 ) {
+                                               return $.Deferred().reject( code, result );
+                                       }
+
+                                       // If the call flat out failed, we may want to try again...
+                                       retry = api.uploadChunk.bind( this, file, data, start, end, filekey, retries - 1 );
+                                       return api.retry( code, result, retry );
+                               },
+                               function ( fraction ) {
+                                       // Since we're only uploading small parts of a file, we
+                                       // need to adjust the reported progress to reflect where
+                                       // we actually are in the combined upload
+                                       return ( start + fraction * ( end - start ) ) / file.size;
+                               }
+                       ).promise( { abort: upload.abort } );
+               },
+
+               /**
+                * Launch the upload anew if it failed because of network issues.
+                *
+                * @private
+                * @param {string} code Error code
+                * @param {Object} result API result
+                * @param {Function} callable
+                * @return {jQuery.Promise}
+                */
+               retry: function ( code, result, callable ) {
+                       var uploadPromise,
+                               retryTimer,
+                               deferred = $.Deferred(),
+                               // Wrap around the callable, so that once it completes, it'll
+                               // resolve/reject the promise we'll return
+                               retry = function () {
+                                       uploadPromise = callable();
+                                       uploadPromise.then( deferred.resolve, deferred.reject );
+                               };
+
+                       // Don't retry if the request failed because we aborted it (or if
+                       // it's another kind of request failure)
+                       if ( code !== 'http' || result.textStatus === 'abort' ) {
+                               return deferred.reject( code, result );
+                       }
+
+                       retryTimer = setTimeout( retry, 1000 );
+                       return deferred.promise( { abort: function () {
+                               // Clear the scheduled upload, or abort if already in flight
+                               if ( retryTimer ) {
+                                       clearTimeout( retryTimer );
+                               }
+                               if ( uploadPromise.abort ) {
+                                       uploadPromise.abort();
+                               }
+                       } } );
+               },
+
+               /**
+                * Slice a chunk out of a File object.
+                *
+                * @private
+                * @param {File} file
+                * @param {number} start
+                * @param {number} stop
+                * @return {Blob}
+                */
+               slice: function ( file, start, stop ) {
+                       if ( file.mozSlice ) {
+                               // FF <= 12
+                               return file.mozSlice( start, stop, file.type );
+                       } else if ( file.webkitSlice ) {
+                               // Chrome <= 20
+                               return file.webkitSlice( start, stop, file.type );
+                       } else {
+                               // On really old browser versions (before slice was prefixed),
+                               // slice() would take (start, length) instead of (start, end)
+                               // We'll ignore that here...
+                               return file.slice( start, stop, file.type );
+                       }
+               },
+
+               /**
+                * This function will handle how uploads to stash (via uploadToStash or
+                * chunkedUploadToStash) are resolved/rejected.
+                *
+                * After a successful stash, it'll resolve with a callback which, when
+                * called, will finalize the upload in stash (with the given data, or
+                * with additional/conflicting data)
+                *
+                * A failed stash can still be recovered from as long as 'filekey' is
+                * present. In that case, it'll also resolve with the callback to
+                * finalize the upload (all warnings are then ignored.)
+                * Otherwise, it'll just reject as you'd expect, with code & result.
+                *
+                * @private
+                * @param {jQuery.Promise} uploadPromise
+                * @param {Object} data
+                * @return {jQuery.Promise}
+                * @return {Function} return.finishUpload Call this function to finish the upload.
+                * @return {Object} return.finishUpload.data Additional data for the upload.
+                * @return {jQuery.Promise} return.finishUpload.return API promise for the final upload
+                * @return {Object} return.finishUpload.return.data API return value for the final upload
+                */
+               finishUploadToStash: function ( uploadPromise, data ) {
+                       var filekey,
+                               api = this;
+
+                       function finishUpload( moreData ) {
+                               return api.uploadFromStash( filekey, $.extend( data, moreData ) );
+                       }
+
+                       return uploadPromise.then(
+                               function ( result ) {
+                                       filekey = result.upload.filekey;
+                                       return finishUpload;
+                               },
+                               function ( errorCode, result ) {
+                                       if ( result && result.upload && result.upload.filekey ) {
+                                               // Ignore any warnings if 'filekey' was returned, that's all we care about
+                                               filekey = result.upload.filekey;
+                                               return $.Deferred().resolve( finishUpload );
+                                       }
+                                       return $.Deferred().reject( errorCode, result );
+                               }
+                       );
+               },
+
+               /**
+                * Upload a file to the stash.
+                *
+                * This function will return a promise, which when resolved, will pass back a function
+                * to finish the stash upload. You can call that function with an argument containing
+                * more, or conflicting, data to pass to the server. For example:
+                *
+                *     // upload a file to the stash with a placeholder filename
+                *     api.uploadToStash( file, { filename: 'testing.png' } ).done( function ( finish ) {
+                *         // finish is now the function we can use to finalize the upload
+                *         // pass it a new filename from user input to override the initial value
+                *         finish( { filename: getFilenameFromUser() } ).done( function ( data ) {
+                *             // the upload is complete, data holds the API response
+                *         } );
+                *     } );
+                *
+                * @param {File|HTMLInputElement} file
+                * @param {Object} [data]
+                * @return {jQuery.Promise}
+                * @return {Function} return.finishUpload Call this function to finish the upload.
+                * @return {Object} return.finishUpload.data Additional data for the upload.
+                * @return {jQuery.Promise} return.finishUpload.return API promise for the final upload
+                * @return {Object} return.finishUpload.return.data API return value for the final upload
+                */
+               uploadToStash: function ( file, data ) {
+                       var promise;
+
+                       if ( !data.filename ) {
+                               throw new Error( 'Filename not included in file data.' );
+                       }
+
+                       promise = this.upload( file, { stash: true, filename: data.filename } );
+
+                       return this.finishUploadToStash( promise, data );
+               },
+
+               /**
+                * Upload a file to the stash, in chunks.
+                *
+                * This function will return a promise, which when resolved, will pass back a function
+                * to finish the stash upload.
+                *
+                * @see #method-uploadToStash
+                * @param {File|HTMLInputElement} file
+                * @param {Object} [data]
+                * @param {number} [chunkSize] Size (in bytes) per chunk (default: 5MB)
+                * @param {number} [chunkRetries] Amount of times to retry a failed chunk (default: 1)
+                * @return {jQuery.Promise}
+                * @return {Function} return.finishUpload Call this function to finish the upload.
+                * @return {Object} return.finishUpload.data Additional data for the upload.
+                * @return {jQuery.Promise} return.finishUpload.return API promise for the final upload
+                * @return {Object} return.finishUpload.return.data API return value for the final upload
+                */
+               chunkedUploadToStash: function ( file, data, chunkSize, chunkRetries ) {
+                       var promise;
+
+                       if ( !data.filename ) {
+                               throw new Error( 'Filename not included in file data.' );
+                       }
+
+                       promise = this.chunkedUpload(
+                               file,
+                               { stash: true, filename: data.filename },
+                               chunkSize,
+                               chunkRetries
+                       );
+
+                       return this.finishUploadToStash( promise, data );
+               },
+
+               /**
+                * Finish an upload in the stash.
+                *
+                * @param {string} filekey
+                * @param {Object} data
+                * @return {jQuery.Promise}
+                */
+               uploadFromStash: function ( filekey, data ) {
+                       data.filekey = filekey;
+                       data.action = 'upload';
+                       data.format = 'json';
+
+                       if ( !data.filename ) {
+                               throw new Error( 'Filename not included in file data.' );
+                       }
+
+                       return this.postWithEditToken( data ).then( function ( result ) {
+                               if ( result.upload && result.upload.warnings ) {
+                                       return $.Deferred().reject( getFirstKey( result.upload.warnings ), result ).promise();
+                               }
+                               return result;
+                       } );
+               },
+
+               needToken: function () {
+                       return true;
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.upload
+        */
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/user.js b/resources/src/mediawiki.api/user.js
new file mode 100644 (file)
index 0000000..e7b4b6d
--- /dev/null
@@ -0,0 +1,37 @@
+/**
+ * @class mw.Api.plugin.user
+ * @since 1.27
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+
+               /**
+                * Get the current user's groups and rights.
+                *
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {Object} return.done.userInfo
+                * @return {string[]} return.done.userInfo.groups User groups that the current user belongs to
+                * @return {string[]} return.done.userInfo.rights Current user's rights
+                */
+               getUserInfo: function () {
+                       return this.get( {
+                               action: 'query',
+                               meta: 'userinfo',
+                               uiprop: [ 'groups', 'rights' ]
+                       } ).then( function ( data ) {
+                               if ( data.query && data.query.userinfo ) {
+                                       return data.query.userinfo;
+                               }
+                               return $.Deferred().reject().promise();
+                       } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.user
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.api/watch.js b/resources/src/mediawiki.api/watch.js
new file mode 100644 (file)
index 0000000..025c111
--- /dev/null
@@ -0,0 +1,70 @@
+/**
+ * @class mw.Api.plugin.watch
+ * @since 1.19
+ */
+( function ( mw, $ ) {
+
+       /**
+        * @private
+        * @static
+        * @context mw.Api
+        *
+        * @param {string|mw.Title|string[]|mw.Title[]} pages Full page name or instance of mw.Title, or an
+        *  array thereof. If an array is passed, the return value passed to the promise will also be an
+        *  array of appropriate objects.
+        * @param {Object} [addParams]
+        * @return {jQuery.Promise}
+        * @return {Function} return.done
+        * @return {Object|Object[]} return.done.watch Object or list of objects (depends on the `pages`
+        *  parameter)
+        * @return {string} return.done.watch.title Full pagename
+        * @return {boolean} return.done.watch.watched Whether the page is now watched or unwatched
+        */
+       function doWatchInternal( pages, addParams ) {
+               // XXX: Parameter addParams is undocumented because we inherit this
+               // documentation in the public method...
+               var apiPromise = this.postWithToken( 'watch',
+                       $.extend(
+                               {
+                                       formatversion: 2,
+                                       action: 'watch',
+                                       titles: Array.isArray( pages ) ? pages : String( pages )
+                               },
+                               addParams
+                       )
+               );
+
+               return apiPromise
+                       .then( function ( data ) {
+                               // If a single page was given (not an array) respond with a single item as well.
+                               return Array.isArray( pages ) ? data.watch : data.watch[ 0 ];
+                       } )
+                       .promise( { abort: apiPromise.abort } );
+       }
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Convenience method for `action=watch`.
+                *
+                * @inheritdoc #doWatchInternal
+                */
+               watch: function ( pages ) {
+                       return doWatchInternal.call( this, pages );
+               },
+
+               /**
+                * Convenience method for `action=watch&unwatch=1`.
+                *
+                * @inheritdoc #doWatchInternal
+                */
+               unwatch: function ( pages ) {
+                       return doWatchInternal.call( this, pages, { unwatch: 1 } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.watch
+        */
+
+}( mediaWiki, jQuery ) );
index d82ffe0..5afa51d 100644 (file)
@@ -16,7 +16,7 @@
        background-image: -webkit-linear-gradient( transparent, transparent ), url( images/external-ltr.svg );
        /* @embed */
        background-image: linear-gradient( transparent, transparent ), url( images/external-ltr.svg );
-       padding-right: 15px;
+       padding-right: 13px;
 }
 
 .mw-parser-output a.external[ href^='mailto:' ],
@@ -24,7 +24,7 @@
        background: url( images/mail.png ) center right no-repeat;
        /* @embed */
        background-image: linear-gradient( transparent, transparent ), url( images/mail.svg );
-       padding-right: 15px;
+       padding-right: 13px;
 }
 
 .mw-parser-output a.external[ href^='ftp://' ],
@@ -32,7 +32,7 @@
        background: url( images/ftp-ltr.png ) center right no-repeat;
        /* @embed */
        background-image: linear-gradient( transparent, transparent ), url( images/ftp-ltr.svg );
-       padding-right: 15px;
+       padding-right: 13px;
 }
 
 .mw-parser-output a.external[ href^='irc://' ],
@@ -41,7 +41,7 @@
        background: url( images/chat-ltr.png ) center right no-repeat;
        /* @embed */
        background-image: linear-gradient( transparent, transparent ), url( images/chat-ltr.svg );
-       padding-right: 15px;
+       padding-right: 13px;
 }
 
 .mw-parser-output a.external[ href$='.ogg' ],
@@ -60,7 +60,7 @@
        background: url( images/audio-ltr.png ) center right no-repeat;
        /* @embed */
        background-image: linear-gradient( transparent, transparent ), url( images/audio-ltr.svg );
-       padding-right: 15px;
+       padding-right: 13px;
 }
 
 .mw-parser-output a.external[ href$='.ogm' ],
@@ -75,7 +75,7 @@
        background: url( images/video.png ) center right no-repeat;
        /* @embed */
        background-image: linear-gradient( transparent, transparent ), url( images/video.svg );
-       padding-right: 15px;
+       padding-right: 13px;
 }
 
 .mw-parser-output a.external[ href$='.pdf' ],
@@ -88,7 +88,7 @@
        background: url( images/document-ltr.png ) center right no-repeat;
        /* @embed */
        background-image: linear-gradient( transparent, transparent ), url( images/document-ltr.svg );
-       padding-right: 15px;
+       padding-right: 13px;
 }
 
 /* Interwiki styling */
index c948ff0..40c9df9 100644 (file)
@@ -56,6 +56,7 @@
                } );
                wrapper.$element.append( tabs.$element );
                $preferences.prepend( wrapper.$element );
+               $( '.mw-prefs-faketabs' ).remove();
 
                function updateHash( panel ) {
                        var scrollTop, active;
index 8810318..a72186b 100644 (file)
        transform: none;
 }
 
-#preferences .oo-ui-panelLayout-framed .oo-ui-panelLayout-framed {
-       border-color: #c8ccd1;
-       border-width: 1px 0 0;
+#preferences .oo-ui-menuLayout .oo-ui-panelLayout-framed .oo-ui-panelLayout-framed {
+       border-width: 0;
        border-radius: 0;
+       box-shadow: none;
        padding-left: 0;
        padding-right: 0;
+}
+
+.mw-prefs-faketabs > .oo-ui-menuLayout > .oo-ui-menuLayout-menu a {
+       color: inherit;
+       text-decoration: none;
+}
+
+/* Adjust the borders when JS is disabled: frame each prefsection instead of the
+ * whole tabLayout wrapper */
+.client-nojs #preferences .oo-ui-menuLayout .oo-ui-panelLayout-framed .oo-ui-panelLayout-framed {
+       border-color: #c8ccd1;
+       border-width: 1px 0 0;
+}
+
+.client-nojs .mw-prefs-faketabs {
+       border-width: 0;
+       border-radius: 0;
        box-shadow: none;
 }
 
-/* Tweak the margins to reduce the shifting of form contents
- * after JS code loads and rearranges the page */
-.client-js #preferences > .oo-ui-panelLayout {
-       margin: 1em 0;
+.client-nojs .mw-prefs-faketabs > .oo-ui-menuLayout > .oo-ui-menuLayout-content > .oo-ui-stackLayout {
+       margin-bottom: 1em;
 }
 
-.client-js #preferences .oo-ui-panelLayout-framed .oo-ui-panelLayout-framed {
-       margin-left: 0.25em;
+/* Hide the tab menu when JS is disabled as we can't use this feature */
+.client-nojs .mw-prefs-faketabs > .oo-ui-menuLayout > .oo-ui-menuLayout-menu {
+       display: none;
+}
+
+.client-nojs #preferences .oo-ui-panelLayout-framed .oo-ui-panelLayout-framed:last-child {
+       padding-bottom: 0;
+       margin-bottom: 0;
+}
+
+/* Hide top level legends when JS is enabled, as they will not be visible
+ * when the real tabLayout is built */
+.client-js #preferences .oo-ui-tabPanelLayout > fieldset > legend {
+       display: none;
 }
 
 .client-js #preferences .oo-ui-tabPanelLayout {
        padding-top: 0.5em;
-       padding-bottom: 0.5em;
 }
 
-.client-js #preferences .oo-ui-tabPanelLayout .oo-ui-panelLayout-framed {
+.client-js #preferences .oo-ui-panelLayout-framed .oo-ui-panelLayout-framed {
        margin-left: 0;
        margin-bottom: 0;
-       border: 0;
-       padding-top: 0;
+       padding: 0;
+       border-width: 0;
+       border-radius: 0;
+       box-shadow: none;
 }
 
 .client-js #preferences > .oo-ui-panelLayout > .oo-ui-fieldsetLayout > .oo-ui-fieldsetLayout-header {
index 0676bfc..0404c45 100644 (file)
        color: #72777d;
        font-size: 90%;
 }
+
+/* Special:PasswordPolicies */
+.mw-passwordpolicies-table tr {
+       vertical-align: top;
+}
index 486fb80..9837ce8 100644 (file)
         * @member mw.hook
         */
        $( function () {
-               var loading, modules;
-
-               modules = mw.loader.getModuleNames().filter( function ( module ) {
+               // Get a list of modules currently in loading state
+               var modules = mw.loader.getModuleNames().filter( function ( module ) {
                        return mw.loader.getState( module ) === 'loading';
                } );
-               // We only need a callback, not any actual module. First try a single using()
-               // for all loading modules. If one fails, fall back to tracking each module
-               // separately via $.when(), this is expensive.
-               loading = mw.loader.using( modules ).catch( function () {
-                       var all = modules.map( function ( module ) {
-                               return mw.loader.using( module ).catch( function () {
-                                       return $.Deferred().resolve();
-                               } );
+               // Wait for them to complete loading (regardles of failures). First, try a single
+               // mw.loader.using() call. That's efficient, but has the drawback of being rejected
+               // upon first failure. Fall back to tracking each module separately. We usually avoid
+               // that because of high overhead for that internally to mw.loader.
+               mw.loader.using( modules ).catch( function () {
+                       return $.Deferred( function ( deferred ) {
+                               var i, count = modules.length;
+                               function decrement() {
+                                       count--;
+                                       if ( count === 0 ) {
+                                               deferred.resolve();
+                                       }
+                               }
+                               for ( i = 0; i < modules.length; i++ ) {
+                                       mw.loader.using( modules[ i ] ).always( decrement );
+                               }
                        } );
-                       return $.when.apply( $, all );
-               } );
-               loading.then( function () {
+               } ).then( function () {
                        if ( window.performance && performance.mark ) {
                                performance.mark( 'mwLoadEnd' );
                        }
index 05afefa..d17fbbe 100644 (file)
@@ -28805,7 +28805,7 @@ foo {{echo|<span>bar</span> [[Category:baz]]}} bar
 # of the categories in wikitext
 # Do not remove these characters in edits.
 #
-# As part of the serialization, these bidi characters will get stripped.
+# As part of the serialization, these Unicode directional formatting characters will get stripped.
 !! test
 RTL (\u200f) and LTR (\u200e) markers around category tags should be stripped
 !! options
@@ -30811,3 +30811,27 @@ header
 *foo
 footer
 !! end
+
+!! test
+Check soft hyphens as entities (&shy;) in displaytitle (T66528)
+!! options
+showtitle
+title=[[Lopadotemachoselachogaleokranioleipsanodrimhypotrimmatosilphioparaomelitokatakechymenokichlepikossyphophattoperisteralektryonoptekephalliokigklopeleiolagoiosiraiobaphetraganopterygon]]
+!! wikitext
+{{DISPLAYTITLE:Lopado&shy;temacho&shy;selacho&shy;galeo&shy;kranio&shy;leipsano&shy;drim&shy;hypo&shy;trimmato&shy;silphio&shy;parao&shy;melito&shy;katakechy&shy;meno&shy;kichl&shy;epi&shy;kossypho&shy;phatto&shy;perister&shy;alektryon&shy;opte&shy;kephallio&shy;kigklo&shy;peleio&shy;lagoio&shy;siraio&shy;baphe&shy;tragano&shy;pterygon}}
+!! html/php
+Lopado&#173;temacho&#173;selacho&#173;galeo&#173;kranio&#173;leipsano&#173;drim&#173;hypo&#173;trimmato&#173;silphio&#173;parao&#173;melito&#173;katakechy&#173;meno&#173;kichl&#173;epi&#173;kossypho&#173;phatto&#173;perister&#173;alektryon&#173;opte&#173;kephallio&#173;kigklo&#173;peleio&#173;lagoio&#173;siraio&#173;baphe&#173;tragano&#173;pterygon
+
+!! end
+
+!! test
+Check soft hyphens as Unicode characters (U+00AD) in displaytitle (T66528)
+!! options
+showtitle
+title=[[Lopadotemachoselachogaleokranioleipsanodrimhypotrimmatosilphioparaomelitokatakechymenokichlepikossyphophattoperisteralektryonoptekephalliokigklopeleiolagoiosiraiobaphetraganopterygon]]
+!! wikitext
+{{DISPLAYTITLE:Lopado­temacho­selacho­galeo­kranio­leipsano­drim­hypo­trimmato­silphio­parao­melito­katakechy­meno­kichl­epi­kossypho­phatto­perister­alektryon­opte­kephallio­kigklo­peleio­lagoio­siraio­baphe­tragano­pterygon}}
+!! html/php
+Lopado­temacho­selacho­galeo­kranio­leipsano­drim­hypo­trimmato­silphio­parao­melito­katakechy­meno­kichl­epi­kossypho­phatto­perister­alektryon­opte­kephallio­kigklo­peleio­lagoio­siraio­baphe­tragano­pterygon
+
+!! end
index d5c14a2..f0c78ec 100644 (file)
@@ -31,12 +31,14 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
                        'skin' => 'vector',
                        'modules' => 'startup',
                        'only' => 'scripts',
+                       'safemode' => null,
                ];
                $resourceLoader = $rl ?: new ResourceLoader();
                $request = new FauxRequest( [
                                'lang' => $options['lang'],
                                'modules' => $options['modules'],
                                'only' => $options['only'],
+                               'safemode' => $options['safemode'],
                                'skin' => $options['skin'],
                                'target' => 'phpunit',
                ] );
index c7725a2..110e00b 100644 (file)
@@ -1,3 +1,3 @@
-@import "test.common.mixins";
+@import "../common/test.common.mixins";
 
 @unitTestColor: green;
diff --git a/tests/phpunit/data/less/module/use-import-dir.less b/tests/phpunit/data/less/module/use-import-dir.less
new file mode 100644 (file)
index 0000000..4710bc6
--- /dev/null
@@ -0,0 +1,6 @@
+@import "test.common.mixins";
+
+/* @noflip */
+.unit-tests {
+       .test-mixin(green);
+}
diff --git a/tests/phpunit/data/registration/bad_url.json b/tests/phpunit/data/registration/bad_url.json
new file mode 100644 (file)
index 0000000..ee0f4b9
--- /dev/null
@@ -0,0 +1,5 @@
+{
+       "name": "Test",
+       "url": "http://www.mediawiki.org/",
+       "manifest_version": 1
+}
diff --git a/tests/phpunit/data/registration/bad_url2.json b/tests/phpunit/data/registration/bad_url2.json
new file mode 100644 (file)
index 0000000..813e9d6
--- /dev/null
@@ -0,0 +1,5 @@
+{
+       "name": "Test",
+       "url": "http://mediawiki.org/",
+       "manifest_version": 1
+}
index 21d1bf2..17a4182 100644 (file)
@@ -40,8 +40,8 @@ class TestLogger extends \Psr\Log\AbstractLogger {
         * @param bool $collect Whether to collect logs. @see setCollect()
         * @param callable $filter Filter logs before collecting/printing. Signature is
         *  string|null function ( string $message, string $level, array $context );
-        * @param bool $collectContext Whether to keep the context passed to log.
-        *                             @since 1.29 @see setCollectContext()
+        * @param bool $collectContext Whether to keep the context passed to log
+        *             (since 1.29, @see setCollectContext()).
         */
        public function __construct( $collect = false, $filter = null, $collectContext = false ) {
                $this->collect = $collect;
diff --git a/tests/phpunit/includes/collation/CollationFaTest.php b/tests/phpunit/includes/collation/CollationFaTest.php
deleted file mode 100644 (file)
index f745541..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-/**
- * @covers CollationFa
- */
-class CollationFaTest extends MediaWikiTestCase {
-
-       /*
-        * The ordering is a weird hack designed to work only with a very
-        * specific version of libicu, and as such can't really be unit tested
-        * against a random version of libicu
-        */
-
-       public function setUp() {
-               parent::setUp();
-               $this->checkPHPExtension( 'intl' );
-       }
-
-       /**
-        * @dataProvider provideGetFirstLetter
-        */
-       public function testGetFirstLetter( $letter, $str ) {
-               $coll = new CollationFa;
-               $this->assertEquals( $letter, $coll->getFirstLetter( $str ), $str );
-       }
-
-       public function provideGetFirstLetter() {
-               return [
-                       [
-                               '۷',
-                               '۷'
-                       ],
-                       [
-                               'ا',
-                               'ا'
-                       ],
-                       [
-                               'ا',
-                               'ایران'
-                       ],
-                       [
-                               'ب',
-                               'برلین'
-                       ],
-                       [
-                               'و',
-                               'واو'
-                       ],
-                       [ "\xd8\xa7", "\xd8\xa7Foo" ],
-                       [ "\xd9\x88", "\xd9\x88Foo" ],
-                       [ "\xd9\xb2", "\xd9\xb2Foo" ],
-                       [ "\xd9\xb3", "\xd9\xb3Foo" ],
-               ];
-       }
-}
index 6e23e53..0395bff 100644 (file)
@@ -606,4 +606,38 @@ class LBFactoryTest extends MediaWikiTestCase {
                        return $db->addIdentifierQuotes( $table );
                }
        }
+
+       /**
+        * @covers \Wikimedia\Rdbms\LBFactory::makeCookieValueFromCPIndex()
+        * @covers \Wikimedia\Rdbms\LBFactory::getCPIndexFromCookieValue()
+        */
+       public function testCPPosIndexCookieValues() {
+               $this->assertEquals( '3@542', LBFactory::makeCookieValueFromCPIndex( 3, 542 ) );
+
+               $time = 1526522031;
+               $this->assertSame(
+                       5,
+                       LBFactory::getCPIndexFromCookieValue( "5", $time - 10 )
+               );
+               $this->assertSame(
+                       null,
+                       LBFactory::getCPIndexFromCookieValue( "0", $time - 10 )
+               );
+               $this->assertSame(
+                       2,
+                       LBFactory::getCPIndexFromCookieValue( "2@$time", $time - 10 )
+               );
+               $this->assertSame(
+                       2,
+                       LBFactory::getCPIndexFromCookieValue( "2@$time", $time + 9 - 10 )
+               );
+               $this->assertSame(
+                       null,
+                       LBFactory::getCPIndexFromCookieValue( "0@$time", $time + 9 - 10 )
+               );
+               $this->assertSame(
+                       null,
+                       LBFactory::getCPIndexFromCookieValue( "2@$time", $time + 11 - 10 )
+               );
+       }
 }
index 7dfb3cf..5ddbe27 100644 (file)
@@ -156,4 +156,21 @@ class PasswordPolicyChecksTest extends MediaWikiTestCase {
                $status = PasswordPolicyChecks::checkPopularPasswordBlacklist( PHP_INT_MAX, $user, $password );
                $this->assertSame( $expected, $status->isGood() );
        }
+
+       /**
+        * Verify that all password policy description messages actually exist.
+        * Messages used on Special:PasswordPolicies
+        */
+       public function testPasswordPolicyDescriptionsExist() {
+               global $wgPasswordPolicy;
+               $lang = Language::factory( 'en' );
+
+               foreach ( array_keys( $wgPasswordPolicy['checks'] ) as $check ) {
+                       $msgKey = 'passwordpolicies-policy-' . strtolower( $check );
+                       $this->assertTrue(
+                               wfMessage( $msgKey )->useDatabase( false )->inLanguage( $lang )->exists(),
+                               "Message '$msgKey' required by '$check' must exist"
+                       );
+               }
+       }
 }
index d69ad59..355f4ef 100644 (file)
@@ -78,6 +78,15 @@ class ExtensionJsonValidatorTest extends MediaWikiTestCase {
                                'good.json',
                                true
                        ],
+                       [
+                               'bad_url.json', 'bad_url.json did not pass validation.
+[url] Should use HTTPS for www.mediawiki.org URLs'
+                       ],
+                       [
+                               'bad_url2.json', 'bad_url2.json did not pass validation.
+[url] Should use www.mediawiki.org domain
+[url] Should use HTTPS for www.mediawiki.org URLs'
+                       ]
                ];
        }
 
index e763a19..9b03c5c 100644 (file)
@@ -72,6 +72,10 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                                'shouldEmbed' => true,
                                'styles' => '.shouldembed{}',
                        ],
+                       'test.styles.deprecated' => [
+                               'type' => ResourceLoaderModule::LOAD_STYLES,
+                               'deprecated' => 'Deprecation message.',
+                       ],
 
                        'test.scripts' => [],
                        'test.scripts.user' => [ 'group' => 'user' ],
@@ -125,6 +129,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                        'test.styles.private',
                        'test.styles.pure',
                        'test.styles.shouldembed',
+                       'test.styles.deprecated',
                        'test.unregistered.styles',
                ] );
                $client->setModuleScripts( [
@@ -145,6 +150,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                                'test.styles.user.empty' => 'ready',
                                'test.styles.private' => 'ready',
                                'test.styles.shouldembed' => 'ready',
+                               'test.styles.deprecated' => 'ready',
                                'test.scripts' => 'loading',
                                'test.scripts.user' => 'loading',
                                'test.scripts.user.empty' => 'ready',
@@ -155,6 +161,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                        ],
                        'styles' => [
                                'test.styles.pure',
+                               'test.styles.deprecated',
                        ],
                        'scripts' => [
                                'test.scripts',
@@ -169,6 +176,13 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                                        'test.user',
                                ],
                        ],
+                       'styledeprecations' => [
+                               Xml::encodeJsCall(
+                                       'mw.log.warn',
+                                       [ 'This page is using the deprecated ResourceLoader module "test.styles.deprecated".
+Deprecation message.' ]
+                               )
+                       ],
                ];
 
                $access = TestingAccessWrapper::newFromObject( $client );
@@ -186,7 +200,9 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                $context = self::makeContext();
                $context->getResourceLoader()->register( self::makeSampleModules() );
 
-               $client = new ResourceLoaderClientHtml( $context );
+               $client = new ResourceLoaderClientHtml( $context, [
+                       'nonce' => false,
+               ] );
                $client->setConfig( [ 'key' => 'value' ] );
                $client->setModules( [
                        'test',
@@ -195,6 +211,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                $client->setModuleStyles( [
                        'test.styles.pure',
                        'test.styles.private',
+                       'test.styles.deprecated',
                ] );
                $client->setModuleScripts( [
                        'test.scripts',
@@ -207,18 +224,19 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                $expected = '<script>document.documentElement.className = document.documentElement.className.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );</script>' . "\n"
                        . '<script>(window.RLQ=window.RLQ||[]).push(function(){'
                        . 'mw.config.set({"key":"value"});'
-                       . 'mw.loader.state({"test.exempt":"ready","test.private":"loading","test.styles.pure":"ready","test.styles.private":"ready","test.scripts":"loading"});'
+                       . 'mw.loader.state({"test.exempt":"ready","test.private":"loading","test.styles.pure":"ready","test.styles.private":"ready","test.styles.deprecated":"ready","test.scripts":"loading"});'
                        . 'mw.loader.implement("test.private@{blankVer}",function($,jQuery,require,module){},{"css":[]});'
                        . 'mw.loader.load(["test"]);'
                        . 'mw.loader.load("/w/load.php?debug=false\u0026lang=nl\u0026modules=test.scripts\u0026only=scripts\u0026skin=fallback");'
+                       . 'mw.log.warn("This page is using the deprecated ResourceLoader module \"test.styles.deprecated\".\nDeprecation message.");'
                        . '});</script>' . "\n"
-                       . '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=nl&amp;modules=test.styles.pure&amp;only=styles&amp;skin=fallback"/>' . "\n"
+                       . '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=nl&amp;modules=test.styles.deprecated%2Cpure&amp;only=styles&amp;skin=fallback"/>' . "\n"
                        . '<style>.private{}</style>' . "\n"
                        . '<script async="" src="/w/load.php?debug=false&amp;lang=nl&amp;modules=startup&amp;only=scripts&amp;skin=fallback"></script>';
                // phpcs:enable
                $expected = self::expandVariables( $expected );
 
-               $this->assertEquals( $expected, $client->getHeadHtml( false ) );
+               $this->assertEquals( $expected, $client->getHeadHtml() );
        }
 
        /**
@@ -237,7 +255,26 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                        . '<script async="" src="/w/load.php?debug=false&amp;lang=nl&amp;modules=startup&amp;only=scripts&amp;skin=fallback&amp;target=example"></script>';
                // phpcs:enable
 
-               $this->assertEquals( $expected, $client->getHeadHtml( false ) );
+               $this->assertEquals( $expected, $client->getHeadHtml() );
+       }
+
+       /**
+        * Confirm that 'safemode' is passed down to startup.
+        *
+        * @covers ResourceLoaderClientHtml::getHeadHtml
+        */
+       public function testGetHeadHtmlWithSafemode() {
+               $client = new ResourceLoaderClientHtml(
+                       self::makeContext(),
+                       [ 'safemode' => '1' ]
+               );
+
+               // phpcs:disable Generic.Files.LineLength
+               $expected = '<script>document.documentElement.className = document.documentElement.className.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );</script>' . "\n"
+                       . '<script async="" src="/w/load.php?debug=false&amp;lang=nl&amp;modules=startup&amp;only=scripts&amp;safemode=1&amp;skin=fallback"></script>';
+               // phpcs:enable
+
+               $this->assertEquals( $expected, $client->getHeadHtml() );
        }
 
        /**
@@ -256,7 +293,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit\Framework\TestCase {
                        . '<script async="" src="/w/load.php?debug=false&amp;lang=nl&amp;modules=startup&amp;only=scripts&amp;skin=fallback"></script>';
                // phpcs:enable
 
-               $this->assertEquals( $expected, $client->getHeadHtml( false ) );
+               $this->assertEquals( $expected, $client->getHeadHtml() );
        }
 
        /**
index 564f50b..ca4fb34 100644 (file)
@@ -162,6 +162,75 @@ mw.loader.register( [
         "test.blank",
         "{blankVer}"
     ]
+] );'
+                       ] ],
+                       [ [
+                               'msg' => 'Safemode disabled (default; register all modules)',
+                               'modules' => [
+                                       // Default origin: ORIGIN_CORE_SITEWIDE
+                                       'test.blank' => new ResourceLoaderTestModule(),
+                                       'test.core-generated' => new ResourceLoaderTestModule( [
+                                               'origin' => ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL
+                                       ] ),
+                                       'test.sitewide' => new ResourceLoaderTestModule( [
+                                               'origin' => ResourceLoaderModule::ORIGIN_USER_SITEWIDE
+                                       ] ),
+                                       'test.user' => new ResourceLoaderTestModule( [
+                                               'origin' => ResourceLoaderModule::ORIGIN_USER_INDIVIDUAL
+                                       ] ),
+                               ],
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php"
+} );
+mw.loader.register( [
+    [
+        "test.blank",
+        "{blankVer}"
+    ],
+    [
+        "test.core-generated",
+        "{blankVer}"
+    ],
+    [
+        "test.sitewide",
+        "{blankVer}"
+    ],
+    [
+        "test.user",
+        "{blankVer}"
+    ]
+] );'
+                       ] ],
+                       [ [
+                               'msg' => 'Safemode enabled (filter modules with user/site origin)',
+                               'extraQuery' => [ 'safemode' => '1' ],
+                               'modules' => [
+                                       // Default origin: ORIGIN_CORE_SITEWIDE
+                                       'test.blank' => new ResourceLoaderTestModule(),
+                                       'test.core-generated' => new ResourceLoaderTestModule( [
+                                               'origin' => ResourceLoaderModule::ORIGIN_CORE_INDIVIDUAL
+                                       ] ),
+                                       'test.sitewide' => new ResourceLoaderTestModule( [
+                                               'origin' => ResourceLoaderModule::ORIGIN_USER_SITEWIDE
+                                       ] ),
+                                       'test.user' => new ResourceLoaderTestModule( [
+                                               'origin' => ResourceLoaderModule::ORIGIN_USER_INDIVIDUAL
+                                       ] ),
+                               ],
+                               'out' => '
+mw.loader.addSource( {
+    "local": "/w/load.php"
+} );
+mw.loader.register( [
+    [
+        "test.blank",
+        "{blankVer}"
+    ],
+    [
+        "test.core-generated",
+        "{blankVer}"
+    ]
 ] );'
                        ] ],
                        [ [
@@ -394,7 +463,8 @@ mw.loader.register( [
                        $this->setMwGlobals( 'wgResourceLoaderSources', $case['sources'] );
                }
 
-               $context = $this->getResourceLoaderContext();
+               $extraQuery = isset( $case['extraQuery'] ) ? $case['extraQuery'] : [];
+               $context = $this->getResourceLoaderContext( $extraQuery );
                $rl = $context->getResourceLoader();
                $rl->register( $case['modules'] );
                $module = new ResourceLoaderStartUpModule();
index e811d87..95006aa 100644 (file)
@@ -8,9 +8,7 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                parent::setUp();
 
                $this->setMwGlobals( [
-                       'wgResourceLoaderLESSImportPaths' => [
-                               dirname( dirname( __DIR__ ) ) . '/data/less/common',
-                       ],
+                       'wgResourceLoaderLESSImportPaths' => [],
                        'wgResourceLoaderLESSVars' => [
                                'foo'  => '2px',
                                'Foo' => '#eeeeee',
@@ -264,6 +262,20 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                $this->assertStringEqualsFile( $basePath . '/styles.css', $styles['all'] );
        }
 
+       /**
+        * @covers ResourceLoader::getLessCompiler
+        */
+       public function testLessImportDirs() {
+               $rl = new EmptyResourceLoader();
+               $lc = $rl->getLessCompiler();
+               $basePath = dirname( dirname( __DIR__ ) ) . '/data/less';
+               $lc->SetImportDirs( [
+                        "$basePath/common" => '',
+               ] );
+               $css = $lc->parseFile( "$basePath/module/use-import-dir.less" )->getCss();
+               $this->assertStringEqualsFile( "$basePath/module/styles.css", $css );
+       }
+
        public static function providePackedModules() {
                return [
                        [
index e1b98ec..c272551 100644 (file)
@@ -104,6 +104,13 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                        // names ending in "a" to be female.
                        [ NS_USER, 'Lisa_Müller', '', '', 'de', 'Benutzerin:Lisa Müller' ],
                        [ NS_MAIN, 'FooBar', '', 'remotetestiw', 'en', 'remotetestiw:FooBar' ],
+                       // Strip soft hyphen and Unicode directional formatting characters
+                       [ NS_MAIN, "Foo\xC2\xAD\xD8\x9C\xE2\x80\x8E\xE2\x80\x8F\xE2\x80\xAA\xE2\x80\xAB" .
+                               "\xE2\x80\xAC\xE2\x80\xAD\xE2\x80\xAE\xE2\x81\xA6\xE2\x81\xA7" .
+                               "\xE2\x81\xA8\xE2\x81\xA9bar", '', '', 'en',
+                               "Foo\xC2\xAD\xD8\x9C\xE2\x80\x8E\xE2\x80\x8F\xE2\x80\xAA\xE2\x80\xAB" .
+                               "\xE2\x80\xAC\xE2\x80\xAD\xE2\x80\xAE\xE2\x81\xA6\xE2\x81\xA7" .
+                               "\xE2\x81\xA8\xE2\x81\xA9bar", 'Foobar' ],
                ];
        }
 
index 785e114..1922de5 100644 (file)
@@ -115,12 +115,6 @@ return [
                        'jquery.tablesorter',
                        'jquery.textSelection',
                        'mediawiki.api',
-                       'mediawiki.api.category',
-                       'mediawiki.api.messages',
-                       'mediawiki.api.options',
-                       'mediawiki.api.parse',
-                       'mediawiki.api.upload',
-                       'mediawiki.api.watch',
                        'mediawiki.ForeignApi.core',
                        'mediawiki.jqueryMsg',
                        'mediawiki.messagePoster',
index 2300949..3b710c4 100644 (file)
  * @author Lupo
  * @since 1.20
  */
+
+// This file doesn't run as part of MediaWiki
+// phpcs:disable MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals
+
 header( 'Content-Type: text/javascript; charset=utf-8' );
 
 $moduleImplementations = [
index 0e84581..e37f67d 100644 (file)
  * @author Timo Tijhof
  * @since 1.20
  */
+
+// This file doesn't run as part of MediaWiki
+// phpcs:disable MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals
+
 header( 'Content-Type: text/css; charset=utf-8' );
 
 /**
index d51dc37..d3f6533 100644 (file)
 
                $clone.find( '.mw-collapsible-toggle a' ).trigger( 'click' );
        } );
+
+       QUnit.test( 'T168689 - nested collapsible divs should keep independent state', function ( assert ) {
+               var $collapsible1 = prepareCollapsible(
+                               '<div class="mw-collapsible">' + loremIpsum + '</div>'
+                       ),
+                       $collapsible2 = prepareCollapsible(
+                               '<div class="mw-collapsible">' + loremIpsum + '</div>'
+                       );
+
+               $collapsible1
+                       .append( $collapsible2 )
+                       .appendTo( '#qunit-fixture' ).makeCollapsible();
+
+               $collapsible1.on( 'afterCollapse.mw-collapsible', function () {
+                       assert.assertTrue( $collapsible1.hasClass( 'mw-collapsed' ), 'after collapsing: parent is collapsed' );
+                       assert.assertFalse( $collapsible2.hasClass( 'mw-collapsed' ), 'after collapsing: child is not collapsed' );
+                       assert.assertTrue( $collapsible1.find( '> .mw-collapsible-toggle' ).hasClass( 'mw-collapsible-toggle-collapsed' ) );
+                       assert.assertFalse( $collapsible2.find( '> .mw-collapsible-toggle' ).hasClass( 'mw-collapsible-toggle-collapsed' ) );
+               } ).find( '> .mw-collapsible-toggle a' ).trigger( 'click' );
+       } );
 }( jQuery ) );
index 74caf5c..495ce74 100644 (file)
                                '<tr><td>B</td></tr>' +
                                '<tr><td>G</td></tr>' +
                                '<tr><td data-sort-value="F">C</td></tr>' +
+                               '<tr><td><span data-sort-value="D">H</span></td></tr>' +
                                '</tbody></table>'
                );
                $table.tablesorter().find( '.headerSort:eq(0)' ).click();
                                data: undefined,
                                text: 'D'
                        },
+                       {
+                               data: undefined,
+                               text: 'H'
+                       },
                        {
                                data: 'E',
                                text: 'A'
index d6fe744..e8db4e1 100644 (file)
                title = new mw.Title( 'Foo \u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000 bar' );
                assert.equal( title.getMain(), 'Foo_bar', 'Merge multiple types of whitespace/underscores into a single underscore' );
 
-               title = new mw.Title( 'Foo\u200E\u200F\u202A\u202B\u202C\u202D\u202Ebar' );
-               assert.equal( title.getMain(), 'Foobar', 'Strip Unicode bidi override characters' );
+               title = new mw.Title( 'Foo\u00AD\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069bar' );
+               assert.equal( title.getMain(), 'Foobar', 'Strip soft hyphen and Unicode directional formatting characters' );
 
                // Regression test: Previously it would only detect an extension if there is no space after it
                title = new mw.Title( 'Example.js  ' );
                                },
                                {
                                        fileName: 'BI\u200EDI.jpg',
-                                       typeOfName: 'Name containing BIDI overrides',
+                                       typeOfName: 'Name containing Unicode directional formatting characters',
                                        nameText: 'BIDI',
                                        prefixedText: 'File:BIDI.jpg'
                                },
index 3b71413..a3c9d84 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -35,7 +35,7 @@ if ( defined( 'THUMB_HANDLER' ) ) {
        wfThumbHandle404();
 } else {
        // Called directly, use $_GET params
-       wfStreamThumb( $_GET );
+       wfStreamThumb( $wgRequest->getQueryValues() );
 }
 
 $mediawiki = new MediaWiki();