Merge "Add WhatLinksHereProps hook, to allow extensions to annotate WhatLinksHere...
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 1 May 2014 04:28:23 +0000 (04:28 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 1 May 2014 04:28:23 +0000 (04:28 +0000)
478 files changed:
RELEASE-NOTES-1.23
RELEASE-NOTES-1.24
includes/AutoLoader.php
includes/DefaultSettings.php
includes/Feed.php
includes/HtmlFormatter.php
includes/Revision.php
includes/Skin.php
includes/Title.php
includes/UserMailer.php
includes/Wiki.php
includes/WikiPage.php
includes/actions/InfoAction.php
includes/api/ApiMain.php
includes/api/ApiParse.php
includes/api/ApiQueryPrefixSearch.php
includes/api/ApiQueryRedirects.php
includes/api/ApiQuerySearch.php
includes/api/ApiUpload.php
includes/cache/LocalisationCache.php
includes/changes/ChangesList.php
includes/composer/ComposerPackageModifier.php
includes/context/ContextSource.php
includes/context/DerivativeContext.php
includes/context/IContextSource.php
includes/context/RequestContext.php
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabaseMssql.php
includes/db/DatabasePostgres.php
includes/deferred/LinksUpdate.php
includes/diff/DairikiDiff.php
includes/exception/MWException.php
includes/filerepo/file/File.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/OldLocalFile.php
includes/htmlform/HTMLForm.php
includes/installer/MssqlInstaller.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/i18n/be-tarask.json
includes/installer/i18n/cs.json
includes/installer/i18n/de.json
includes/installer/i18n/en.json
includes/installer/i18n/es.json
includes/installer/i18n/fa.json
includes/installer/i18n/fi.json
includes/installer/i18n/fr.json
includes/installer/i18n/he.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/ko.json
includes/installer/i18n/mk.json
includes/installer/i18n/pl.json
includes/installer/i18n/pt.json
includes/installer/i18n/sco.json
includes/installer/i18n/zh-hans.json
includes/installer/i18n/zh-hant.json
includes/jobqueue/Job.php
includes/jobqueue/JobQueue.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueFederated.php
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/JobQueueRedis.php
includes/json/FormatJson.php
includes/libs/CSSJanus.php
includes/libs/CSSMin.php
includes/libs/GenericArrayObject.php
includes/libs/IEContentAnalyzer.php
includes/libs/MWMessagePack.php
includes/libs/MultiHttpClient.php
includes/libs/virtualrest/SwiftVirtualRESTService.php [new file with mode: 0644]
includes/libs/virtualrest/VirtualRESTService.php [new file with mode: 0644]
includes/libs/virtualrest/VirtualRESTServiceClient.php [new file with mode: 0644]
includes/media/Bitmap_ClientOnly.php
includes/normal/RandomTest.php
includes/normal/Utf8Test.php
includes/normal/UtfNormal.php
includes/normal/UtfNormalBench.php
includes/normal/UtfNormalData.inc
includes/normal/UtfNormalDataK.inc
includes/normal/UtfNormalDefines.php
includes/normal/UtfNormalGenerate.php
includes/normal/UtfNormalMemStress.php
includes/normal/UtfNormalTest.php
includes/normal/UtfNormalTest2.php
includes/normal/UtfNormalUtil.php
includes/objectcache/BagOStuff.php
includes/objectcache/MemcachedPeclBagOStuff.php
includes/objectcache/RedisBagOStuff.php
includes/objectcache/SqlBagOStuff.php
includes/parser/ParserOutput.php
includes/profiler/Profiler.php
includes/resourceloader/ResourceLoaderLanguageNamesModule.php [new file with mode: 0644]
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/revisiondelete/RevisionDelete.php
includes/specials/SpecialImport.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialSearch.php
languages/Language.php
languages/i18n/ace.json
languages/i18n/as.json
languages/i18n/be-tarask.json
languages/i18n/bo.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/cy.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dtp.json
languages/i18n/egl.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hsb.json
languages/i18n/it.json
languages/i18n/kk-cyrl.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/lmo.json
languages/i18n/lt.json
languages/i18n/mg.json
languages/i18n/mhr.json
languages/i18n/mk.json
languages/i18n/mn.json
languages/i18n/mr.json
languages/i18n/nan.json
languages/i18n/nb.json
languages/i18n/nn.json
languages/i18n/pa.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/sco.json
languages/i18n/sh.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/7zip.inc
maintenance/Maintenance.php
maintenance/archives/patch-pp_sortkey.sql [new file with mode: 0644]
maintenance/archives/upgradeLogging.php
maintenance/backup.inc
maintenance/backupPrefetch.inc
maintenance/backupTextPass.inc
maintenance/benchmarks/Benchmarker.php
maintenance/benchmarks/bench_delete_truncate.php
maintenance/benchmarks/bench_strtr_str_replace.php
maintenance/benchmarks/bench_utf8_title_check.php
maintenance/benchmarks/bench_wfBaseConvert.php
maintenance/benchmarks/bench_wfIsWindows.php
maintenance/benchmarks/benchmarkHooks.php
maintenance/benchmarks/benchmarkParse.php
maintenance/benchmarks/benchmarkPurge.php
maintenance/checkBadRedirects.php
maintenance/checkImages.php
maintenance/checkSyntax.php
maintenance/checkUsernames.php
maintenance/cleanupAncientTables.php
maintenance/cleanupCaps.php
maintenance/cleanupImages.php
maintenance/cleanupSpam.php
maintenance/cleanupWatchlist.php
maintenance/compareParsers.php
maintenance/convertLinks.php
maintenance/convertUserOptions.php
maintenance/copyFileBackend.php
maintenance/copyJobQueue.php
maintenance/createAndPromote.php
maintenance/deleteArchivedFiles.inc
maintenance/deleteArchivedFiles.php
maintenance/deleteArchivedRevisions.inc
maintenance/deleteBatch.php
maintenance/deleteDefaultMessages.php
maintenance/deleteEqualMessages.php
maintenance/deleteImageMemcached.php
maintenance/deleteRevision.php
maintenance/dev/includes/router.php
maintenance/dumpBackup.php
maintenance/dumpIterator.php
maintenance/dumpTextPass.php
maintenance/dumpUploads.php
maintenance/fetchText.php
maintenance/findHooks.php
maintenance/fixDoubleRedirects.php
maintenance/fixExtLinksProtocolRelative.php
maintenance/fixSlaveDesync.php
maintenance/fixTimestamps.php
maintenance/generateJsonI18n.php
maintenance/generateSitemap.php
maintenance/getConfiguration.php
maintenance/getSlaveServer.php
maintenance/importDump.php
maintenance/importImages.inc
maintenance/importImages.php
maintenance/importSiteScripts.php
maintenance/importTextFile.php
maintenance/install.php
maintenance/jsduck/MetaTags.rb [deleted file]
maintenance/jsduck/categories.json
maintenance/jsduck/config.json
maintenance/jsduck/eg-iframe.html
maintenance/language/StatOutputs.php
maintenance/language/generateCollationData.php
maintenance/language/languages.inc
maintenance/language/messages.inc
maintenance/mctest.php
maintenance/mergeMessageFileList.php
maintenance/minify.php
maintenance/mssql/archives/patch-user_password_expires.sql [new file with mode: 0644]
maintenance/mssql/tables.sql
maintenance/mwdocgen.php
maintenance/mwjsduck-gen
maintenance/namespaceDupes.php
maintenance/nukeNS.php
maintenance/oracle/alterSharedConstraints.php
maintenance/orphans.php
maintenance/parse.php
maintenance/populateCategory.php
maintenance/populateFilearchiveSha1.php
maintenance/populateImageSha1.php
maintenance/populateLogSearch.php
maintenance/populateLogUsertext.php
maintenance/populateParentId.php
maintenance/populateRecentChangesSource.php
maintenance/populateRevisionLength.php
maintenance/populateRevisionSha1.php
maintenance/preprocessDump.php
maintenance/preprocessorFuzzTest.php
maintenance/purgeChangedFiles.php
maintenance/purgeChangedPages.php
maintenance/purgeList.php
maintenance/purgeOldText.inc
maintenance/purgeParserCache.php
maintenance/reassignEdits.php
maintenance/rebuildImages.php
maintenance/rebuildLocalisationCache.php
maintenance/rebuildrecentchanges.php
maintenance/refreshImageMetadata.php
maintenance/refreshLinks.php
maintenance/removeUnusedAccounts.php
maintenance/renderDump.php
maintenance/resetUserTokens.php
maintenance/rollbackEdits.php
maintenance/runJobs.php
maintenance/showSiteStats.php
maintenance/sql.php
maintenance/sqlite.inc
maintenance/sqlite.php
maintenance/storage/checkStorage.php
maintenance/storage/fixBug20757.php
maintenance/storage/orphanStats.php
maintenance/storage/recompressTracked.php
maintenance/storage/resolveStubs.php
maintenance/storage/trackBlobs.php
maintenance/syncFileBackend.php
maintenance/tables.sql
maintenance/updateCollation.php
maintenance/updateDoubleWidthSearch.php
maintenance/updateSpecialPages.php
maintenance/userDupes.inc
maintenance/userOptions.inc
maintenance/waitForSlave.php
resources/Resources.php
resources/lib/oojs-ui/i18n/br.json
resources/lib/oojs-ui/i18n/oc.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/sco.json
resources/lib/oojs-ui/i18n/yi.json
resources/lib/oojs-ui/i18n/zh-hant.json
resources/lib/oojs-ui/images/icons/info.png [new file with mode: 0644]
resources/lib/oojs-ui/images/icons/info.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/alert.png [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/alert.svg [new file with mode: 0644]
resources/lib/oojs-ui/images/indicators/required.png
resources/lib/oojs-ui/images/indicators/required.svg
resources/lib/oojs-ui/oojs-ui-apex.css
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/oojs-ui.svg.css
resources/src/jquery.tipsy/jquery.tipsy.css
resources/src/jquery.ui-themes/vector/jquery.ui.button.css
resources/src/jquery.ui-themes/vector/jquery.ui.theme.css
resources/src/jquery/jquery.accessKeyLabel.js [new file with mode: 0644]
resources/src/jquery/jquery.byteLength.js
resources/src/jquery/jquery.checkboxShiftClick.js
resources/src/jquery/jquery.client.js
resources/src/jquery/jquery.colorUtil.js
resources/src/jquery/jquery.footHovzer.js
resources/src/jquery/jquery.getAttrs.js
resources/src/jquery/jquery.hidpi.js
resources/src/jquery/jquery.makeCollapsible.js
resources/src/jquery/jquery.tabIndex.js
resources/src/jquery/jquery.textSelection.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.action/mediawiki.action.edit.styles.css
resources/src/mediawiki.action/mediawiki.action.history.js
resources/src/mediawiki.action/mediawiki.action.view.dblClickEdit.js
resources/src/mediawiki.action/mediawiki.action.view.metadata.js
resources/src/mediawiki.action/mediawiki.action.view.redirectToFragment.js
resources/src/mediawiki.action/mediawiki.action.view.rightClickEdit.js
resources/src/mediawiki.language/mediawiki.language.init.js
resources/src/mediawiki.page/mediawiki.page.gallery.js
resources/src/mediawiki.page/mediawiki.page.image.pagination.js
resources/src/mediawiki.page/mediawiki.page.patrol.ajax.js
resources/src/mediawiki.ui/components/default/buttons.less
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.user.js
resources/src/mediawiki/mediawiki.util.js
skins/CologneBlue.php
skins/Modern.php
skins/MonoBook.php
skins/Vector.php
skins/cologneblue/screen.css
skins/common/commonContent.css
skins/common/commonElements.css
skins/common/commonInterface.css
skins/common/commonPrint.css
skins/common/config-cc.css
skins/common/config.css
skins/common/feed.css
skins/common/oldshared.css
skins/common/shared.css
skins/common/wikibits.js
skins/modern/main.css
skins/monobook/IE60Fixes.css
skins/monobook/IE70Fixes.css
skins/monobook/main.css
skins/vector/components/common.less
tests/TestsAutoLoader.php
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/phpunit/MediaWikiLangTestCase.php
tests/phpunit/MediaWikiPHPUnitTestListener.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/includes/ArticleTest.php
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/ExternalStoreTest.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/FallbackTest.php
tests/phpunit/includes/FauxRequestTest.php
tests/phpunit/includes/FauxResponseTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
tests/phpunit/includes/GlobalFunctions/wfBaseNameTest.php
tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfGetCallerTest.php
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
tests/phpunit/includes/HooksTest.php
tests/phpunit/includes/HtmlFormatterTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/HttpTest.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/LinksUpdateTest.php
tests/phpunit/includes/LocalFileTest.php
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/PathRouterTest.php
tests/phpunit/includes/RequestContextTest.php
tests/phpunit/includes/RevisionStorageTest.php
tests/phpunit/includes/RevisionStorageTestContentHandlerUseDB.php [new file with mode: 0644]
tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php [deleted file]
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/SampleTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/SiteConfigurationTest.php
tests/phpunit/includes/SkinTemplateTest.php
tests/phpunit/includes/StatusTest.php
tests/phpunit/includes/TestUser.php
tests/phpunit/includes/TitleArrayFromResultTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/UserArrayFromResultTest.php
tests/phpunit/includes/UserTest.php
tests/phpunit/includes/WebRequestTest.php
tests/phpunit/includes/WikiPageTest.php
tests/phpunit/includes/WikiPageTestContentHandlerUseDB.php [new file with mode: 0644]
tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php [deleted file]
tests/phpunit/includes/XmlSelectTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/api/ApiLoginTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/api/ApiPurgeTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/ApiTestCaseUpload.php
tests/phpunit/includes/api/ApiUploadTest.php
tests/phpunit/includes/api/RandomImageGenerator.php
tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
tests/phpunit/includes/composer/ComposerVersionNormalizerTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/content/WikitextContentTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
tests/phpunit/includes/db/DatabaseSQLTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/DatabaseTest.php
tests/phpunit/includes/db/DatabaseTestHelper.php
tests/phpunit/includes/diff/ArrayDiffFormatterTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filerepo/StoreBatchTest.php
tests/phpunit/includes/htmlform/HTMLCheckMatrixTest.php
tests/phpunit/includes/installer/InstallDocFormatterTest.php
tests/phpunit/includes/installer/OracleInstallerTest.php
tests/phpunit/includes/jobqueue/RefreshLinksPartitionTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/GenericArrayObjectTest.php
tests/phpunit/includes/libs/JavaScriptMinifierTest.php
tests/phpunit/includes/media/DjVuTest.php
tests/phpunit/includes/media/ExifBitmapTest.php
tests/phpunit/includes/media/ExifRotationTest.php
tests/phpunit/includes/media/GIFTest.php
tests/phpunit/includes/media/IPTCTest.php
tests/phpunit/includes/media/JpegMetadataExtractorTest.php
tests/phpunit/includes/media/JpegTest.php
tests/phpunit/includes/media/PNGTest.php
tests/phpunit/includes/media/SVGMetadataExtractorTest.php
tests/phpunit/includes/media/SVGTest.php
tests/phpunit/includes/media/TiffTest.php
tests/phpunit/includes/normal/CleanUpTest.php
tests/phpunit/includes/objectcache/BagOStuffTest.php
tests/phpunit/includes/parser/MagicVariableTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/parser/PreprocessorTest.php
tests/phpunit/includes/parser/TagHooksTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderStartupModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/site/MediaWikiSiteTest.php
tests/phpunit/includes/specials/QueryAllSpecialPagesTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
tests/phpunit/includes/upload/UploadFromUrlTest.php
tests/phpunit/languages/LanguageBe_taraskTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/languages/utils/CLDRPluralRuleEvaluatorTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/backupPrefetchTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/maintenance/backup_PageTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/phpunit/mocks/media/MockDjVuHandler.php [new file with mode: 0644]
tests/phpunit/phpunit.php
tests/phpunit/structure/AutoLoaderTest.php
tests/phpunit/structure/ResourcesTest.php
tests/phpunit/suites/ExtensionsTestSuite.php
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/testHelpers.inc
thumb.php

index 22520d3..231903c 100644 (file)
@@ -9,6 +9,9 @@ MediaWiki 1.23 is an alpha-quality branch and is not recommended for use in
 production.
 
 === Configuration changes in 1.23 ===
+* Introduced $wgPagePropsHaveSortkey as a backwards-compatibility switch,
+  for using the old schema of the page_props table, in case the respective
+  schema update was not applied.
 * When $wgJobRunRate is higher that zero, jobs are now executed via an
   asynchronous HTTP request to a MediaWiki entry point. This may require
   increasing the number of server worker threads. $wgRunJobsAsync has been
@@ -267,6 +270,9 @@ changes to languages because of Bugzilla reports.
 * Support was added for Northern Luri (lrc).
 
 === Other changes in 1.23 ===
+* Added pp_sortkey column to page_props table, so pages can be efficiently
+  queried and sorted by property value (bug 58032).
+  See $wgPagePropsHaveSortkey if you want to postpone the schema change.
 * The rc_type field in the recentchanges table has been superseded by a new
   rc_source field.  The rc_source field is a string representation of the
   change type where rc_type was a numeric constant.  This field is not yet
index c0bb285..aaabb6b 100644 (file)
@@ -20,6 +20,8 @@ production.
   option and a size specification set will now always ignore the provided
   size and display an unscaled image, as the documentation has always
   claimed it would.
+* (bug 890) Links in Special:RecentChanges and Special:Watchlist no longer
+  follow redirects to their target pages.
 
 === Web API changes in 1.24 ===
 
@@ -40,6 +42,7 @@ changes to languages because of Bugzilla reports.
 * CLDRPluralRuleConverter_Fragment to CLDRPluralRuleConverterFragment
 * CLDRPluralRuleConverter_Operator to CLDRPluralRuleConverterOperator
 * CLDRPluralRuleEvaluator_Range to CLDRPluralRuleEvaluatorRange
+* CSSJanus_Tokenizer to CSSJanusTokenizer
 
 == Compatibility ==
 
index 5545767..d7416ec 100644 (file)
@@ -676,7 +676,7 @@ $wgAutoloadLocalClasses = array(
 
        # includes/libs
        'CSSJanus' => 'includes/libs/CSSJanus.php',
-       'CSSJanus_Tokenizer' => 'includes/libs/CSSJanus.php',
+       'CSSJanusTokenizer' => 'includes/libs/CSSJanus.php',
        'CSSMin' => 'includes/libs/CSSMin.php',
        'GenericArrayObject' => 'includes/libs/GenericArrayObject.php',
        'HashRing' => 'includes/libs/HashRing.php',
@@ -697,6 +697,9 @@ $wgAutoloadLocalClasses = array(
        'RunningStat' => 'includes/libs/RunningStat.php',
        'ScopedCallback' => 'includes/libs/ScopedCallback.php',
        'ScopedPHPTimeout' => 'includes/libs/ScopedPHPTimeout.php',
+       'SwiftVirtualRESTService' => 'includes/libs/virtualrest/SwiftVirtualRESTService.php',
+       'VirtualRESTService' => 'includes/libs/virtualrest/VirtualRESTService.php',
+       'VirtualRESTServiceClient' => 'includes/libs/virtualrest/VirtualRESTServiceClient.php',
        'XmlTypeCheck' => 'includes/libs/XmlTypeCheck.php',
 
        # includes/libs/lessphp
@@ -867,6 +870,8 @@ $wgAutoloadLocalClasses = array(
        'ResourceLoaderUserTokensModule' => 'includes/resourceloader/ResourceLoaderUserTokensModule.php',
        'ResourceLoaderLanguageDataModule' =>
                'includes/resourceloader/ResourceLoaderLanguageDataModule.php',
+       'ResourceLoaderLanguageNamesModule' =>
+               'includes/resourceloader/ResourceLoaderLanguageNamesModule.php',
        'ResourceLoaderWikiModule' => 'includes/resourceloader/ResourceLoaderWikiModule.php',
 
        # includes/revisiondelete
index 91c9a75..87dc025 100644 (file)
@@ -7080,6 +7080,13 @@ $wgSiteTypes = array(
  */
 $wgCompiledFiles = array();
 
+/**
+ * Whether the page_props table has a pp_sortkey column. Set to false in case
+ * the respective database schema change was not applied.
+ * @since 1.23
+ */
+$wgPagePropsHaveSortkey = true;
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index 1b99519..7089c92 100644 (file)
@@ -93,7 +93,7 @@ class FeedItem {
        }
 
        /**
-        * set the unique id of an item
+        * Set the unique id of an item
         *
         * @param string $uniqueId Unique id for the item
         * @param bool $rssIsPermalink Set to true if the guid (unique id) is a permalink (RSS feeds only)
@@ -141,7 +141,7 @@ class FeedItem {
        }
 
        /**
-        * Get the title of this item
+        * Get the date of this item
         *
         * @return string
         */
index 96ffe9e..83d0530 100644 (file)
@@ -138,7 +138,7 @@ class HtmlFormatter {
 
                if ( !$removals ) {
                        wfProfileOut( __METHOD__ );
-                       return;
+                       return array();
                }
 
                $doc = $this->getDoc();
index 7b30540..afbd3ac 100644 (file)
@@ -1566,9 +1566,10 @@ class Revision implements IDBAccessObject {
         * @param int $pageId: ID number of the page to read from
         * @param string $summary Revision's summary
         * @param bool $minor Whether the revision should be considered as minor
+        * @param User|null $user User object to use or null for $wgUser
         * @return Revision|null Revision or null on error
         */
-       public static function newNullRevision( $dbw, $pageId, $summary, $minor ) {
+       public static function newNullRevision( $dbw, $pageId, $summary, $minor, $user = null ) {
                global $wgContentHandlerUseDB;
 
                wfProfileIn( __METHOD__ );
@@ -1591,8 +1592,15 @@ class Revision implements IDBAccessObject {
                        __METHOD__ );
 
                if ( $current ) {
+                       if ( !$user ) {
+                               global $wgUser;
+                               $user = $wgUser;
+                       }
+
                        $row = array(
                                'page'       => $pageId,
+                               'user_text'  => $user->getName(),
+                               'user'       => $user->getId(),
                                'comment'    => $summary,
                                'minor_edit' => $minor,
                                'text_id'    => $current->rev_text_id,
index d3fa607..8300da7 100644 (file)
@@ -683,7 +683,7 @@ abstract class Skin extends ContextSource {
                        // oldid not available for non existing pages
                        $url = htmlspecialchars( wfExpandIRI( $this->getTitle()->getCanonicalURL() ) );
                }
-               return $this->msg( 'retrievedfrom', '<a href="' . $url . '">' . $url . '</a>' )->text();
+               return $this->msg( 'retrievedfrom', '<a dir="ltr" href="' . $url . '">' . $url . '</a>' )->text();
        }
 
        /**
index 4dc0372..70d2baa 100644 (file)
@@ -3859,7 +3859,7 @@ class Title {
                }
 
                # Save a null revision in the page's history notifying of the move
-               $nullRevision = Revision::newNullRevision( $dbw, $oldid, $comment, true );
+               $nullRevision = Revision::newNullRevision( $dbw, $oldid, $comment, true, $wgUser );
                if ( !is_object( $nullRevision ) ) {
                        throw new MWException( 'No valid null revision produced in ' . __METHOD__ );
                }
@@ -3906,6 +3906,8 @@ class Title {
                                $redirectRevision = new Revision( array(
                                        'title' => $this, // for determining the default content model
                                        'page' => $newid,
+                                       'user_text' => $wgUser->getName(),
+                                       'user' => $wgUser->getId(),
                                        'comment' => $comment,
                                        'content' => $redirectContent ) );
                                $redirectRevision->insertOn( $dbw );
index 2094b62..025d704 100644 (file)
@@ -738,13 +738,13 @@ class EmailNotification {
                                        ->inContentLanguage()->text();
                        }
                        $keys['$OLDID'] = $this->oldid;
-                       // @deprecated Remove in MediaWiki 1.23.
+                       // Deprecated since MediaWiki 1.21, not used by default. Kept for backwards-compatibility.
                        $keys['$CHANGEDORCREATED'] = wfMessage( 'changed' )->inContentLanguage()->text();
                } else {
                        # clear $OLDID placeholder in the message template
                        $keys['$OLDID'] = '';
                        $keys['$NEWPAGE'] = '';
-                       // @deprecated Remove in MediaWiki 1.23.
+                       // Deprecated since MediaWiki 1.21, not used by default. Kept for backwards-compatibility.
                        $keys['$CHANGEDORCREATED'] = wfMessage( 'created' )->inContentLanguage()->text();
                }
 
index 2ef1382..aed1f65 100644 (file)
@@ -542,7 +542,7 @@ class MediaWiki {
                        $request->getProtocol() == 'http'
                ) {
                        $oldUrl = $request->getFullRequestURL();
-                       $redirUrl = str_replace( 'http://', 'https://', $oldUrl );
+                       $redirUrl = preg_replace( '#^http://#', 'https://', $oldUrl );
 
                        if ( $request->wasPosted() ) {
                                // This is weird and we'd hope it almost never happens. This
index 8e15ac9..d53acd0 100644 (file)
@@ -2173,19 +2173,17 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( !$options['changed'] ) {
                        $good = 0;
-                       $total = 0;
                } elseif ( $options['created'] ) {
                        $good = (int)$this->isCountable( $editInfo );
-                       $total = 1;
                } elseif ( $options['oldcountable'] !== null ) {
                        $good = (int)$this->isCountable( $editInfo ) - (int)$options['oldcountable'];
-                       $total = 0;
                } else {
                        $good = 0;
-                       $total = 0;
                }
+               $edits = $options['changed'] ? 1 : 0;
+               $total = $options['created'] ? 1 : 0;
 
-               DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, $good, $total ) );
+               DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, $edits, $good, $total ) );
                DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content ) );
 
                // If this is another user's talk page, update newtalk.
@@ -2226,7 +2224,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( $options['created'] ) {
                        self::onArticleCreate( $this->mTitle );
-               } else {
+               } elseif ( $options['changed'] ) { // bug 50785
                        self::onArticleEdit( $this->mTitle );
                }
 
@@ -2274,6 +2272,8 @@ class WikiPage implements Page, IDBAccessObject {
                $revision = new Revision( array(
                        'title'      => $this->getTitle(), // for determining the default content model
                        'page'       => $this->getId(),
+                       'user_text'  => $user->getName(),
+                       'user'       => $user->getId(),
                        'text'       => $serialized,
                        'length'     => $content->getSize(),
                        'comment'    => $comment,
@@ -2407,7 +2407,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                        // insert null revision to identify the page protection change as edit summary
                        $latest = $this->getLatest();
-                       $nullRevision = $this->insertProtectNullRevision( $revCommentMsg, $limit, $expiry, $cascade, $reason );
+                       $nullRevision = $this->insertProtectNullRevision( $revCommentMsg, $limit, $expiry, $cascade, $reason, $user );
                        if ( $nullRevision === null ) {
                                return Status::newFatal( 'no-null-revision', $this->mTitle->getPrefixedText() );
                        }
@@ -2506,9 +2506,10 @@ class WikiPage implements Page, IDBAccessObject {
         * @param array $expiry Per restriction type expiration
         * @param int $cascade Set to false if cascading protection isn't allowed.
         * @param string $reason
+        * @param User|null $user
         * @return Revision|null Null on error
         */
-       public function insertProtectNullRevision( $revCommentMsg, array $limit, array $expiry, $cascade, $reason ) {
+       public function insertProtectNullRevision( $revCommentMsg, array $limit, array $expiry, $cascade, $reason, $user = null ) {
                global $wgContLang;
                $dbw = wfGetDB( DB_MASTER );
 
@@ -2534,7 +2535,7 @@ class WikiPage implements Page, IDBAccessObject {
                        )->inContentLanguage()->text();
                }
 
-               $nullRev = Revision::newNullRevision( $dbw, $this->getId(), $editComment, true );
+               $nullRev = Revision::newNullRevision( $dbw, $this->getId(), $editComment, true, $user );
                if ( $nullRev ) {
                        $nullRev->insertOn( $dbw );
 
index 06e3667..6b25460 100644 (file)
@@ -262,6 +262,7 @@ class InfoAction extends FormlessAction {
                        $sortKey = $pageProperties['defaultsort'];
                }
 
+               $sortKey = htmlspecialchars( $sortKey );
                $pageInfo['header-basic'][] = array( $this->msg( 'pageinfo-default-sort' ), $sortKey );
 
                // Page length (in bytes)
index 078e57a..554bfa6 100644 (file)
@@ -989,7 +989,18 @@ class ApiMain extends ApiBase {
        public function getVal( $name, $default = null ) {
                $this->mParamsUsed[$name] = true;
 
-               return $this->getRequest()->getVal( $name, $default );
+               $ret = $this->getRequest()->getVal( $name );
+               if ( $ret === null ) {
+                       if ( $this->getRequest()->getArray( $name ) !== null ) {
+                               // See bug 10262 for why we don't just join( '|', ... ) the
+                               // array.
+                               $this->setWarning(
+                                       "Parameter '$name' uses unsupported PHP array syntax"
+                               );
+                       }
+                       $ret = $default;
+               }
+               return $ret;
        }
 
        /**
@@ -999,9 +1010,7 @@ class ApiMain extends ApiBase {
         * @return bool
         */
        public function getCheck( $name ) {
-               $this->mParamsUsed[$name] = true;
-
-               return $this->getRequest()->getCheck( $name );
+               return $this->getVal( $name, null ) !== null;
        }
 
        /**
index 97f0009..fcba5b5 100644 (file)
@@ -346,6 +346,13 @@ class ApiParse extends ApiBase {
                        }
                }
 
+               if ( isset( $prop['modules'] ) ) {
+                       $result_array['modules'] = array_values( array_unique( $p_result->getModules() ) );
+                       $result_array['modulescripts'] = array_values( array_unique( $p_result->getModuleScripts() ) );
+                       $result_array['modulestyles'] = array_values( array_unique( $p_result->getModuleStyles() ) );
+                       $result_array['modulemessages'] = array_values( array_unique( $p_result->getModuleMessages() ) );
+               }
+
                if ( isset( $prop['iwlinks'] ) ) {
                        $result_array['iwlinks'] = $this->formatIWLinks( $p_result->getInterwikiLinks() );
                }
@@ -363,7 +370,8 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['limitreportdata'] ) ) {
-                       $result_array['limitreportdata'] = $this->formatLimitReportData( $p_result->getLimitReportData() );
+                       $result_array['limitreportdata'] =
+                               $this->formatLimitReportData( $p_result->getLimitReportData() );
                }
                if ( isset( $prop['limitreporthtml'] ) ) {
                        $limitreportHtml = EditPage::getPreviewLimitReport( $p_result );
@@ -398,6 +406,10 @@ class ApiParse extends ApiBase {
                        'iwlinks' => 'iw',
                        'sections' => 's',
                        'headitems' => 'hi',
+                       'modules' => 'm',
+                       'modulescripts' => 'm',
+                       'modulestyles' => 'm',
+                       'modulemessages' => 'm',
                        'properties' => 'pp',
                        'limitreportdata' => 'lr',
                );
@@ -488,7 +500,11 @@ class ApiParse extends ApiBase {
                        if ( $title ) {
                                $entry['url'] = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
                                // localised language name in user language (maybe set by uselang=)
-                               $entry['langname'] = Language::fetchLanguageName( $title->getInterwiki(), $this->getLanguage()->getCode() );
+                               $entry['langname'] = Language::fetchLanguageName(
+                                       $title->getInterwiki(),
+                                       $this->getLanguage()->getCode()
+                               );
+
                                // native language name
                                $entry['autonym'] = Language::fetchLanguageName( $title->getInterwiki() );
                        }
@@ -718,6 +734,7 @@ class ApiParse extends ApiBase {
                                        'displaytitle',
                                        'headitems',
                                        'headhtml',
+                                       'modules',
                                        'iwlinks',
                                        'wikitext',
                                        'properties',
@@ -774,6 +791,7 @@ class ApiParse extends ApiBase {
                                ' displaytitle   - Adds the title of the parsed wikitext',
                                ' headitems      - Gives items to put in the <head> of the page',
                                ' headhtml       - Gives parsed <head> of the page',
+                               ' modules        - Gives the ResourceLoader modules used on the page',
                                ' iwlinks        - Gives interwiki links in the parsed wikitext',
                                ' wikitext       - Gives the original wikitext that was parsed',
                                ' properties     - Gives various properties defined in the parsed wikitext',
index eaa9c01..4abd7f0 100644 (file)
@@ -93,8 +93,8 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
                                        ApiBase::PARAM_DFLT => 10,
                                        ApiBase::PARAM_TYPE => 'limit',
                                        ApiBase::PARAM_MIN => 1,
-                                       ApiBase::PARAM_MAX => 100, // Non-standard value for compatibility
-                                                                  // with action=opensearch
+                                       // Non-standard value for compatibility with action=opensearch
+                                       ApiBase::PARAM_MAX => 100,
                                        ApiBase::PARAM_MAX2 => 200,
                                ),
                        );
index cd98c52..2ed7d30 100644 (file)
@@ -116,7 +116,10 @@ class ApiQueryRedirects extends ApiQueryGeneratorBase {
                                $this->dieUsageMsg( 'show' );
                        }
                        $this->addWhereIf( "rd_fragment != $emptyString", isset( $show['fragment'] ) );
-                       $this->addWhereIf( "rd_fragment = $emptyString OR rd_fragment IS NULL", isset( $show['!fragment'] ) );
+                       $this->addWhereIf(
+                               "rd_fragment = $emptyString OR rd_fragment IS NULL",
+                               isset( $show['!fragment'] )
+                       );
                }
 
                $map = $pageSet->getAllTitlesByNamespace();
index 660055c..8eceb6f 100644 (file)
@@ -222,8 +222,12 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                );
 
                                // Add item to results and see whether it fits
-                               $fit = $apiResult->addValue( array( 'query', 'interwiki' . $this->getModuleName(), $result->getInterwikiPrefix()  ),
-                                       null, $vals );
+                               $fit = $apiResult->addValue(
+                                       array( 'query', 'interwiki' . $this->getModuleName(), $result->getInterwikiPrefix()  ),
+                                       null,
+                                       $vals
+                               );
+
                                if ( !$fit ) {
                                        // We hit the limit. We can't really provide any meaningful
                                        // pagination info so just bail out
index 3ef2bbe..49306d7 100644 (file)
@@ -234,7 +234,7 @@ class ApiUpload extends ApiBase {
                                        array( 'result' => 'Poll',
                                                'stage' => 'queued', 'status' => Status::newGood() )
                                );
-                               $ok = JobQueueGroup::singleton()->push( new AssembleUploadChunksJob(
+                               JobQueueGroup::singleton()->push( new AssembleUploadChunksJob(
                                        Title::makeTitle( NS_FILE, $filekey ),
                                        array(
                                                'filename' => $this->mParams['filename'],
@@ -242,13 +242,7 @@ class ApiUpload extends ApiBase {
                                                'session' => $this->getContext()->exportSession()
                                        )
                                ) );
-                               if ( $ok ) {
-                                       $result['result'] = 'Poll';
-                               } else {
-                                       UploadBase::setSessionStatus( $filekey, false );
-                                       $this->dieUsage(
-                                               "Failed to start AssembleUploadChunks.php", 'stashfailed' );
-                               }
+                               $result['result'] = 'Poll';
                        } else {
                                $status = $this->mUpload->concatenateChunks();
                                if ( !$status->isGood() ) {
@@ -625,7 +619,7 @@ class ApiUpload extends ApiBase {
                                $this->mParams['filekey'],
                                array( 'result' => 'Poll', 'stage' => 'queued', 'status' => Status::newGood() )
                        );
-                       $ok = JobQueueGroup::singleton()->push( new PublishStashedFileJob(
+                       JobQueueGroup::singleton()->push( new PublishStashedFileJob(
                                Title::makeTitle( NS_FILE, $this->mParams['filename'] ),
                                array(
                                        'filename' => $this->mParams['filename'],
@@ -636,13 +630,7 @@ class ApiUpload extends ApiBase {
                                        'session' => $this->getContext()->exportSession()
                                )
                        ) );
-                       if ( $ok ) {
-                               $result['result'] = 'Poll';
-                       } else {
-                               UploadBase::setSessionStatus( $this->mParams['filekey'], false );
-                               $this->dieUsage(
-                                       "Failed to start PublishStashedFile.php", 'publishfailed' );
-                       }
+                       $result['result'] = 'Poll';
                } else {
                        /** @var $status Status */
                        $status = $this->mUpload->performUpload( $this->mParams['comment'],
index 1c36ec0..3bbf1bb 100644 (file)
@@ -691,7 +691,6 @@ class LocalisationCache {
                global $IP;
                wfProfileIn( __METHOD__ );
 
-
                // This reads in the PHP i18n file with non-messages l10n data
                $fileName = Language::getMessagesFileName( $code );
                if ( !file_exists( $fileName ) ) {
index 69e1e9e..246f95d 100644 (file)
@@ -344,6 +344,9 @@ class ChangesList extends ContextSource {
         */
        public function insertArticleLink( &$s, &$rc, $unpatrolled, $watched ) {
                $params = array();
+               if ( $rc->getTitle()->isRedirect() ) {
+                       $params = array( 'redirect' => 'no' );
+               }
 
                $articlelink = Linker::linkKnown(
                        $rc->getTitle(),
index ae8baf2..64c69ef 100644 (file)
@@ -16,7 +16,9 @@ class ComposerPackageModifier {
        protected $versionNormalizer;
        protected $versionFetcher;
 
-       public function __construct( Package $package, ComposerVersionNormalizer $versionNormalizer, MediaWikiVersionFetcher $versionFetcher ) {
+       public function __construct( Package $package,
+               ComposerVersionNormalizer $versionNormalizer, MediaWikiVersionFetcher $versionFetcher
+       ) {
                $this->package = $package;
                $this->versionNormalizer = $versionNormalizer;
                $this->versionFetcher = $versionFetcher;
@@ -48,7 +50,10 @@ class ComposerPackageModifier {
                $mvVersion = $this->versionFetcher->fetchVersion();
                $mvVersion = $this->versionNormalizer->normalizeSuffix( $mvVersion );
 
-               $version = new VersionConstraint( '==', $this->versionNormalizer->normalizeLevelCount( $mvVersion ) );
+               $version = new VersionConstraint(
+                       '==',
+                       $this->versionNormalizer->normalizeLevelCount( $mvVersion )
+               );
                $version->setPrettyString( $mvVersion );
 
                return $version;
index 9e55059..4a3c2cb 100644 (file)
@@ -83,7 +83,7 @@ abstract class ContextSource implements IContextSource {
         * Get the Title object
         *
         * @since 1.18
-        * @return Title
+        * @return Title|null
         */
        public function getTitle() {
                return $this->getContext()->getTitle();
index f5616e0..32a650f 100644 (file)
@@ -138,7 +138,7 @@ class DerivativeContext extends ContextSource {
        /**
         * Get the Title object
         *
-        * @return Title
+        * @return Title|null
         */
        public function getTitle() {
                if ( !is_null( $this->title ) ) {
index f892b02..5534ee3 100644 (file)
@@ -37,7 +37,7 @@ interface IContextSource {
        /**
         * Get the Title object
         *
-        * @return Title
+        * @return Title|null
         */
        public function getTitle();
 
index 6f27a7a..4291e44 100644 (file)
@@ -131,7 +131,7 @@ class RequestContext implements IContextSource {
        /**
         * Get the Title object
         *
-        * @return Title
+        * @return Title|null
         */
        public function getTitle() {
                if ( $this->title === null ) {
index b502bb9..8288e65 100644 (file)
@@ -1088,6 +1088,11 @@ abstract class DatabaseBase implements IDatabase, DatabaseType {
 
                $queryId = MWDebug::query( $sql, $fname, $isMaster );
 
+               # Avoid fatals if close() was called
+               if ( !$this->isOpen() ) {
+                       throw new DBUnexpectedError( $this, "DB connection was already closed." );
+               }
+
                # Do the query and handle errors
                $ret = $this->doQuery( $commentedSql );
 
index 3bcf638..4d5c3dc 100644 (file)
@@ -347,14 +347,6 @@ class DBQueryError extends DBExpectedError {
                $this->fname = $fname;
        }
 
-       /**
-        * @return bool
-        */
-       function isLoggable() {
-               // Don't send to the exception log, already in dberror log
-               return false;
-       }
-
        /**
         * @return string
         */
index 0da47d3..1d05bf6 100644 (file)
@@ -215,7 +215,9 @@ class DatabaseMssql extends DatabaseBase {
 
                                foreach ( $errors as $err ) {
                                        if ( $err['SQLSTATE'] == '23000' && $err['code'] == '2601' ) {
-                                               continue; // duplicate key error
+                                               continue; // duplicate key error caused by unique index
+                                       } elseif ( $err['SQLSTATE'] == '23000' && $err['code'] == '2627' ) {
+                                               continue; // duplicate key error caused by primary key
                                        } elseif ( $err['SQLSTATE'] == '01000' && $err['code'] == '3621' ) {
                                                continue; // generic "the statement has been terminated" error
                                        }
@@ -991,18 +993,22 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * @param string $table
         * @param string $fname
-        * @param bool $schema
         * @return bool
         */
-       public function tableExists( $table, $fname = __METHOD__, $schema = false ) {
-               $res = sqlsrv_query( $this->mConn, "SELECT * FROM information_schema.tables
-                       WHERE table_type='BASE TABLE' AND table_name = '$table'" );
-               if ( $res === false ) {
-                       print "Error in tableExists query: " . $this->lastError();
+       public function tableExists( $table, $fname = __METHOD__ ) {
+               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
 
+               if ( $db !== false ) {
+                       // remote database
+                       wfDebug( "Attempting to call tableExists on a remote table" );
                        return false;
                }
-               if ( sqlsrv_fetch( $res ) ) {
+
+               $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.TABLES
+                       WHERE TABLE_TYPE = 'BASE TABLE'
+                       AND TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table'" );
+
+               if ( $res->numRows() ) {
                        return true;
                } else {
                        return false;
@@ -1017,15 +1023,18 @@ class DatabaseMssql extends DatabaseBase {
         * @return bool
         */
        public function fieldExists( $table, $field, $fname = __METHOD__ ) {
-               $table = $this->tableName( $table );
-               $res = sqlsrv_query( $this->mConn, "SELECT DATA_TYPE FROM INFORMATION_SCHEMA.Columns
-                       WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
-               if ( $res === false ) {
-                       print "Error in fieldExists query: " . $this->lastError();
+               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
 
+               if ( $db !== false ) {
+                       // remote database
+                       wfDebug( "Attempting to call fieldExists on a remote table" );
                        return false;
                }
-               if ( sqlsrv_fetch( $res ) ) {
+
+               $res = $this->query( "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
+                       WHERE TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
+
+               if ( $res->numRows() ) {
                        return true;
                } else {
                        return false;
@@ -1033,15 +1042,18 @@ class DatabaseMssql extends DatabaseBase {
        }
 
        public function fieldInfo( $table, $field ) {
-               $table = $this->tableName( $table );
-               $res = sqlsrv_query( $this->mConn, "SELECT * FROM INFORMATION_SCHEMA.Columns
-                       WHERE TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
-               if ( $res === false ) {
-                       print "Error in fieldInfo query: " . $this->lastError();
+               list( $db, $schema, $table ) = $this->tableName( $table, 'split' );
 
+               if ( $db !== false ) {
+                       // remote database
+                       wfDebug( "Attempting to call fieldInfo on a remote table" );
                        return false;
                }
-               $meta = $this->fetchRow( $res );
+
+               $res = $this->query( "SELECT * FROM INFORMATION_SCHEMA.COLUMNS
+                       WHERE TABLE_SCHEMA = '$schema' AND TABLE_NAME = '$table' AND COLUMN_NAME = '$field'" );
+
+               $meta = $res->fetchRow();
                if ( $meta ) {
                        return new MssqlField( $meta );
                }
@@ -1323,11 +1335,20 @@ class DatabaseMssql extends DatabaseBase {
        /**
         * call this instead of tableName() in the updater when renaming tables
         * @param string $name
-        * @param string $format
+        * @param string $format One of quoted, raw, or split
         * @return string
         */
        function realTableName( $name, $format = 'quoted' ) {
-               return parent::tableName( $name, $format );
+               $table = parent::tableName( $name, $format );
+               if ( $format == 'split' ) {
+                       // Used internally, we want the schema split off from the table name and returned
+                       // as a list with 3 elements (database, schema, table)
+                       $table = explode( '.', $table );
+                       if ( count( $table ) == 2 ) {
+                               array_unshift( $table, false );
+                       }
+               }
+               return $table;
        }
 
        /**
index 3433199..131b758 100644 (file)
@@ -831,7 +831,7 @@ __INDEXATTR__;
                $options = array(), $join_conds = array()
        ) {
                if ( is_array( $options ) ) {
-                       $forUpdateKey = array_search( 'FOR UPDATE', $options );
+                       $forUpdateKey = array_search( 'FOR UPDATE', $options, true );
                        if ( $forUpdateKey !== false && $join_conds ) {
                                unset( $options[$forUpdateKey] );
 
index abd44fd..0789b21 100644 (file)
@@ -502,18 +502,69 @@ class LinksUpdate extends SqlDataUpdate {
         */
        function getPropertyInsertions( $existing = array() ) {
                $diffs = array_diff_assoc( $this->mProperties, $existing );
+
                $arr = array();
-               foreach ( $diffs as $name => $value ) {
-                       $arr[] = array(
-                               'pp_page' => $this->mId,
-                               'pp_propname' => $name,
-                               'pp_value' => $value,
-                       );
+               foreach ( array_keys( $diffs ) as $name ) {
+                       $arr[] = $this->getPagePropRowData( $name );
                }
 
                return $arr;
        }
 
+       /**
+        * Returns an associative array to be used for inserting a row into
+        * the page_props table. Besides the given property name, this will
+        * include the page id from $this->mId and any property value from
+        * $this->mProperties.
+        *
+        * The array returned will include the pp_sortkey field if this
+        * is present in the database (as indicated by $wgPagePropsHaveSortkey).
+        * The sortkey value is currently determined by getPropertySortKeyValue().
+        *
+        * @note: this assumes that $this->mProperties[$prop] is defined.
+        *
+        * @param string $prop The name of the property.
+        *
+        * @return array
+        */
+       private function getPagePropRowData( $prop ) {
+               global $wgPagePropsHaveSortkey;
+
+               $value = $this->mProperties[$prop];
+
+               $row = array(
+                       'pp_page' => $this->mId,
+                       'pp_propname' => $prop,
+                       'pp_value' => $value,
+               );
+
+               if ( $wgPagePropsHaveSortkey ) {
+                       $row['pp_sortkey'] = $this->getPropertySortKeyValue( $value );
+               }
+
+               return $row;
+       }
+
+       /**
+        * Determines the sort key for the given property value.
+        * This will return $value if it is a float or int,
+        * 1 or resp. 0 if it is a bool, and null otherwise.
+        *
+        * @note: In the future, we may allow the sortkey to be specified explicitly
+        *        in ParserOutput::setProperty.
+        *
+        * @param mixed $value
+        *
+        * @return float|null
+        */
+       private function getPropertySortKeyValue( $value ) {
+               if ( is_int( $value ) || is_float( $value ) || is_bool( $value ) ) {
+                       return floatval( $value );
+               }
+
+               return null;
+       }
+
        /**
         * Get an array of interwiki insertions for passing to the DB
         * Skips the titles specified by the 2-D array $existing
index 0e38d68..a4c0168 100644 (file)
@@ -424,7 +424,9 @@ class DiffEngine {
                        }
 
                        $x1 = $xoff + (int)( ( $numer + ( $xlim - $xoff ) * $chunk ) / $nchunks );
+                       // @codingStandardsIgnoreFile Ignore Squiz.WhiteSpace.SemicolonSpacing.Incorrect
                        for ( ; $x < $x1; $x++ ) {
+                               // @codingStandardsIgnoreEnd
                                $line = $flip ? $this->yv[$x] : $this->xv[$x];
                                if ( empty( $ymatches[$line] ) ) {
                                        continue;
index 2b8cb00..82303b9 100644 (file)
@@ -135,7 +135,8 @@ class MWException extends Exception {
 
                if ( $wgShowExceptionDetails ) {
                        return '<p>' . nl2br( htmlspecialchars( MWExceptionHandler::getLogMessage( $this ) ) ) .
-                       '</p><p>Backtrace:</p><p>' . nl2br( htmlspecialchars( MWExceptionHandler::getRedactedTraceAsString( $this ) ) ) .
+                       '</p><p>Backtrace:</p><p>' .
+                       nl2br( htmlspecialchars( MWExceptionHandler::getRedactedTraceAsString( $this ) ) ) .
                        "</p>\n";
                } else {
                        return "<div class=\"errorbox\">" .
@@ -222,7 +223,9 @@ class MWException extends Exception {
                        echo "<!DOCTYPE html>\n" .
                                '<html><head>' .
                                // Mimick OutputPage::setPageTitle behaviour
-                               '<title>' . htmlspecialchars( $this->msg( 'pagetitle', "$1 - $wgSitename", $this->getPageTitle() ) ) . '</title>' .
+                               '<title>' .
+                               htmlspecialchars( $this->msg( 'pagetitle', "$1 - $wgSitename", $this->getPageTitle() ) ) .
+                               '</title>' .
                                '<style>body { font-family: sans-serif; margin: 0; padding: 0.5em 2em; }</style>' .
                                "</head><body>\n";
 
index 84daa80..a9af1e8 100644 (file)
@@ -989,8 +989,6 @@ abstract class File {
                                        $thumb = $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
                                        break;
                                }
-                               // Clean up broken thumbnails as needed
-                               $this->migrateThumbFile( $thumbName );
                                // Check if an up-to-date thumbnail already exists...
                                wfDebug( __METHOD__ . ": Doing stat for $thumbPath\n" );
                                if ( !( $flags & self::RENDER_FORCE ) && $this->repo->fileExists( $thumbPath ) ) {
index dbf6918..9b9f0a9 100644 (file)
@@ -121,7 +121,13 @@ class LocalFile extends File {
        /** @var bool True if file is not present in file system. Not to be cached in memcached */
        private $missing;
 
+       /** @var int UNIX timestamp of last markVolatile() call */
+       private $lastMarkedVolatile = 0;
+
        const LOAD_ALL = 1; // integer; load all the lazy fields too (like metadata)
+       const LOAD_VIA_SLAVE = 2; // integer; use a slave to load the data
+
+       const VOLATILE_TTL = 300; // integer; seconds
 
        /**
         * Create a LocalFile from a title
@@ -226,7 +232,7 @@ class LocalFile extends File {
        /**
         * Get the memcached key for the main data for this file, or false if
         * there is no access to the shared cache.
-        * @return bool
+        * @return string|bool
         */
        function getCacheKey() {
                $hashedName = md5( $this->getName() );
@@ -374,7 +380,7 @@ class LocalFile extends File {
        /**
         * Load file metadata from the DB
         */
-       function loadFromDB() {
+       function loadFromDB( $flags = 0 ) {
                # Polymorphic function name to distinguish foreign and local fetches
                $fname = get_class( $this ) . '::' . __FUNCTION__;
                wfProfileIn( $fname );
@@ -383,7 +389,10 @@ class LocalFile extends File {
                $this->dataLoaded = true;
                $this->extraDataLoaded = true;
 
-               $dbr = $this->repo->getMasterDB();
+               $dbr = ( $flags & self::LOAD_VIA_SLAVE )
+                       ? $this->repo->getSlaveDB()
+                       : $this->repo->getMasterDB();
+
                $row = $dbr->selectRow( 'image', $this->getCacheFields( 'img_' ),
                        array( 'img_name' => $this->getName() ), $fname );
 
@@ -408,19 +417,13 @@ class LocalFile extends File {
                # Unconditionally set loaded=true, we don't want the accessors constantly rechecking
                $this->extraDataLoaded = true;
 
-               $dbr = $this->repo->getSlaveDB();
-               // In theory the file could have just been renamed/deleted...oh well
-               $row = $dbr->selectRow( 'image', $this->getLazyCacheFields( 'img_' ),
-                       array( 'img_name' => $this->getName() ), $fname );
-
-               if ( !$row ) { // fallback to master
-                       $dbr = $this->repo->getMasterDB();
-                       $row = $dbr->selectRow( 'image', $this->getLazyCacheFields( 'img_' ),
-                               array( 'img_name' => $this->getName() ), $fname );
+               $fieldMap = $this->loadFieldsWithTimestamp( $this->repo->getSlaveDB(), $fname );
+               if ( !$fieldMap ) {
+                       $fieldMap = $this->loadFieldsWithTimestamp( $this->repo->getMasterDB(), $fname );
                }
 
-               if ( $row ) {
-                       foreach ( $this->unprefixRow( $row, 'img_' ) as $name => $value ) {
+               if ( $fieldMap ) {
+                       foreach ( $fieldMap as $name => $value ) {
                                $this->$name = $value;
                        }
                } else {
@@ -431,6 +434,32 @@ class LocalFile extends File {
                wfProfileOut( $fname );
        }
 
+       /**
+        * @param DatabaseBase $dbr
+        * @param string $fname
+        * @return array|false
+        */
+       private function loadFieldsWithTimestamp( $dbr, $fname ) {
+               $fieldMap = false;
+
+               $row = $dbr->selectRow( 'image', $this->getLazyCacheFields( 'img_' ),
+                       array( 'img_name' => $this->getName(), 'img_timestamp' => $this->getTimestamp() ),
+                       $fname );
+               if ( $row ) {
+                       $fieldMap = $this->unprefixRow( $row, 'img_' );
+               } else {
+                       # File may have been uploaded over in the meantime; check the old versions
+                       $row = $dbr->selectRow( 'oldimage', $this->getLazyCacheFields( 'oi_' ),
+                               array( 'oi_name' => $this->getName(), 'oi_timestamp' => $this->getTimestamp() ),
+                               $fname );
+                       if ( $row ) {
+                               $fieldMap = $this->unprefixRow( $row, 'oi_' );
+                       }
+               }
+
+               return $fieldMap;
+       }
+
        /**
         * @param array $row Row
         * @param string $prefix
@@ -509,7 +538,7 @@ class LocalFile extends File {
        function load( $flags = 0 ) {
                if ( !$this->dataLoaded ) {
                        if ( !$this->loadFromCache() ) {
-                               $this->loadFromDB();
+                               $this->loadFromDB( $this->isVolatile() ? 0 : self::LOAD_VIA_SLAVE );
                                $this->saveToCache();
                        }
                        $this->dataLoaded = true;
@@ -793,41 +822,6 @@ class LocalFile extends File {
        /** createThumb inherited */
        /** transform inherited */
 
-       /**
-        * Fix thumbnail files from 1.4 or before, with extreme prejudice
-        * @todo Do we still care about this? Perhaps a maintenance script
-        *   can be made instead. Enabling this code results in a serious
-        *   RTT regression for wikis without 404 handling.
-        *
-        * @param string $thumbName
-        */
-       function migrateThumbFile( $thumbName ) {
-               /* Old code for bug 2532
-               $thumbDir = $this->getThumbPath();
-               $thumbPath = "$thumbDir/$thumbName";
-               if ( is_dir( $thumbPath ) ) {
-                       // Directory where file should be
-                       // This happened occasionally due to broken migration code in 1.5
-                       // Rename to broken-*
-                       for ( $i = 0; $i < 100; $i++ ) {
-                               $broken = $this->repo->getZonePath( 'public' ) . "/broken-$i-$thumbName";
-                               if ( !file_exists( $broken ) ) {
-                                       rename( $thumbPath, $broken );
-                                       break;
-                               }
-                       }
-                       // Doesn't exist anymore
-                       clearstatcache();
-               }
-               */
-               /*
-               if ( $this->repo->fileExists( $thumbDir ) ) {
-                       // Delete file where directory should be
-                       $this->repo->cleanupBatch( array( $thumbDir ) );
-               }
-               */
-       }
-
        /** getHandler inherited */
        /** iconThumb inherited */
        /** getLastError inherited */
@@ -1395,7 +1389,8 @@ class LocalFile extends File {
                                $dbw,
                                $descTitle->getArticleID(),
                                $editSummary,
-                               false
+                               false,
+                               $user
                        );
                        if ( !is_null( $nullRevision ) ) {
                                $nullRevision->insertOn( $dbw );
@@ -1449,7 +1444,6 @@ class LocalFile extends File {
 
                wfProfileOut( __METHOD__ . '-edit' );
 
-
                if ( $reupload ) {
                        # Delete old thumbnails
                        wfProfileIn( __METHOD__ . '-purge' );
@@ -1851,6 +1845,8 @@ class LocalFile extends File {
                        } );
                }
 
+               $this->markVolatile(); // file may change soon
+
                return $dbw->selectField( 'image', '1',
                        array( 'img_name' => $this->getName() ), __METHOD__, array( 'FOR UPDATE' ) );
        }
@@ -1870,6 +1866,48 @@ class LocalFile extends File {
                }
        }
 
+       /**
+        * Mark a file as about to be changed
+        *
+        * This sets a cache key that alters master/slave DB loading behavior
+        *
+        * @return bool Success
+        */
+       protected function markVolatile() {
+               global $wgMemc;
+
+               $key = $this->repo->getSharedCacheKey( 'file-volatile', md5( $this->getName() ) );
+               if ( $key ) {
+                       $this->lastMarkedVolatile = time();
+                       return $wgMemc->set( $key, $this->lastMarkedVolatile, self::VOLATILE_TTL );
+               }
+
+               return true;
+       }
+
+       /**
+        * Check if a file is about to be changed or has been changed recently
+        *
+        * @see LocalFile::isVolatile()
+        * @return bool Whether the file is volatile
+        */
+       protected function isVolatile() {
+               global $wgMemc;
+
+               $key = $this->repo->getSharedCacheKey( 'file-volatile', md5( $this->getName() ) );
+               if ( !$key ) {
+                       // repo unavailable; bail.
+                       return false;
+               }
+
+               if ( $this->lastMarkedVolatile === 0 ) {
+                       $this->lastMarkedVolatile = $wgMemc->get( $key ) ?: 0;
+               }
+
+               $volatileDuration = time() - $this->lastMarkedVolatile;
+               return $volatileDuration <= self::VOLATILE_TTL;
+       }
+
        /**
         * Roll back the DB transaction and mark the image unlocked
         */
index d6c6a3c..ca92496 100644 (file)
@@ -174,10 +174,11 @@ class OldLocalFile extends LocalFile {
                return $this->exists() && !$this->isDeleted( File::DELETED_FILE );
        }
 
-       function loadFromDB() {
+       function loadFromDB( $flags = 0 ) {
                wfProfileIn( __METHOD__ );
 
                $this->dataLoaded = true;
+
                $dbr = $this->repo->getSlaveDB();
                $conds = array( 'oi_name' => $this->getName() );
                if ( is_null( $this->requestedTime ) ) {
index 10c9ce0..019eb2b 100644 (file)
@@ -338,8 +338,10 @@ class HTMLForm extends ContextSource {
                }
 
                if ( !$class ) {
-                       throw new MWException( "Descriptor with no class for $fieldname: " . print_r( $descriptor, true ) );
+                       throw new MWException( "Descriptor with no class for $fieldname: "
+                               . print_r( $descriptor, true ) );
                }
+
                return $class;
        }
 
index 248a6e4..51db148 100644 (file)
@@ -45,7 +45,9 @@ class MssqlInstaller extends DatabaseInstaller {
                '_WebWindowsAuthentication' => 'sqlauth',
        );
 
-       public $minimumVersion = '9.00.1399'; // SQL Server 2005 RTM (TODO: are SQL Express version numbers different?)
+       // SQL Server 2005 RTM
+       // @todo Are SQL Express version numbers different?)
+       public $minimumVersion = '9.00.1399';
 
        // These are schema-level privs
        // Note: the web user will be created will full permissions if possible, this permission
@@ -135,7 +137,12 @@ class MssqlInstaller extends DatabaseInstaller {
 
        public function submitConnectForm() {
                // Get variables from the request.
-               $newValues = $this->setVarsFromRequest( array( 'wgDBserver', 'wgDBname', 'wgDBmwschema', 'wgDBprefix' ) );
+               $newValues = $this->setVarsFromRequest( array(
+                       'wgDBserver',
+                       'wgDBname',
+                       'wgDBmwschema',
+                       'wgDBprefix'
+               ) );
 
                // Validate them.
                $status = Status::newGood();
@@ -163,7 +170,11 @@ class MssqlInstaller extends DatabaseInstaller {
                }
 
                // User box
-               $this->setVarsFromRequest( array( '_InstallUser', '_InstallPassword', '_InstallWindowsAuthentication' ) );
+               $this->setVarsFromRequest( array(
+                       '_InstallUser',
+                       '_InstallPassword',
+                       '_InstallWindowsAuthentication'
+               ) );
 
                // Try to connect
                $status = $this->getConnection();
@@ -309,7 +320,8 @@ class MssqlInstaller extends DatabaseInstaller {
 
                        if ( $this->schemaExists( $this->getVar( 'wgDBmwschema' ) ) ) {
                                // wgDBmwschema is validated to only contain alphanumeric + underscore, so this is safe
-                               $res = $conn->query( "SELECT permission_name FROM sys.fn_my_permissions( '{$this->getVar( 'wgDBmwschema' )}', 'SCHEMA' )" );
+                               $res = $conn->query( "SELECT permission_name FROM sys.fn_my_permissions( "
+                                       . "'{$this->getVar( 'wgDBmwschema' )}', 'SCHEMA' )" );
 
                                foreach ( $res as $row ) {
                                        $schemaPrivs[$row->permission_name] = true;
@@ -320,9 +332,11 @@ class MssqlInstaller extends DatabaseInstaller {
                // Now check all the grants we'll need to be doing to see if we can
                foreach ( $this->webUserPrivs as $permission ) {
                        if ( ( isset( $schemaPrivs[$permission] ) && $schemaPrivs[$permission] )
-                                       || ( isset( $dbPrivs[$implied[$permission][0]] ) && $dbPrivs[$implied[$permission][0]] )
-                                       || ( isset( $serverPrivs[$implied[$permission][1]] ) && $serverPrivs[$implied[$permission][1]] ) ) {
-
+                                       || ( isset( $dbPrivs[$implied[$permission][0]] )
+                                               && $dbPrivs[$implied[$permission][0]] )
+                                       || ( isset( $serverPrivs[$implied[$permission][1]] )
+                                               && $serverPrivs[$implied[$permission][1]] )
+                       ) {
                                unset( $grantOptions[$permission] );
                        }
                }
@@ -344,8 +358,11 @@ class MssqlInstaller extends DatabaseInstaller {
                } else {
                        $noCreateMsg = 'config-db-web-no-create-privs';
                }
+
                $wrapperStyle = $this->getVar( '_SameAccount' ) ? 'display: none' : '';
-               $displayStyle = $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth' ? 'display: none' : '';
+               $displayStyle = $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth'
+                       ? 'display: none'
+                       : '';
                $s = Html::openElement( 'fieldset' ) .
                        Html::element( 'legend', array(), wfMessage( 'config-db-web-account' )->text() ) .
                        $this->getCheckBox(
@@ -390,9 +407,13 @@ class MssqlInstaller extends DatabaseInstaller {
         * @return Status
         */
        public function submitSettingsForm() {
-               $this->setVarsFromRequest(
-                       array( 'wgDBuser', 'wgDBpassword', '_SameAccount', '_CreateDBAccount', '_WebWindowsAuthentication' )
-               );
+               $this->setVarsFromRequest( array(
+                               'wgDBuser',
+                               'wgDBpassword',
+                               '_SameAccount',
+                               '_CreateDBAccount',
+                               '_WebWindowsAuthentication'
+               ) );
 
                if ( $this->getVar( '_SameAccount' ) ) {
                        $this->setVar( '_WebWindowsAuthentication', $this->getVar( '_InstallWindowsAuthentication' ) );
@@ -408,7 +429,10 @@ class MssqlInstaller extends DatabaseInstaller {
                        $this->setVar( 'wgDBWindowsAuthentication', false );
                }
 
-               if ( $this->getVar( '_CreateDBAccount' ) && $this->getVar( '_WebWindowsAuthentication' ) == 'sqlauth' && strval( $this->getVar( 'wgDBpassword' ) ) == '' ) {
+               if ( $this->getVar( '_CreateDBAccount' )
+                       && $this->getVar( '_WebWindowsAuthentication' ) == 'sqlauth'
+                       && strval( $this->getVar( 'wgDBpassword' ) ) == ''
+               ) {
                        return Status::newFatal( 'config-db-password-empty', $this->getVar( 'wgDBuser' ) );
                }
 
@@ -471,13 +495,22 @@ class MssqlInstaller extends DatabaseInstaller {
                $dbName = $this->getVar( 'wgDBname' );
                $schemaName = $this->getVar( 'wgDBmwschema' );
                if ( !$this->databaseExists( $dbName ) ) {
-                       $conn->query( "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ), __METHOD__ );
+                       $conn->query(
+                               "CREATE DATABASE " . $conn->addIdentifierQuotes( $dbName ),
+                               __METHOD__
+                       );
                        $conn->selectDB( $dbName );
                        if ( !$this->schemaExists( $schemaName ) ) {
-                               $conn->query( "CREATE SCHEMA " . $conn->addIdentifierQuotes( $schemaName ), __METHOD__ );
+                               $conn->query(
+                                       "CREATE SCHEMA " . $conn->addIdentifierQuotes( $schemaName ),
+                                       __METHOD__
+                               );
                        }
                        if ( !$this->catalogExists( $schemaName ) ) {
-                               $conn->query( "CREATE FULLTEXT CATALOG " . $conn->addIdentifierQuotes( $schemaName ), __METHOD__ );
+                               $conn->query(
+                                       "CREATE FULLTEXT CATALOG " . $conn->addIdentifierQuotes( $schemaName ),
+                                       __METHOD__
+                               );
                        }
                }
                $this->setupSchemaVars();
@@ -529,7 +562,9 @@ class MssqlInstaller extends DatabaseInstaller {
                                try {
                                        $this->db->begin();
                                        $this->db->selectDB( 'master' );
-                                       $logintype = $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth' ? 'FROM WINDOWS' : "WITH PASSWORD = $escPass";
+                                       $logintype = $this->getVar( '_WebWindowsAuthentication' ) == 'windowsauth'
+                                               ? 'FROM WINDOWS'
+                                               : "WITH PASSWORD = $escPass";
                                        $this->db->query( "CREATE LOGIN $escUser $logintype" );
                                        $this->db->selectDB( $dbName );
                                        $this->db->query( "CREATE USER $escUser FOR LOGIN $escUser WITH DEFAULT_SCHEMA = $escSchema" );
@@ -603,7 +638,8 @@ class MssqlInstaller extends DatabaseInstaller {
                        $searchindex = $this->db->tableName( 'searchindex' );
                        $schema = $this->db->addIdentifierQuotes( $this->getVar( 'wgDBmwschema' ) );
                        try {
-                               $this->db->query( "CREATE FULLTEXT INDEX ON $searchindex (si_title, si_text) KEY INDEX si_page ON $schema" );
+                               $this->db->query( "CREATE FULLTEXT INDEX ON $searchindex (si_title, si_text) "
+                                       . "KEY INDEX si_page ON $schema" );
                        } catch ( DBQueryError $dqe ) {
                                $status->fatal( 'config-install-tables-failed', $dqe->getText() );
                        }
index 7d3833b..49e7b40 100644 (file)
@@ -37,10 +37,8 @@ class MssqlUpdater extends DatabaseUpdater {
 
        protected function getCoreUpdateList() {
                return array(
-                       array( 'disableContentHandlerUseDB' ),
-
                        // 1.23
-
+                       array( 'addField', 'mwuser', 'user_password_expires', 'patch-user_password_expires.sql' ),
                );
        }
 }
index bcd50b3..be1c8a7 100644 (file)
@@ -250,6 +250,7 @@ class MysqlUpdater extends DatabaseUpdater {
                        array( 'addIndex', 'logging', 'log_user_text_time', 'patch-logging_user_text_time_index.sql' ),
                        array( 'addField', 'page', 'page_links_updated', 'patch-page_links_updated.sql' ),
                        array( 'addField', 'user', 'user_password_expires', 'patch-user_password_expire.sql' ),
+                       array( 'addField', 'page_props', 'pp_sortkey', 'patch-pp_sortkey.sql' ),
                );
        }
 
index 15e18ed..a6d7cb2 100644 (file)
@@ -406,6 +406,9 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'recentchanges', 'rc_source', "TEXT NOT NULL DEFAULT ''" ),
                        array( 'addPgField', 'page', 'page_links_updated', "TIMESTAMPTZ NULL" ),
                        array( 'addPgField', 'mwuser', 'user_password_expires', 'TIMESTAMPTZ NULL' ),
+                       array( 'addPgField', 'page_props', 'pp_sortkey', 'float NULL' ),
+                       array( 'addPgIndex', 'page_props', 'pp_propname_sortkey_page',
+                                       '( pp_propname, pp_sortkey, pp_page ) WHERE ( pp_sortkey NOT NULL )' ),
                );
        }
 
index ea19efa..15f8160 100644 (file)
@@ -128,6 +128,7 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'addIndex', 'logging', 'log_user_text_time', 'patch-logging_user_text_time_index.sql' ),
                        array( 'addField', 'page', 'page_links_updated', 'patch-page_links_updated.sql' ),
                        array( 'addField', 'user', 'user_password_expires', 'patch-user_password_expire.sql' ),
+                       array( 'addField', 'page_props', 'pp_sortkey', 'patch-pp_sortkey.sql' ),
                );
        }
 
index 48dffe4..b3a67f1 100644 (file)
        "config-download-localsettings": "Загрузіць <code>LocalSettings.php</code>",
        "config-help": "дапамога",
        "config-nofile": "Файл «$1» ня знойдзены. Ці быў ён выдалены?",
-       "config-extension-link": "Ці ведаеце вы, што вашая вікі падтрымлівае [//www.mediawiki.org/wiki/Manual:Extensions пашырэньні]?\n\nВы можаце праглядзець [//www.mediawiki.org/wiki/Category:Extensions_by_category пашырэньні паводле катэгорыяў] або [//www.mediawiki.org/wiki/Extension_Matrix матрыцу пашырэньняў] дзеля іх поўнага сьпісу.",
+       "config-extension-link": "Ці ведаеце вы, што вашая вікі падтрымлівае [//www.mediawiki.org/wiki/Manual:Extensions пашырэньні]?\n\nВы можаце праглядзець [//www.mediawiki.org/wiki/Category:Extensions_by_category пашырэньні паводле катэгорыяў].",
        "mainpagetext": "'''MediaWiki пасьпяхова ўсталяваная.'''",
        "mainpagedocfooter": "Глядзіце [//meta.wikimedia.org/wiki/Help:Contents дапаможнік карыстальніка] для атрыманьня інфармацыі па карыстаньні вікі-праграмамі.\n\n== З чаго пачаць ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Сьпіс парамэтраў канфігурацыі]\n* [//www.mediawiki.org/wiki/Manual:FAQ Частыя пытаньні MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Пераклад MediaWiki на вашую мову]"
 }
index 2307b76..d413933 100644 (file)
@@ -6,7 +6,8 @@
                        "Mormegil",
                        "아라",
                        "Matěj Grabovský",
-                       "Paxt"
+                       "Paxt",
+                       "Matěj Suchánek"
                ]
        },
        "config-desc": "Instalační program pro MediaWiki",
        "config-db-username": "Databázové uživatelské jméno:",
        "config-db-password": "Databázové heslo:",
        "config-db-password-empty": "Zadejte heslo pro nového databázového uživatele: $1.\nPřestože může jít zakládat nové uživatele i bez hesel, není to bezpečné.",
-       "config-db-username-empty": "Musíte zadat hodnotu pro „{{int:config-db-username}}“",
+       "config-db-username-empty": "Musíte zadat hodnotu pro „{{int:config-db-username}}“.",
        "config-db-install-username": "Zadejte uživatelské jméno, které se použije pro připojení k databázi v průběhu instalace.\nToto není jméno uživatelského účtu MediaWiki; toto je uživatelské jméno k vaší databázi.",
        "config-db-install-password": "Zadejte heslo, které se použije pro připojení k databázi v průběhu instalace.\nToto není heslo uživatelského účtu MediaWiki; toto je heslo k vaší databázi.",
        "config-db-install-help": "Zadejte uživatelské jméno a heslo, které se použijí pro připojení k databázi v průběhu instalace.",
        "config-header-oracle": "Nastavení Oracle",
        "config-header-mssql": "Nastavení Microsoft SQL Serveru",
        "config-invalid-db-type": "Chybný typ databáze",
-       "config-missing-db-name": "Musíte zadat hodnotu pro „{{int:config-db-name}}“",
-       "config-missing-db-host": "Musíte zadat hodnotu pro „{{int:config-db-host}}“",
-       "config-missing-db-server-oracle": "Musíte zadat hodnotu pro „{{int:config-db-host-oracle}}“",
+       "config-missing-db-name": "Musíte zadat hodnotu pro „{{int:config-db-name}}“.",
+       "config-missing-db-host": "Musíte zadat hodnotu pro „{{int:config-db-host}}“.",
+       "config-missing-db-server-oracle": "Musíte zadat hodnotu pro „{{int:config-db-host-oracle}}“.",
        "config-invalid-db-server-oracle": "Chybné databázové TNS „$1“.\nPoužívejte buď „TNS Name“ nebo „Easy Connect“ (vizte [http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).",
        "config-invalid-db-name": "Chybné jméno databáze „$1“.\nPoužívejte pouze ASCII písmena (a-z, A-Z), čísla (0-9), podtržítko (_) a spojovník (-).",
        "config-invalid-db-prefix": "Chybný databázový prefix „$1“.\nPoužívejte pouze ASCII písmena (a-z, A-Z), čísla (0-9), podtržítko (_) a spojovník (-).",
        "config-download-localsettings": "Stáhnout <code>LocalSettings.php</code>",
        "config-help": "nápověda",
        "config-nofile": "Soubor „$1“ nelze nalézt. Byl smazán?",
-       "config-extension-link": "Věděli jste, že vaše wiki podporuje [//www.mediawiki.org/wiki/Manual:Extensions rozšíření]?\n\nMůžete procházet [//www.mediawiki.org/wiki/Category:Extensions_by_category rozšíření po kategoriích] nebo si prohlédnout [//www.mediawiki.org/wiki/Extension_Matrix Matici rozšíření] obsahující úplný seznam.",
+       "config-extension-link": "Věděli jste, že vaše wiki podporuje [//www.mediawiki.org/wiki/Manual:Extensions rozšíření]?\n\nMůžete si prohlédnout [//www.mediawiki.org/wiki/Category:Extensions_by_category seznam rozšíření po kategoriích].",
        "mainpagetext": "'''MediaWiki byla úspěšně nainstalována.'''",
        "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents Uživatelská příručka] vám napoví, jak MediaWiki používat.\n\n== Začínáme ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Nastavení konfigurace]\n* [//www.mediawiki.org/wiki/Manual:FAQ Často kladené otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]"
 }
index e79280b..0b7aad9 100644 (file)
        "config-download-localsettings": "<code>LocalSettings.php</code> herunterladen",
        "config-help": "Hilfe",
        "config-nofile": "Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?",
-       "config-extension-link": "Wusstest du, dass dein Wiki die Nutzung von [//www.mediawiki.org/wiki/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst [//www.mediawiki.org/wiki/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen oder die [//www.mediawiki.org/wiki/Extension_Matrix Matrix der Erweiterungen] ansehen, um eine Übersicht zu verfügbaren Erweiterungen zu erhalten.",
+       "config-extension-link": "Wusstest du, dass dein Wiki die Nutzung von [//www.mediawiki.org/wiki/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst [//www.mediawiki.org/wiki/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen.",
        "mainpagetext": "'''MediaWiki wurde erfolgreich installiert.'''",
        "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Lokalisiere MediaWiki für deine Sprache]"
 }
index 9217188..a120e24 100644 (file)
 {
-    "@metadata": {
-        "authors": []
-    },
-    "config-desc": "The installer for MediaWiki",
-    "config-title": "MediaWiki $1 installation",
-    "config-information": "Information",
-    "config-localsettings-upgrade": "A <code>LocalSettings.php</code> file has been detected.\nTo upgrade this installation, please enter the value of <code>$wgUpgradeKey</code> in the box below.\nYou will find it in <code>LocalSettings.php</code>.",
-    "config-localsettings-cli-upgrade": "A <code>LocalSettings.php</code> file has been detected.\nTo upgrade this installation, please run <code>update.php</code> instead",
-    "config-localsettings-key": "Upgrade key:",
-    "config-localsettings-badkey": "The key you provided is incorrect.",
-    "config-upgrade-key-missing": "An existing installation of MediaWiki has been detected.\nTo upgrade this installation, please put the following line at the bottom of your <code>LocalSettings.php</code>:\n\n$1",
-    "config-localsettings-incomplete": "The existing <code>LocalSettings.php</code> appears to be incomplete.\nThe $1 variable is not set.\nPlease change <code>LocalSettings.php</code> so that this variable is set, and click \"{{int:Config-continue}}\".",
-    "config-localsettings-connection-error": "An error was encountered when connecting to the database using the settings specified in <code>LocalSettings.php</code>. Please fix these settings and try again.\n\n$1",
-    "config-session-error": "Error starting session: $1",
-    "config-session-expired": "Your session data seems to have expired.\nSessions are configured for a lifetime of $1.\nYou can increase this by setting <code>session.gc_maxlifetime</code> in php.ini.\nRestart the installation process.",
-    "config-no-session": "Your session data was lost!\nCheck your php.ini and make sure <code>session.save_path</code> is set to an appropriate directory.",
-    "config-your-language": "Your language:",
-    "config-your-language-help": "Select a language to use during the installation process.",
-    "config-wiki-language": "Wiki language:",
-    "config-wiki-language-help": "Select the language that the wiki will predominantly be written in.",
-    "config-back": "← Back",
-    "config-continue": "Continue →",
-    "config-page-language": "Language",
-    "config-page-welcome": "Welcome to MediaWiki!",
-    "config-page-dbconnect": "Connect to database",
-    "config-page-upgrade": "Upgrade existing installation",
-    "config-page-dbsettings": "Database settings",
-    "config-page-name": "Name",
-    "config-page-options": "Options",
-    "config-page-install": "Install",
-    "config-page-complete": "Complete!",
-    "config-page-restart": "Restart installation",
-    "config-page-readme": "Read me",
-    "config-page-releasenotes": "Release notes",
-    "config-page-copying": "Copying",
-    "config-page-upgradedoc": "Upgrading",
-    "config-page-existingwiki": "Existing wiki",
-    "config-help-restart": "Do you want to clear all saved data that you have entered and restart the installation process?",
-    "config-restart": "Yes, restart it",
-    "config-welcome": "=== Environmental checks ===\nBasic checks will now be performed to see if this environment is suitable for MediaWiki installation.\nRemember to include this information if you seek support on how to complete the installation.",
-    "config-copyright": "=== Copyright and Terms ===\n\n$1\n\nThis 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.\n\nThis program is distributed in the hope that it will be useful, but <strong>without any warranty</strong>; without even the implied warranty of <strong>merchantability</strong> or <strong>fitness for a particular purpose</strong>.\nSee the GNU General Public License for more details.\n\nYou should have received <doclink href=Copying>a copy of the GNU General Public License</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, or [http://www.gnu.org/copyleft/gpl.html read it online].",
-    "config-sidebar": "* [//www.mediawiki.org MediaWiki home]\n* [//www.mediawiki.org/wiki/Help:Contents User's Guide]\n* [//www.mediawiki.org/wiki/Manual:Contents Administrator's Guide]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copying</doclink>\n* <doclink href=UpgradeDoc>Upgrading</doclink>",
-    "config-env-good": "The environment has been checked.\nYou can install MediaWiki.",
-    "config-env-bad": "The environment has been checked.\nYou cannot install MediaWiki.",
-    "config-env-php": "PHP $1 is installed.",
-    "config-env-php-toolow": "PHP $1 is installed.\nHowever, MediaWiki requires PHP $2 or higher.",
-    "config-unicode-using-utf8": "Using Brion Vibber's utf8_normalize.so for Unicode normalization.",
-    "config-unicode-using-intl": "Using the [http://pecl.php.net/intl intl PECL extension] for Unicode normalization.",
-    "config-unicode-pure-php-warning": "<strong>Warning:</strong> The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalization, falling back to slow pure-PHP implementation.\nIf you run a high-traffic site, you should read a little on [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode normalization].",
-    "config-unicode-update-warning": "<strong>Warning:</strong> The installed version of the Unicode normalization wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.\nYou should [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade] if you are at all concerned about using Unicode.",
-    "config-no-db": "Could not find a suitable database driver! You need to install a database driver for PHP.\nThe following database types are supported: $1.\n\nIf you compiled PHP yourself, reconfigure it with a database client enabled, for example, using <code>./configure --with-mysqli</code>.\nIf you installed PHP from a Debian or Ubuntu package, then you also need to install, for example, the <code>php5-mysql</code> package.",
-    "config-outdated-sqlite": "<strong>Warning:</strong> you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
-    "config-no-fts3": "<strong>Warning:</strong> SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
-    "config-register-globals": "<strong>Warning: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.\nDisable it if you can.</strong>\nMediaWiki will work, but your server is exposed to potential security vulnerabilities.",
-    "config-magic-quotes-runtime": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is active!'</strong>\nThis option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
-    "config-magic-quotes-sybase": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] is active!</strong>\nThis option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
-    "config-mbstring": "<strong>Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!</strong>\nThis option causes errors and may corrupt data unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
-    "config-safe-mode": "<strong>Warning:</strong> PHP's [http://www.php.net/features.safe-mode safe mode] is active.\nIt may cause problems, particularly if using file uploads and <code>math</code> support.",
-    "config-xml-bad": "PHP's XML module is missing.\nMediaWiki requires functions in this module and will not work in this configuration.\nIf you're running Mandrake, install the php-xml package.",
-    "config-pcre-old": "<strong>Fatal:</strong> PCRE $1 or later is required.\nYour PHP binary is linked with PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE More information].",
-    "config-pcre-no-utf8": "<strong>Fatal:</strong> PHP's PCRE module seems to be compiled without PCRE_UTF8 support.\nMediaWiki requires UTF-8 support to function correctly.",
-    "config-memory-raised": "PHP's <code>memory_limit</code> is $1, raised to $2.",
-    "config-memory-bad": "<strong>Warning:</strong> PHP's <code>memory_limit</code> is $1.\nThis is probably too low.\nThe installation may fail!",
-    "config-ctype": "<strong>Fatal:</strong> PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
-    "config-json": "<strong>Fatal:</strong> PHP was compiled without JSON support.\nYou must install either the PHP JSON extension or the [http://pecl.php.net/package/jsonc PECL jsonc] extension before installing MediaWiki.\n* The PHP extension is included in Red Hat Enterprise Linux (CentOS) 5 and 6, though must be enabled in <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.\n* Some Linux distributions released after May 2013 omit the PHP extension, instead packaging the PECL extension as <code>php5-json</code> or <code>php-pecl-jsonc</code>.",
-    "config-xcache": "[http://xcache.lighttpd.net/ XCache] is installed",
-    "config-apc": "[http://www.php.net/apc APC] is installed",
-    "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] is installed",
-    "config-no-cache": "<strong>Warning:</strong> Could not find [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] or [http://www.iis.net/download/WinCacheForPhp WinCache].\nObject caching is not enabled.",
-    "config-mod-security": "<strong>Warning:</strong> Your web server has [http://modsecurity.org/ mod_security] enabled. If misconfigured, it can cause problems for MediaWiki or other software that allows users to post arbitrary content.\nRefer to [http://modsecurity.org/documentation/ mod_security documentation] or contact your host's support if you encounter random errors.",
-    "config-diff3-bad": "GNU diff3 not found.",
-    "config-git": "Found the Git version control software: <code>$1</code>.",
-    "config-git-bad": "Git version control software not found.",
-    "config-imagemagick": "Found ImageMagick: <code>$1</code>.\nImage thumbnailing will be enabled if you enable uploads.",
-    "config-gd": "Found GD graphics library built-in.\nImage thumbnailing will be enabled if you enable uploads.",
-    "config-no-scaling": "Could not find GD library or ImageMagick.\nImage thumbnailing will be disabled.",
-    "config-no-uri": "<strong>Error:</strong> Could not determine the current URI.\nInstallation aborted.",
-    "config-no-cli-uri": "<strong>Warning:</strong> No <code>--scriptpath</code> specified, using default: <code>$1</code>.",
-    "config-using-server": "Using server name \"<nowiki>$1</nowiki>\".",
-    "config-using-uri": "Using server URL \"<nowiki>$1$2</nowiki>\".",
-    "config-uploads-not-safe": "<strong>Warning:</strong> Your default directory for uploads <code>$1</code> is vulnerable to arbitrary scripts execution.\nAlthough MediaWiki checks all uploaded files for security threats, it is highly recommended to [//www.mediawiki.org/wiki/Manual:Security#Upload_security close this security vulnerability] before enabling uploads.",
-    "config-no-cli-uploads-check": "<strong>Warning:</strong> Your default directory for uploads (<code>$1</code>) is not checked for vulnerability\nto arbitrary script execution during the CLI install.",
-    "config-brokenlibxml": "Your system has a combination of PHP and libxml2 versions that is buggy and can cause hidden data corruption in MediaWiki and other web applications.\nUpgrade to libxml2 2.7.3 or later ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nInstallation aborted.",
-    "config-suhosin-max-value-length": "Suhosin is installed and limits the GET parameter <code>length</code> to $1 bytes.\nMediaWiki's ResourceLoader component will work around this limit, but that will degrade performance.\nIf at all possible, you should set <code>suhosin.get.max_value_length</code> to 1024 or higher in <code>php.ini</code>, and set <code>$wgResourceLoaderMaxQueryLength</code> to the same value in <code>LocalSettings.php</code>.",
-    "config-db-type": "Database type:",
-    "config-db-host": "Database host:",
-    "config-db-host-help": "If your database server is on different server, enter the host name or IP address here.\n\nIf you are using shared web hosting, your hosting provider should give you the correct host name in their documentation.\n\nIf you are installing on a Windows server and using MySQL, using \"localhost\" may not work for the server name. If it does not, try \"127.0.0.1\" for the local IP address.\n\nIf you are using PostgreSQL, leave this field blank to connect via a Unix socket.",
-    "config-db-host-oracle": "Database TNS:",
-    "config-db-host-oracle-help": "Enter a valid [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; a tnsnames.ora file must be visible to this installation.<br />If you are using client libraries 10g or newer you can also use the [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect] naming method.",
-    "config-db-wiki-settings": "Identify this wiki",
-    "config-db-name": "Database name:",
-    "config-db-name-help": "Choose a name that identifies your wiki.\nIt should not contain spaces.\n\nIf you are using shared web hosting, your hosting provider will either give you a specific database name to use or let you create databases via a control panel.",
-    "config-db-name-oracle": "Database schema:",
-    "config-db-account-oracle-warn": "There are three supported scenarios for installing Oracle as database backend:\n\nIf you wish to create database account as part of the installation process, please supply an account with SYSDBA role as database account for installation and specify the desired credentials for the web-access account, otherwise you can either create the web-access account manually and supply only that account (if it has required permissions to create the schema objects) or supply two different accounts, one with create privileges and a restricted one for web access.\n\nScript for creating an account with required privileges can be found in \"maintenance/oracle/\" directory of this installation. Keep in mind that using a restricted account will disable all maintenance capabilities with the default account.",
-    "config-db-install-account": "User account for installation",
-    "config-db-username": "Database username:",
-    "config-db-password": "Database password:",
-    "config-db-password-empty": "Please enter a password for the new database user: $1.\nWhile it may be possible to create users with no passwords, it is not secure.",
-    "config-db-username-empty": "You must enter a value for \"{{int:config-db-username}}\".",
-    "config-db-install-username": "Enter the username that will be used to connect to the database during the installation process.\nThis is not the username of the MediaWiki account; this is the username for your database.",
-    "config-db-install-password": "Enter the password that will be used to connect to the database during the installation process.\nThis is not the password for the MediaWiki account; this is the password for your database.",
-    "config-db-install-help": "Enter the username and password that will be used to connect to the database during the installation process.",
-    "config-db-account-lock": "Use the same username and password during normal operation",
-    "config-db-wiki-account": "User account for normal operation",
-    "config-db-wiki-help": "Enter the username and password that will be used to connect to the database during normal wiki operation.\nIf the account does not exist, and the installation account has sufficient privileges, this user account will be created with the minimum privileges required to operate the wiki.",
-    "config-db-prefix": "Database table prefix:",
-    "config-db-prefix-help": "If you need to share one database between multiple wikis, or between MediaWiki and another web application, you may choose to add a prefix to all the table names to avoid conflicts.\nDo not use spaces.\n\nThis field is usually left empty.",
-    "config-db-charset": "Database character set",
-    "config-charset-mysql5-binary": "MySQL 4.1/5.0 binary",
-    "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
-    "config-charset-mysql4": "MySQL 4.0 backwards-compatible UTF-8",
-    "config-charset-help": "<strong>Warning:</strong> If you use <strong>backwards-compatible UTF-8</strong> on MySQL 4.1+, and subsequently back up the database with <code>mysqldump</code>, it may destroy all non-ASCII characters, irreversibly corrupting your backups!\n\nIn <strong>binary mode</strong>, MediaWiki stores UTF-8 text to the database in binary fields.\nThis is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters.\nIn <strong>UTF-8 mode</strong>, MySQL will know what character set your data is in, and can present and convert it appropriately,\nbut it will not let you store characters above the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
-    "config-mysql-old": "MySQL $1 or later is required. You have $2.",
-    "config-db-port": "Database port:",
-    "config-db-schema": "Schema for MediaWiki:",
-    "config-db-schema-help": "This schema will usually be fine.\nOnly change it if you know you need to.",
-    "config-pg-test-error": "Cannot connect to database <strong>$1</strong>: $2",
-    "config-sqlite-dir": "SQLite data directory:",
-    "config-sqlite-dir-help": "SQLite stores all data in a single file.\n\nThe directory you provide must be writable by the webserver during installation.\n\nIt should <strong>not</strong> be accessible via the web, this is why we're not putting it where your PHP files are.\n\nThe installer will write a <code>.htaccess</code> file along with it, but if that fails someone can gain access to your raw database.\nThat includes raw user data (email addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki.\n\nConsider putting the database somewhere else altogether, for example in <code>/var/lib/mediawiki/yourwiki</code>.",
-    "config-oracle-def-ts": "Default tablespace:",
-    "config-oracle-temp-ts": "Temporary tablespace:",
-    "config-type-mysql": "MySQL (or compatible)",
-    "config-type-postgres": "PostgreSQL",
-    "config-type-sqlite": "SQLite",
-    "config-type-oracle": "Oracle",
-    "config-type-mssql": "Microsoft SQL Server",
-    "config-support-info": "MediaWiki supports the following database systems:\n\n$1\n\nIf you do not see the database system you are trying to use listed below, then follow the instructions linked above to enable support.",
-    "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] is the primary target for MediaWiki and is best supported. MediaWiki also works with [{{int:version-db-mariadb-url}} MariaDB] and [{{int:version-db-percona-url}} Percona Server], which are MySQL compatible. ([http://www.php.net/manual/en/mysqli.installation.php How to compile PHP with MySQL support])",
-    "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] is a popular open source database system as an alternative to MySQL. There may be some minor outstanding bugs, and it is not recommended for use in a production environment. ([http://www.php.net/manual/en/pgsql.installation.php How to compile PHP with PostgreSQL support])",
-    "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] is a lightweight database system that is very well supported. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)",
-    "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] is a commercial enterprise database. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
-    "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] is a commercial enterprise database for Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV support])",
-    "config-header-mysql": "MySQL settings",
-    "config-header-postgres": "PostgreSQL settings",
-    "config-header-sqlite": "SQLite settings",
-    "config-header-oracle": "Oracle settings",
-    "config-header-mssql": "Microsoft SQL Server settings",
-    "config-invalid-db-type": "Invalid database type.",
-    "config-missing-db-name": "You must enter a value for \"{{int:config-db-name}}\".",
-    "config-missing-db-host": "You must enter a value for \"{{int:config-db-host}}\".",
-    "config-missing-db-server-oracle": "You must enter a value for \"{{int:config-db-host-oracle}}\".",
-    "config-invalid-db-server-oracle": "Invalid database TNS \"$1\".\nUse either \"TNS Name\" or an \"Easy Connect\" string ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).",
-    "config-invalid-db-name": "Invalid database name \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).",
-    "config-invalid-db-prefix": "Invalid database prefix \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).",
-    "config-connection-error": "$1.\n\nCheck the host, username and password and try again.",
-    "config-invalid-schema": "Invalid schema for MediaWiki \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9) and underscores (_).",
-    "config-db-sys-create-oracle": "Installer only supports using a SYSDBA account for creating a new account.",
-    "config-db-sys-user-exists-oracle": "User account \"$1\" already exists. SYSDBA can only be used for creating of a new account!",
-    "config-postgres-old": "PostgreSQL $1 or later is required. You have $2.",
-    "config-mssql-old": "Microsoft SQL Server $1 or later is required. You have $2.",
-    "config-sqlite-name-help": "Choose a name that identifies your wiki.\nDo not use spaces or hyphens.\nThis will be used for the SQLite data file name.",
-    "config-sqlite-parent-unwritable-group": "Cannot create the data directory <code><nowiki>$1</nowiki></code>, because the parent directory <code><nowiki>$2</nowiki></code> is not writable by the webserver.\n\nThe installer has determined the user your webserver is running as.\nMake the <code><nowiki>$3</nowiki></code> directory writable by it to continue.\nOn a Unix/Linux system do:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
-    "config-sqlite-parent-unwritable-nogroup": "Cannot create the data directory <code><nowiki>$1</nowiki></code>, because the parent directory <code><nowiki>$2</nowiki></code> is not writable by the webserver.\n\nThe installer could not determine the user your webserver is running as.\nMake the <code><nowiki>$3</nowiki></code> directory globally writable by it (and others!) to continue.\nOn a Unix/Linux system do:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
-    "config-sqlite-mkdir-error": "Error creating the data directory \"$1\".\nCheck the location and try again.",
-    "config-sqlite-dir-unwritable": "Unable to write to the directory \"$1\".\nChange its permissions so that the webserver can write to it, and try again.",
-    "config-sqlite-connection-error": "$1.\n\nCheck the data directory and database name below and try again.",
-    "config-sqlite-readonly": "The file <code>$1</code> is not writeable.",
-    "config-sqlite-cant-create-db": "Could not create database file <code>$1</code>.",
-    "config-sqlite-fts3-downgrade": "PHP is missing FTS3 support, downgrading tables.",
-    "config-can-upgrade": "There are MediaWiki tables in this database.\nTo upgrade them to MediaWiki $1, click <strong>Continue</strong>.",
-    "config-upgrade-done": "Upgrade complete.\n\nYou can now [$1 start using your wiki].\n\nIf you want to regenerate your <code>LocalSettings.php</code> file, click the button below.\nThis is <strong>not recommended</strong> unless you are having problems with your wiki.",
-    "config-upgrade-done-no-regenerate": "Upgrade complete.\n\nYou can now [$1 start using your wiki].",
-    "config-regenerate": "Regenerate LocalSettings.php →",
-    "config-show-table-status": "<code>SHOW TABLE STATUS</code> query failed!",
-    "config-unknown-collation": "<strong>Warning:</strong> Database is using unrecognized collation.",
-    "config-db-web-account": "Database account for web access",
-    "config-db-web-help": "Select the username and password that the web server will use to connect to the database server, during ordinary operation of the wiki.",
-    "config-db-web-account-same": "Use the same account as for installation",
-    "config-db-web-create": "Create the account if it does not already exist",
-    "config-db-web-no-create-privs": "The account you specified for installation does not have enough privileges to create an account.\nThe account you specify here must already exist.",
-    "config-mysql-engine": "Storage engine:",
-    "config-mysql-innodb": "InnoDB",
-    "config-mysql-myisam": "MyISAM",
-    "config-mysql-myisam-dep": "<strong>Warning:</strong> You have selected MyISAM as storage engine for MySQL, which is not recommended for use with MediaWiki, because:\n* it barely supports concurrency due to table locking\n* it is more prone to corruption than other engines\n* the MediaWiki codebase does not always handle MyISAM as it should\n\nIf your MySQL installation supports InnoDB, it is highly recommended that you choose that instead.\nIf your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
-    "config-mysql-only-myisam-dep": "<strong>Warning:</strong> MyISAM is the only available storage engine for MySQL on this machine, and this is not recommended for use with MediaWiki, because:\n* it barely supports concurrency due to table locking\n* it is more prone to corruption than other engines\n* the MediaWiki codebase does not always handle MyISAM as it should\n\nYour MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
-    "config-mysql-engine-help": "<strong>InnoDB</strong> is almost always the best option, since it has good concurrency support.\n\n<strong>MyISAM</strong> may be faster in single-user or read-only installations.\nMyISAM databases tend to get corrupted more often than InnoDB databases.",
-    "config-mysql-charset": "Database character set:",
-    "config-mysql-binary": "Binary",
-    "config-mysql-utf8": "UTF-8",
-    "config-mysql-charset-help": "In <strong>binary mode</strong>, MediaWiki stores UTF-8 text to the database in binary fields.\nThis is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters.\n\nIn <strong>UTF-8 mode</strong>, MySQL will know what character set your data is in, and can present and convert it appropriately, but it will not let you store characters above the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
-    "config-mssql-auth": "Authentication type:",
-    "config-mssql-install-auth": "Select the authentication type that will be used to connect to the database during the installation process.\nIf you select \"{{int:config-mssql-windowsauth}}\", the credentials of whatever user the webserver is running as will be used.",
-    "config-mssql-web-auth": "Select the authentication type that the web server will use to connect to the database server, during ordinary operation of the wiki.\nIf you select \"{{int:config-mssql-windowsauth}}\", the credentials of whatever user the webserver is running as will be used.",
-    "config-mssql-sqlauth": "SQL Server Authentication",
-    "config-mssql-windowsauth": "Windows Authentication",
-    "config-site-name": "Name of wiki:",
-    "config-site-name-help": "This will appear in the title bar of the browser and in various other places.",
-    "config-site-name-blank": "Enter a site name.",
-    "config-project-namespace": "Project namespace:",
-    "config-ns-generic": "Project",
-    "config-ns-site-name": "Same as the wiki name: $1",
-    "config-ns-other": "Other (specify)",
-    "config-ns-other-default": "MyWiki",
-    "config-project-namespace-help": "Following Wikipedia's example, many wikis keep their policy pages separate from their content pages, in a \"'''project namespace'''\".\nAll page titles in this namespace start with a certain prefix, which you can specify here.\nUsually, this prefix is derived from the name of the wiki, but it cannot contain punctuation characters such as \"#\" or \":\".",
-    "config-ns-invalid": "The specified namespace \"<nowiki>$1</nowiki>\" is invalid.\nSpecify a different project namespace.",
-    "config-ns-conflict": "The specified namespace \"<nowiki>$1</nowiki>\" conflicts with a default MediaWiki namespace.\nSpecify a different project namespace.",
-    "config-admin-box": "Administrator account",
-    "config-admin-name": "Your username:",
-    "config-admin-password": "Password:",
-    "config-admin-password-confirm": "Password again:",
-    "config-admin-help": "Enter your preferred username here, for example \"Joe Bloggs\".\nThis is the name you will use to log in to the wiki.",
-    "config-admin-name-blank": "Enter an administrator username.",
-    "config-admin-name-invalid": "The specified username \"<nowiki>$1</nowiki>\" is invalid.\nSpecify a different username.",
-    "config-admin-password-blank": "Enter a password for the administrator account.",
-    "config-admin-password-mismatch": "The two passwords you entered do not match.",
-    "config-admin-email": "Email address:",
-    "config-admin-email-help": "Enter an email address here to allow you to receive email from other users on the wiki, reset your password, and be notified of changes to pages on your watchlist. You can leave this field empty.",
-    "config-admin-error-user": "Internal error when creating an admin with the name \"<nowiki>$1</nowiki>\".",
-    "config-admin-error-password": "Internal error when setting a password for the admin \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
-    "config-admin-error-bademail": "You have entered an invalid email address.",
-    "config-subscribe": "Subscribe to the [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release announcements mailing list].",
-    "config-subscribe-help": "This is a low-volume mailing list used for release announcements, including important security announcements.\nYou should subscribe to it and update your MediaWiki installation when new versions come out.",
-    "config-subscribe-noemail": "You tried to subscribe to the release announcements mailing list without providing an email address.\nPlease provide an email address if you wish to subscribe to the mailing list.",
-    "config-almost-done": "You are almost done!\nYou can now skip the remaining configuration and install the wiki right now.",
-    "config-optional-continue": "Ask me more questions.",
-    "config-optional-skip": "I'm bored already, just install the wiki.",
-    "config-profile": "User rights profile:",
-    "config-profile-wiki": "Open wiki",
-    "config-profile-no-anon": "Account creation required",
-    "config-profile-fishbowl": "Authorized editors only",
-    "config-profile-private": "Private wiki",
-    "config-profile-help": "Wikis work best when you let as many people edit them as possible.\nIn MediaWiki, it is easy to review the recent changes, and to revert any damage that is done by naive or malicious users.\n\nHowever, many have found MediaWiki to be useful in a wide variety of roles, and sometimes it is not easy to convince everyone of the benefits of the wiki way.\nSo you have the choice.\n\nThe <strong>{{int:config-profile-wiki}}</strong> model allows anyone to edit, without even logging in.\nA wiki with <strong>{{int:config-profile-no-anon}}</strong> provides extra accountability, but may deter casual contributors.\n\nThe <strong>{{int:config-profile-fishbowl}}</strong> scenario allows approved users to edit, but the public can view the pages, including history.\nA <strong>{{int:config-profile-private}}</strong> only allows approved users to view pages, with the same group allowed to edit.\n\nMore complex user rights configurations are available after installation, see the [//www.mediawiki.org/wiki/Manual:User_rights relevant manual entry].",
-    "config-license": "Copyright and license:",
-    "config-license-none": "No license footer",
-    "config-license-cc-by-sa": "Creative Commons Attribution-ShareAlike",
-    "config-license-cc-by": "Creative Commons Attribution",
-    "config-license-cc-by-nc-sa": "Creative Commons Attribution-NonCommercial-ShareAlike",
-    "config-license-cc-0": "Creative Commons Zero (Public Domain)",
-    "config-license-gfdl": "GNU Free Documentation License 1.3 or later",
-    "config-license-pd": "Public Domain",
-    "config-license-cc-choose": "Select a custom Creative Commons license",
-    "config-license-help": "Many public wikis put all contributions under a [http://freedomdefined.org/Definition free license].\nThis helps to create a sense of community ownership and encourages long-term contribution.\nIt is not generally necessary for a private or corporate wiki.\n\nIf you want to be able to use text from Wikipedia, and you want Wikipedia to be able to accept text copied from your wiki, you should choose <strong>Creative Commons Attribution Share Alike</strong>.\n\nWikipedia previously used the GNU Free Documentation License.\nThe GFDL is a valid license, but it is difficult to understand.\nIt is also difficult to reuse content licensed under the GFDL.",
-    "config-email-settings": "Email settings",
-    "config-enable-email": "Enable outbound email",
-    "config-enable-email-help": "If you want email to work, [http://www.php.net/manual/en/mail.configuration.php PHP's mail settings] need to be configured correctly.\nIf you do not want any email features, you can disable them here.",
-    "config-email-user": "Enable user-to-user email",
-    "config-email-user-help": "Allow all users to send each other email if they have enabled it in their preferences.",
-    "config-email-usertalk": "Enable user talk page notification",
-    "config-email-usertalk-help": "Allow users to receive notifications on user talk page changes, if they have enabled it in their preferences.",
-    "config-email-watchlist": "Enable watchlist notification",
-    "config-email-watchlist-help": "Allow users to receive notifications about their watched pages if they have enabled it in their preferences.",
-    "config-email-auth": "Enable email authentication",
-    "config-email-auth-help": "If this option is enabled, users have to confirm their email address using a link sent to them whenever they set or change it.\nOnly authenticated email addresses can receive emails from other users or change notification emails.\nSetting this option is <strong>recommended</strong> for public wikis because of potential abuse of the email features.",
-    "config-email-sender": "Return email address:",
-    "config-email-sender-help": "Enter the email address to use as the return address on outbound email.\nThis is where bounces will be sent.\nMany mail servers require at least the domain name part to be valid.",
-    "config-upload-settings": "Images and file uploads",
-    "config-upload-enable": "Enable file uploads",
-    "config-upload-help": "File uploads potentially expose your server to security risks.\nFor more information, read the [//www.mediawiki.org/wiki/Manual:Security security section] in the manual.\n\nTo enable file uploads, change the mode on the <code>images</code> subdirectory under MediaWiki's root directory so that the web server can write to it.\nThen enable this option.",
-    "config-upload-deleted": "Directory for deleted files:",
-    "config-upload-deleted-help": "Choose a directory in which to archive deleted files.\nIdeally, this should not be accessible from the web.",
-    "config-logo": "Logo URL:",
-    "config-logo-help": "MediaWiki's default skin includes space for a 135x160 pixel logo above the sidebar menu.\nUpload an image of the appropriate size, and enter the URL here.\n\nYou can use <code>$wgStylePath</code> or <code>$wgScriptPath</code> if your logo is relative to those paths.\n\nIf you do not want a logo, leave this box blank.",
-    "config-instantcommons": "Enable Instant Commons",
-    "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] is a feature that allows wikis to use images, sounds and other media found on the [//commons.wikimedia.org/ Wikimedia Commons] site.\nIn order to do this, MediaWiki requires access to the Internet.\n\nFor more information on this feature, including instructions on how to set it up for wikis other than the Wikimedia Commons, consult [//mediawiki.org/wiki/Manual:$wgForeignFileRepos the manual].",
-    "config-cc-error": "The Creative Commons license chooser gave no result.\nEnter the license name manually.",
-    "config-cc-again": "Pick again...",
-    "config-cc-not-chosen": "Choose which Creative Commons license you want and click \"proceed\".",
-    "config-advanced-settings": "Advanced configuration",
-    "config-cache-options": "Settings for object caching:",
-    "config-cache-help": "Object caching is used to improve the speed of MediaWiki by caching frequently used data.\nMedium to large sites are highly encouraged to enable this, and small sites will see benefits as well.",
-    "config-cache-none": "No caching (no functionality is removed, but speed may be impacted on larger wiki sites)",
-    "config-cache-accel": "PHP object caching (APC, XCache or WinCache)",
-    "config-cache-memcached": "Use Memcached (requires additional setup and configuration)",
-    "config-memcached-servers": "Memcached servers:",
-    "config-memcached-help": "List of IP addresses to use for Memcached.\nShould specify one per line and specify the port to be used. For example:\n 127.0.0.1:11211\n 192.168.1.25:1234",
-    "config-memcache-needservers": "You selected Memcached as your cache type but did not specify any servers.",
-    "config-memcache-badip": "You have entered an invalid IP address for Memcached: $1.",
-    "config-memcache-noport": "You did not specify a port to use for Memcached server: $1.\nIf you do not know the port, the default is 11211.",
-    "config-memcache-badport": "Memcached port numbers should be between $1 and $2.",
-    "config-extensions": "Extensions",
-    "config-extensions-help": "The extensions listed above were detected in your <code>./extensions</code> directory.\n\nThey may require additional configuration, but you can enable them now.",
-    "config-install-alreadydone": "<strong>Warning:</strong> You seem to have already installed MediaWiki and are trying to install it again.\nPlease proceed to the next page.",
-    "config-install-begin": "By pressing \"{{int:config-continue}}\", you will begin the installation of MediaWiki.\nIf you still want to make changes, press \"{{int:config-back}}\".",
-    "config-install-step-done": "done",
-    "config-install-step-failed": "failed",
-    "config-install-extensions": "Including extensions",
-    "config-install-database": "Setting up database",
-    "config-install-schema": "Creating schema",
-    "config-install-pg-schema-not-exist": "PostgreSQL schema does not exist.",
-    "config-install-pg-schema-failed": "Tables creation failed.\nMake sure that the user \"$1\" can write to the schema \"$2\".",
-    "config-install-pg-commit": "Committing changes",
-    "config-install-pg-plpgsql": "Checking for language PL/pgSQL",
-    "config-pg-no-plpgsql": "You need to install the language PL/pgSQL in the database $1",
-    "config-pg-no-create-privs": "The account you specified for installation does not have enough privileges to create an account.",
-    "config-pg-not-in-role": "The account you specified for the web user already exists.\nThe account you specified for installation is not a superuser and is not a member of the web user's role, so it is unable to create objects owned by the web user.\n\nMediaWiki currently requires that the tables be owned by the web user. Please specify another web account name, or click \"back\" and specify a suitably privileged install user.",
-    "config-install-user": "Creating database user",
-    "config-install-user-alreadyexists": "User \"$1\" already exists",
-    "config-install-user-create-failed": "Creating user \"$1\" failed: $2",
-    "config-install-user-grant-failed": "Granting permission to user \"$1\" failed: $2",
-    "config-install-user-missing": "The specified user \"$1\" does not exist.",
-    "config-install-user-missing-create": "The specified user \"$1\" does not exist.\nPlease click the \"create account\" checkbox below if you want to create it.",
-    "config-install-tables": "Creating tables",
-    "config-install-tables-exist": "<strong>Warning:</strong> MediaWiki tables seem to already exist.\nSkipping creation.",
-    "config-install-tables-failed": "<strong>Error:</strong> Table creation failed with the following error: $1",
-    "config-install-interwiki": "Populating default interwiki table",
-    "config-install-interwiki-list": "Could not read file <code>interwiki.list</code>.",
-    "config-install-interwiki-exists": "<strong>Warning:</strong> The interwiki table seems to already have entries.\nSkipping default list.",
-    "config-install-stats": "Initializing statistics",
-    "config-install-keys": "Generating secret keys",
-    "config-insecure-keys": "<strong>Warning:</strong> {{PLURAL:$2|A secure key|Secure keys}} ($1) generated during installation {{PLURAL:$2|is|are}} not completely safe. Consider changing {{PLURAL:$2|it|them}} manually.",
-    "config-install-sysop": "Creating administrator user account",
-    "config-install-subscribe-fail": "Unable to subscribe to mediawiki-announce: $1",
-    "config-install-subscribe-notpossible": "cURL is not installed and <code>allow_url_fopen</code> is not available.",
-    "config-install-mainpage": "Creating main page with default content",
-    "config-install-extension-tables": "Creating tables for enabled extensions",
-    "config-install-mainpage-failed": "Could not insert main page: $1",
-    "config-install-done": "<strong>Congratulations!</strong>\nYou have successfully installed MediaWiki.\n\nThe installer has generated a <code>LocalSettings.php</code> file.\nIt contains all your configuration.\n\nYou will need to download it and put it in the base of your wiki installation (the same directory as index.php). The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\n<strong>Note:</strong> If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can <strong>[$2 enter your wiki]</strong>.",
-    "config-download-localsettings": "Download <code>LocalSettings.php</code>",
-    "config-help": "help",
-    "config-nofile": "File \"$1\" could not be found. Has it been deleted?",
-    "config-extension-link": "Did you know that your wiki supports [//www.mediawiki.org/wiki/Manual:Extensions extensions]?\n\nYou can browse [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions by category] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] to see the full list of extensions.",
-    "mainpagetext": "<strong>MediaWiki has been successfully installed.</strong>",
-    "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]"
+       "@metadata": {
+               "authors": []
+       },
+       "config-desc": "The installer for MediaWiki",
+       "config-title": "MediaWiki $1 installation",
+       "config-information": "Information",
+       "config-localsettings-upgrade": "A <code>LocalSettings.php</code> file has been detected.\nTo upgrade this installation, please enter the value of <code>$wgUpgradeKey</code> in the box below.\nYou will find it in <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "A <code>LocalSettings.php</code> file has been detected.\nTo upgrade this installation, please run <code>update.php</code> instead",
+       "config-localsettings-key": "Upgrade key:",
+       "config-localsettings-badkey": "The key you provided is incorrect.",
+       "config-upgrade-key-missing": "An existing installation of MediaWiki has been detected.\nTo upgrade this installation, please put the following line at the bottom of your <code>LocalSettings.php</code>:\n\n$1",
+       "config-localsettings-incomplete": "The existing <code>LocalSettings.php</code> appears to be incomplete.\nThe $1 variable is not set.\nPlease change <code>LocalSettings.php</code> so that this variable is set, and click \"{{int:Config-continue}}\".",
+       "config-localsettings-connection-error": "An error was encountered when connecting to the database using the settings specified in <code>LocalSettings.php</code>. Please fix these settings and try again.\n\n$1",
+       "config-session-error": "Error starting session: $1",
+       "config-session-expired": "Your session data seems to have expired.\nSessions are configured for a lifetime of $1.\nYou can increase this by setting <code>session.gc_maxlifetime</code> in php.ini.\nRestart the installation process.",
+       "config-no-session": "Your session data was lost!\nCheck your php.ini and make sure <code>session.save_path</code> is set to an appropriate directory.",
+       "config-your-language": "Your language:",
+       "config-your-language-help": "Select a language to use during the installation process.",
+       "config-wiki-language": "Wiki language:",
+       "config-wiki-language-help": "Select the language that the wiki will predominantly be written in.",
+       "config-back": "← Back",
+       "config-continue": "Continue →",
+       "config-page-language": "Language",
+       "config-page-welcome": "Welcome to MediaWiki!",
+       "config-page-dbconnect": "Connect to database",
+       "config-page-upgrade": "Upgrade existing installation",
+       "config-page-dbsettings": "Database settings",
+       "config-page-name": "Name",
+       "config-page-options": "Options",
+       "config-page-install": "Install",
+       "config-page-complete": "Complete!",
+       "config-page-restart": "Restart installation",
+       "config-page-readme": "Read me",
+       "config-page-releasenotes": "Release notes",
+       "config-page-copying": "Copying",
+       "config-page-upgradedoc": "Upgrading",
+       "config-page-existingwiki": "Existing wiki",
+       "config-help-restart": "Do you want to clear all saved data that you have entered and restart the installation process?",
+       "config-restart": "Yes, restart it",
+       "config-welcome": "=== Environmental checks ===\nBasic checks will now be performed to see if this environment is suitable for MediaWiki installation.\nRemember to include this information if you seek support on how to complete the installation.",
+       "config-copyright": "=== Copyright and Terms ===\n\n$1\n\nThis 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.\n\nThis program is distributed in the hope that it will be useful, but <strong>without any warranty</strong>; without even the implied warranty of <strong>merchantability</strong> or <strong>fitness for a particular purpose</strong>.\nSee the GNU General Public License for more details.\n\nYou should have received <doclink href=Copying>a copy of the GNU General Public License</doclink> along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, or [http://www.gnu.org/copyleft/gpl.html read it online].",
+       "config-sidebar": "* [//www.mediawiki.org MediaWiki home]\n* [//www.mediawiki.org/wiki/Help:Contents User's Guide]\n* [//www.mediawiki.org/wiki/Manual:Contents Administrator's Guide]\n* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>Release notes</doclink>\n* <doclink href=Copying>Copying</doclink>\n* <doclink href=UpgradeDoc>Upgrading</doclink>",
+       "config-env-good": "The environment has been checked.\nYou can install MediaWiki.",
+       "config-env-bad": "The environment has been checked.\nYou cannot install MediaWiki.",
+       "config-env-php": "PHP $1 is installed.",
+       "config-env-php-toolow": "PHP $1 is installed.\nHowever, MediaWiki requires PHP $2 or higher.",
+       "config-unicode-using-utf8": "Using Brion Vibber's utf8_normalize.so for Unicode normalization.",
+       "config-unicode-using-intl": "Using the [http://pecl.php.net/intl intl PECL extension] for Unicode normalization.",
+       "config-unicode-pure-php-warning": "<strong>Warning:</strong> The [http://pecl.php.net/intl intl PECL extension] is not available to handle Unicode normalization, falling back to slow pure-PHP implementation.\nIf you run a high-traffic site, you should read a little on [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode normalization].",
+       "config-unicode-update-warning": "<strong>Warning:</strong> The installed version of the Unicode normalization wrapper uses an older version of [http://site.icu-project.org/ the ICU project's] library.\nYou should [//www.mediawiki.org/wiki/Unicode_normalization_considerations upgrade] if you are at all concerned about using Unicode.",
+       "config-no-db": "Could not find a suitable database driver! You need to install a database driver for PHP.\nThe following database types are supported: $1.\n\nIf you compiled PHP yourself, reconfigure it with a database client enabled, for example, using <code>./configure --with-mysqli</code>.\nIf you installed PHP from a Debian or Ubuntu package, then you also need to install, for example, the <code>php5-mysql</code> package.",
+       "config-outdated-sqlite": "<strong>Warning:</strong> you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.",
+       "config-no-fts3": "<strong>Warning:</strong> SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.",
+       "config-register-globals": "<strong>Warning: PHP's <code>[http://php.net/register_globals register_globals]</code> option is enabled.\nDisable it if you can.</strong>\nMediaWiki will work, but your server is exposed to potential security vulnerabilities.",
+       "config-magic-quotes-runtime": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] is active!'</strong>\nThis option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
+       "config-magic-quotes-sybase": "<strong>Fatal: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] is active!</strong>\nThis option corrupts data input unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
+       "config-mbstring": "<strong>Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!</strong>\nThis option causes errors and may corrupt data unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.",
+       "config-safe-mode": "<strong>Warning:</strong> PHP's [http://www.php.net/features.safe-mode safe mode] is active.\nIt may cause problems, particularly if using file uploads and <code>math</code> support.",
+       "config-xml-bad": "PHP's XML module is missing.\nMediaWiki requires functions in this module and will not work in this configuration.\nIf you're running Mandrake, install the php-xml package.",
+       "config-pcre-old": "<strong>Fatal:</strong> PCRE $1 or later is required.\nYour PHP binary is linked with PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE More information].",
+       "config-pcre-no-utf8": "<strong>Fatal:</strong> PHP's PCRE module seems to be compiled without PCRE_UTF8 support.\nMediaWiki requires UTF-8 support to function correctly.",
+       "config-memory-raised": "PHP's <code>memory_limit</code> is $1, raised to $2.",
+       "config-memory-bad": "<strong>Warning:</strong> PHP's <code>memory_limit</code> is $1.\nThis is probably too low.\nThe installation may fail!",
+       "config-ctype": "<strong>Fatal:</strong> PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].",
+       "config-json": "<strong>Fatal:</strong> PHP was compiled without JSON support.\nYou must install either the PHP JSON extension or the [http://pecl.php.net/package/jsonc PECL jsonc] extension before installing MediaWiki.\n* The PHP extension is included in Red Hat Enterprise Linux (CentOS) 5 and 6, though must be enabled in <code>/etc/php.ini</code> or <code>/etc/php.d/json.ini</code>.\n* Some Linux distributions released after May 2013 omit the PHP extension, instead packaging the PECL extension as <code>php5-json</code> or <code>php-pecl-jsonc</code>.",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] is installed",
+       "config-apc": "[http://www.php.net/apc APC] is installed",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] is installed",
+       "config-no-cache": "<strong>Warning:</strong> Could not find [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] or [http://www.iis.net/download/WinCacheForPhp WinCache].\nObject caching is not enabled.",
+       "config-mod-security": "<strong>Warning:</strong> Your web server has [http://modsecurity.org/ mod_security] enabled. If misconfigured, it can cause problems for MediaWiki or other software that allows users to post arbitrary content.\nRefer to [http://modsecurity.org/documentation/ mod_security documentation] or contact your host's support if you encounter random errors.",
+       "config-diff3-bad": "GNU diff3 not found.",
+       "config-git": "Found the Git version control software: <code>$1</code>.",
+       "config-git-bad": "Git version control software not found.",
+       "config-imagemagick": "Found ImageMagick: <code>$1</code>.\nImage thumbnailing will be enabled if you enable uploads.",
+       "config-gd": "Found GD graphics library built-in.\nImage thumbnailing will be enabled if you enable uploads.",
+       "config-no-scaling": "Could not find GD library or ImageMagick.\nImage thumbnailing will be disabled.",
+       "config-no-uri": "<strong>Error:</strong> Could not determine the current URI.\nInstallation aborted.",
+       "config-no-cli-uri": "<strong>Warning:</strong> No <code>--scriptpath</code> specified, using default: <code>$1</code>.",
+       "config-using-server": "Using server name \"<nowiki>$1</nowiki>\".",
+       "config-using-uri": "Using server URL \"<nowiki>$1$2</nowiki>\".",
+       "config-uploads-not-safe": "<strong>Warning:</strong> Your default directory for uploads <code>$1</code> is vulnerable to arbitrary scripts execution.\nAlthough MediaWiki checks all uploaded files for security threats, it is highly recommended to [//www.mediawiki.org/wiki/Manual:Security#Upload_security close this security vulnerability] before enabling uploads.",
+       "config-no-cli-uploads-check": "<strong>Warning:</strong> Your default directory for uploads (<code>$1</code>) is not checked for vulnerability\nto arbitrary script execution during the CLI install.",
+       "config-brokenlibxml": "Your system has a combination of PHP and libxml2 versions that is buggy and can cause hidden data corruption in MediaWiki and other web applications.\nUpgrade to libxml2 2.7.3 or later ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nInstallation aborted.",
+       "config-suhosin-max-value-length": "Suhosin is installed and limits the GET parameter <code>length</code> to $1 bytes.\nMediaWiki's ResourceLoader component will work around this limit, but that will degrade performance.\nIf at all possible, you should set <code>suhosin.get.max_value_length</code> to 1024 or higher in <code>php.ini</code>, and set <code>$wgResourceLoaderMaxQueryLength</code> to the same value in <code>LocalSettings.php</code>.",
+       "config-db-type": "Database type:",
+       "config-db-host": "Database host:",
+       "config-db-host-help": "If your database server is on different server, enter the host name or IP address here.\n\nIf you are using shared web hosting, your hosting provider should give you the correct host name in their documentation.\n\nIf you are installing on a Windows server and using MySQL, using \"localhost\" may not work for the server name. If it does not, try \"127.0.0.1\" for the local IP address.\n\nIf you are using PostgreSQL, leave this field blank to connect via a Unix socket.",
+       "config-db-host-oracle": "Database TNS:",
+       "config-db-host-oracle-help": "Enter a valid [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; a tnsnames.ora file must be visible to this installation.<br />If you are using client libraries 10g or newer you can also use the [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect] naming method.",
+       "config-db-wiki-settings": "Identify this wiki",
+       "config-db-name": "Database name:",
+       "config-db-name-help": "Choose a name that identifies your wiki.\nIt should not contain spaces.\n\nIf you are using shared web hosting, your hosting provider will either give you a specific database name to use or let you create databases via a control panel.",
+       "config-db-name-oracle": "Database schema:",
+       "config-db-account-oracle-warn": "There are three supported scenarios for installing Oracle as database backend:\n\nIf you wish to create database account as part of the installation process, please supply an account with SYSDBA role as database account for installation and specify the desired credentials for the web-access account, otherwise you can either create the web-access account manually and supply only that account (if it has required permissions to create the schema objects) or supply two different accounts, one with create privileges and a restricted one for web access.\n\nScript for creating an account with required privileges can be found in \"maintenance/oracle/\" directory of this installation. Keep in mind that using a restricted account will disable all maintenance capabilities with the default account.",
+       "config-db-install-account": "User account for installation",
+       "config-db-username": "Database username:",
+       "config-db-password": "Database password:",
+       "config-db-password-empty": "Please enter a password for the new database user: $1.\nWhile it may be possible to create users with no passwords, it is not secure.",
+       "config-db-username-empty": "You must enter a value for \"{{int:config-db-username}}\".",
+       "config-db-install-username": "Enter the username that will be used to connect to the database during the installation process.\nThis is not the username of the MediaWiki account; this is the username for your database.",
+       "config-db-install-password": "Enter the password that will be used to connect to the database during the installation process.\nThis is not the password for the MediaWiki account; this is the password for your database.",
+       "config-db-install-help": "Enter the username and password that will be used to connect to the database during the installation process.",
+       "config-db-account-lock": "Use the same username and password during normal operation",
+       "config-db-wiki-account": "User account for normal operation",
+       "config-db-wiki-help": "Enter the username and password that will be used to connect to the database during normal wiki operation.\nIf the account does not exist, and the installation account has sufficient privileges, this user account will be created with the minimum privileges required to operate the wiki.",
+       "config-db-prefix": "Database table prefix:",
+       "config-db-prefix-help": "If you need to share one database between multiple wikis, or between MediaWiki and another web application, you may choose to add a prefix to all the table names to avoid conflicts.\nDo not use spaces.\n\nThis field is usually left empty.",
+       "config-db-charset": "Database character set",
+       "config-charset-mysql5-binary": "MySQL 4.1/5.0 binary",
+       "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+       "config-charset-mysql4": "MySQL 4.0 backwards-compatible UTF-8",
+       "config-charset-help": "<strong>Warning:</strong> If you use <strong>backwards-compatible UTF-8</strong> on MySQL 4.1+, and subsequently back up the database with <code>mysqldump</code>, it may destroy all non-ASCII characters, irreversibly corrupting your backups!\n\nIn <strong>binary mode</strong>, MediaWiki stores UTF-8 text to the database in binary fields.\nThis is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters.\nIn <strong>UTF-8 mode</strong>, MySQL will know what character set your data is in, and can present and convert it appropriately,\nbut it will not let you store characters above the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+       "config-mysql-old": "MySQL $1 or later is required. You have $2.",
+       "config-db-port": "Database port:",
+       "config-db-schema": "Schema for MediaWiki:",
+       "config-db-schema-help": "This schema will usually be fine.\nOnly change it if you know you need to.",
+       "config-pg-test-error": "Cannot connect to database <strong>$1</strong>: $2",
+       "config-sqlite-dir": "SQLite data directory:",
+       "config-sqlite-dir-help": "SQLite stores all data in a single file.\n\nThe directory you provide must be writable by the webserver during installation.\n\nIt should <strong>not</strong> be accessible via the web, this is why we're not putting it where your PHP files are.\n\nThe installer will write a <code>.htaccess</code> file along with it, but if that fails someone can gain access to your raw database.\nThat includes raw user data (email addresses, hashed passwords) as well as deleted revisions and other restricted data on the wiki.\n\nConsider putting the database somewhere else altogether, for example in <code>/var/lib/mediawiki/yourwiki</code>.",
+       "config-oracle-def-ts": "Default tablespace:",
+       "config-oracle-temp-ts": "Temporary tablespace:",
+       "config-type-mysql": "MySQL (or compatible)",
+       "config-type-postgres": "PostgreSQL",
+       "config-type-sqlite": "SQLite",
+       "config-type-oracle": "Oracle",
+       "config-type-mssql": "Microsoft SQL Server",
+       "config-support-info": "MediaWiki supports the following database systems:\n\n$1\n\nIf you do not see the database system you are trying to use listed below, then follow the instructions linked above to enable support.",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] is the primary target for MediaWiki and is best supported. MediaWiki also works with [{{int:version-db-mariadb-url}} MariaDB] and [{{int:version-db-percona-url}} Percona Server], which are MySQL compatible. ([http://www.php.net/manual/en/mysqli.installation.php How to compile PHP with MySQL support])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] is a popular open source database system as an alternative to MySQL. There may be some minor outstanding bugs, and it is not recommended for use in a production environment. ([http://www.php.net/manual/en/pgsql.installation.php How to compile PHP with PostgreSQL support])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] is a lightweight database system that is very well supported. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], uses PDO)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] is a commercial enterprise database. ([http://www.php.net/manual/en/oci8.installation.php How to compile PHP with OCI8 support])",
+       "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] is a commercial enterprise database for Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php How to compile PHP with SQLSRV support])",
+       "config-header-mysql": "MySQL settings",
+       "config-header-postgres": "PostgreSQL settings",
+       "config-header-sqlite": "SQLite settings",
+       "config-header-oracle": "Oracle settings",
+       "config-header-mssql": "Microsoft SQL Server settings",
+       "config-invalid-db-type": "Invalid database type.",
+       "config-missing-db-name": "You must enter a value for \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "You must enter a value for \"{{int:config-db-host}}\".",
+       "config-missing-db-server-oracle": "You must enter a value for \"{{int:config-db-host-oracle}}\".",
+       "config-invalid-db-server-oracle": "Invalid database TNS \"$1\".\nUse either \"TNS Name\" or an \"Easy Connect\" string ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).",
+       "config-invalid-db-name": "Invalid database name \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).",
+       "config-invalid-db-prefix": "Invalid database prefix \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9), underscores (_) and hyphens (-).",
+       "config-connection-error": "$1.\n\nCheck the host, username and password and try again.",
+       "config-invalid-schema": "Invalid schema for MediaWiki \"$1\".\nUse only ASCII letters (a-z, A-Z), numbers (0-9) and underscores (_).",
+       "config-db-sys-create-oracle": "Installer only supports using a SYSDBA account for creating a new account.",
+       "config-db-sys-user-exists-oracle": "User account \"$1\" already exists. SYSDBA can only be used for creating of a new account!",
+       "config-postgres-old": "PostgreSQL $1 or later is required. You have $2.",
+       "config-mssql-old": "Microsoft SQL Server $1 or later is required. You have $2.",
+       "config-sqlite-name-help": "Choose a name that identifies your wiki.\nDo not use spaces or hyphens.\nThis will be used for the SQLite data file name.",
+       "config-sqlite-parent-unwritable-group": "Cannot create the data directory <code><nowiki>$1</nowiki></code>, because the parent directory <code><nowiki>$2</nowiki></code> is not writable by the webserver.\n\nThe installer has determined the user your webserver is running as.\nMake the <code><nowiki>$3</nowiki></code> directory writable by it to continue.\nOn a Unix/Linux system do:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "Cannot create the data directory <code><nowiki>$1</nowiki></code>, because the parent directory <code><nowiki>$2</nowiki></code> is not writable by the webserver.\n\nThe installer could not determine the user your webserver is running as.\nMake the <code><nowiki>$3</nowiki></code> directory globally writable by it (and others!) to continue.\nOn a Unix/Linux system do:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+       "config-sqlite-mkdir-error": "Error creating the data directory \"$1\".\nCheck the location and try again.",
+       "config-sqlite-dir-unwritable": "Unable to write to the directory \"$1\".\nChange its permissions so that the webserver can write to it, and try again.",
+       "config-sqlite-connection-error": "$1.\n\nCheck the data directory and database name below and try again.",
+       "config-sqlite-readonly": "The file <code>$1</code> is not writeable.",
+       "config-sqlite-cant-create-db": "Could not create database file <code>$1</code>.",
+       "config-sqlite-fts3-downgrade": "PHP is missing FTS3 support, downgrading tables.",
+       "config-can-upgrade": "There are MediaWiki tables in this database.\nTo upgrade them to MediaWiki $1, click <strong>Continue</strong>.",
+       "config-upgrade-done": "Upgrade complete.\n\nYou can now [$1 start using your wiki].\n\nIf you want to regenerate your <code>LocalSettings.php</code> file, click the button below.\nThis is <strong>not recommended</strong> unless you are having problems with your wiki.",
+       "config-upgrade-done-no-regenerate": "Upgrade complete.\n\nYou can now [$1 start using your wiki].",
+       "config-regenerate": "Regenerate LocalSettings.php →",
+       "config-show-table-status": "<code>SHOW TABLE STATUS</code> query failed!",
+       "config-unknown-collation": "<strong>Warning:</strong> Database is using unrecognized collation.",
+       "config-db-web-account": "Database account for web access",
+       "config-db-web-help": "Select the username and password that the web server will use to connect to the database server, during ordinary operation of the wiki.",
+       "config-db-web-account-same": "Use the same account as for installation",
+       "config-db-web-create": "Create the account if it does not already exist",
+       "config-db-web-no-create-privs": "The account you specified for installation does not have enough privileges to create an account.\nThe account you specify here must already exist.",
+       "config-mysql-engine": "Storage engine:",
+       "config-mysql-innodb": "InnoDB",
+       "config-mysql-myisam": "MyISAM",
+       "config-mysql-myisam-dep": "<strong>Warning:</strong> You have selected MyISAM as storage engine for MySQL, which is not recommended for use with MediaWiki, because:\n* it barely supports concurrency due to table locking\n* it is more prone to corruption than other engines\n* the MediaWiki codebase does not always handle MyISAM as it should\n\nIf your MySQL installation supports InnoDB, it is highly recommended that you choose that instead.\nIf your MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
+       "config-mysql-only-myisam-dep": "<strong>Warning:</strong> MyISAM is the only available storage engine for MySQL on this machine, and this is not recommended for use with MediaWiki, because:\n* it barely supports concurrency due to table locking\n* it is more prone to corruption than other engines\n* the MediaWiki codebase does not always handle MyISAM as it should\n\nYour MySQL installation does not support InnoDB, maybe it's time for an upgrade.",
+       "config-mysql-engine-help": "<strong>InnoDB</strong> is almost always the best option, since it has good concurrency support.\n\n<strong>MyISAM</strong> may be faster in single-user or read-only installations.\nMyISAM databases tend to get corrupted more often than InnoDB databases.",
+       "config-mysql-charset": "Database character set:",
+       "config-mysql-binary": "Binary",
+       "config-mysql-utf8": "UTF-8",
+       "config-mysql-charset-help": "In <strong>binary mode</strong>, MediaWiki stores UTF-8 text to the database in binary fields.\nThis is more efficient than MySQL's UTF-8 mode, and allows you to use the full range of Unicode characters.\n\nIn <strong>UTF-8 mode</strong>, MySQL will know what character set your data is in, and can present and convert it appropriately, but it will not let you store characters above the [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
+       "config-mssql-auth": "Authentication type:",
+       "config-mssql-install-auth": "Select the authentication type that will be used to connect to the database during the installation process.\nIf you select \"{{int:config-mssql-windowsauth}}\", the credentials of whatever user the webserver is running as will be used.",
+       "config-mssql-web-auth": "Select the authentication type that the web server will use to connect to the database server, during ordinary operation of the wiki.\nIf you select \"{{int:config-mssql-windowsauth}}\", the credentials of whatever user the webserver is running as will be used.",
+       "config-mssql-sqlauth": "SQL Server Authentication",
+       "config-mssql-windowsauth": "Windows Authentication",
+       "config-site-name": "Name of wiki:",
+       "config-site-name-help": "This will appear in the title bar of the browser and in various other places.",
+       "config-site-name-blank": "Enter a site name.",
+       "config-project-namespace": "Project namespace:",
+       "config-ns-generic": "Project",
+       "config-ns-site-name": "Same as the wiki name: $1",
+       "config-ns-other": "Other (specify)",
+       "config-ns-other-default": "MyWiki",
+       "config-project-namespace-help": "Following Wikipedia's example, many wikis keep their policy pages separate from their content pages, in a \"'''project namespace'''\".\nAll page titles in this namespace start with a certain prefix, which you can specify here.\nUsually, this prefix is derived from the name of the wiki, but it cannot contain punctuation characters such as \"#\" or \":\".",
+       "config-ns-invalid": "The specified namespace \"<nowiki>$1</nowiki>\" is invalid.\nSpecify a different project namespace.",
+       "config-ns-conflict": "The specified namespace \"<nowiki>$1</nowiki>\" conflicts with a default MediaWiki namespace.\nSpecify a different project namespace.",
+       "config-admin-box": "Administrator account",
+       "config-admin-name": "Your username:",
+       "config-admin-password": "Password:",
+       "config-admin-password-confirm": "Password again:",
+       "config-admin-help": "Enter your preferred username here, for example \"Joe Bloggs\".\nThis is the name you will use to log in to the wiki.",
+       "config-admin-name-blank": "Enter an administrator username.",
+       "config-admin-name-invalid": "The specified username \"<nowiki>$1</nowiki>\" is invalid.\nSpecify a different username.",
+       "config-admin-password-blank": "Enter a password for the administrator account.",
+       "config-admin-password-mismatch": "The two passwords you entered do not match.",
+       "config-admin-email": "Email address:",
+       "config-admin-email-help": "Enter an email address here to allow you to receive email from other users on the wiki, reset your password, and be notified of changes to pages on your watchlist. You can leave this field empty.",
+       "config-admin-error-user": "Internal error when creating an admin with the name \"<nowiki>$1</nowiki>\".",
+       "config-admin-error-password": "Internal error when setting a password for the admin \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
+       "config-admin-error-bademail": "You have entered an invalid email address.",
+       "config-subscribe": "Subscribe to the [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce release announcements mailing list].",
+       "config-subscribe-help": "This is a low-volume mailing list used for release announcements, including important security announcements.\nYou should subscribe to it and update your MediaWiki installation when new versions come out.",
+       "config-subscribe-noemail": "You tried to subscribe to the release announcements mailing list without providing an email address.\nPlease provide an email address if you wish to subscribe to the mailing list.",
+       "config-almost-done": "You are almost done!\nYou can now skip the remaining configuration and install the wiki right now.",
+       "config-optional-continue": "Ask me more questions.",
+       "config-optional-skip": "I'm bored already, just install the wiki.",
+       "config-profile": "User rights profile:",
+       "config-profile-wiki": "Open wiki",
+       "config-profile-no-anon": "Account creation required",
+       "config-profile-fishbowl": "Authorized editors only",
+       "config-profile-private": "Private wiki",
+       "config-profile-help": "Wikis work best when you let as many people edit them as possible.\nIn MediaWiki, it is easy to review the recent changes, and to revert any damage that is done by naive or malicious users.\n\nHowever, many have found MediaWiki to be useful in a wide variety of roles, and sometimes it is not easy to convince everyone of the benefits of the wiki way.\nSo you have the choice.\n\nThe <strong>{{int:config-profile-wiki}}</strong> model allows anyone to edit, without even logging in.\nA wiki with <strong>{{int:config-profile-no-anon}}</strong> provides extra accountability, but may deter casual contributors.\n\nThe <strong>{{int:config-profile-fishbowl}}</strong> scenario allows approved users to edit, but the public can view the pages, including history.\nA <strong>{{int:config-profile-private}}</strong> only allows approved users to view pages, with the same group allowed to edit.\n\nMore complex user rights configurations are available after installation, see the [//www.mediawiki.org/wiki/Manual:User_rights relevant manual entry].",
+       "config-license": "Copyright and license:",
+       "config-license-none": "No license footer",
+       "config-license-cc-by-sa": "Creative Commons Attribution-ShareAlike",
+       "config-license-cc-by": "Creative Commons Attribution",
+       "config-license-cc-by-nc-sa": "Creative Commons Attribution-NonCommercial-ShareAlike",
+       "config-license-cc-0": "Creative Commons Zero (Public Domain)",
+       "config-license-gfdl": "GNU Free Documentation License 1.3 or later",
+       "config-license-pd": "Public Domain",
+       "config-license-cc-choose": "Select a custom Creative Commons license",
+       "config-license-help": "Many public wikis put all contributions under a [http://freedomdefined.org/Definition free license].\nThis helps to create a sense of community ownership and encourages long-term contribution.\nIt is not generally necessary for a private or corporate wiki.\n\nIf you want to be able to use text from Wikipedia, and you want Wikipedia to be able to accept text copied from your wiki, you should choose <strong>Creative Commons Attribution Share Alike</strong>.\n\nWikipedia previously used the GNU Free Documentation License.\nThe GFDL is a valid license, but it is difficult to understand.\nIt is also difficult to reuse content licensed under the GFDL.",
+       "config-email-settings": "Email settings",
+       "config-enable-email": "Enable outbound email",
+       "config-enable-email-help": "If you want email to work, [http://www.php.net/manual/en/mail.configuration.php PHP's mail settings] need to be configured correctly.\nIf you do not want any email features, you can disable them here.",
+       "config-email-user": "Enable user-to-user email",
+       "config-email-user-help": "Allow all users to send each other email if they have enabled it in their preferences.",
+       "config-email-usertalk": "Enable user talk page notification",
+       "config-email-usertalk-help": "Allow users to receive notifications on user talk page changes, if they have enabled it in their preferences.",
+       "config-email-watchlist": "Enable watchlist notification",
+       "config-email-watchlist-help": "Allow users to receive notifications about their watched pages if they have enabled it in their preferences.",
+       "config-email-auth": "Enable email authentication",
+       "config-email-auth-help": "If this option is enabled, users have to confirm their email address using a link sent to them whenever they set or change it.\nOnly authenticated email addresses can receive emails from other users or change notification emails.\nSetting this option is <strong>recommended</strong> for public wikis because of potential abuse of the email features.",
+       "config-email-sender": "Return email address:",
+       "config-email-sender-help": "Enter the email address to use as the return address on outbound email.\nThis is where bounces will be sent.\nMany mail servers require at least the domain name part to be valid.",
+       "config-upload-settings": "Images and file uploads",
+       "config-upload-enable": "Enable file uploads",
+       "config-upload-help": "File uploads potentially expose your server to security risks.\nFor more information, read the [//www.mediawiki.org/wiki/Manual:Security security section] in the manual.\n\nTo enable file uploads, change the mode on the <code>images</code> subdirectory under MediaWiki's root directory so that the web server can write to it.\nThen enable this option.",
+       "config-upload-deleted": "Directory for deleted files:",
+       "config-upload-deleted-help": "Choose a directory in which to archive deleted files.\nIdeally, this should not be accessible from the web.",
+       "config-logo": "Logo URL:",
+       "config-logo-help": "MediaWiki's default skin includes space for a 135x160 pixel logo above the sidebar menu.\nUpload an image of the appropriate size, and enter the URL here.\n\nYou can use <code>$wgStylePath</code> or <code>$wgScriptPath</code> if your logo is relative to those paths.\n\nIf you do not want a logo, leave this box blank.",
+       "config-instantcommons": "Enable Instant Commons",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] is a feature that allows wikis to use images, sounds and other media found on the [//commons.wikimedia.org/ Wikimedia Commons] site.\nIn order to do this, MediaWiki requires access to the Internet.\n\nFor more information on this feature, including instructions on how to set it up for wikis other than the Wikimedia Commons, consult [//mediawiki.org/wiki/Manual:$wgForeignFileRepos the manual].",
+       "config-cc-error": "The Creative Commons license chooser gave no result.\nEnter the license name manually.",
+       "config-cc-again": "Pick again...",
+       "config-cc-not-chosen": "Choose which Creative Commons license you want and click \"proceed\".",
+       "config-advanced-settings": "Advanced configuration",
+       "config-cache-options": "Settings for object caching:",
+       "config-cache-help": "Object caching is used to improve the speed of MediaWiki by caching frequently used data.\nMedium to large sites are highly encouraged to enable this, and small sites will see benefits as well.",
+       "config-cache-none": "No caching (no functionality is removed, but speed may be impacted on larger wiki sites)",
+       "config-cache-accel": "PHP object caching (APC, XCache or WinCache)",
+       "config-cache-memcached": "Use Memcached (requires additional setup and configuration)",
+       "config-memcached-servers": "Memcached servers:",
+       "config-memcached-help": "List of IP addresses to use for Memcached.\nShould specify one per line and specify the port to be used. For example:\n 127.0.0.1:11211\n 192.168.1.25:1234",
+       "config-memcache-needservers": "You selected Memcached as your cache type but did not specify any servers.",
+       "config-memcache-badip": "You have entered an invalid IP address for Memcached: $1.",
+       "config-memcache-noport": "You did not specify a port to use for Memcached server: $1.\nIf you do not know the port, the default is 11211.",
+       "config-memcache-badport": "Memcached port numbers should be between $1 and $2.",
+       "config-extensions": "Extensions",
+       "config-extensions-help": "The extensions listed above were detected in your <code>./extensions</code> directory.\n\nThey may require additional configuration, but you can enable them now.",
+       "config-install-alreadydone": "<strong>Warning:</strong> You seem to have already installed MediaWiki and are trying to install it again.\nPlease proceed to the next page.",
+       "config-install-begin": "By pressing \"{{int:config-continue}}\", you will begin the installation of MediaWiki.\nIf you still want to make changes, press \"{{int:config-back}}\".",
+       "config-install-step-done": "done",
+       "config-install-step-failed": "failed",
+       "config-install-extensions": "Including extensions",
+       "config-install-database": "Setting up database",
+       "config-install-schema": "Creating schema",
+       "config-install-pg-schema-not-exist": "PostgreSQL schema does not exist.",
+       "config-install-pg-schema-failed": "Tables creation failed.\nMake sure that the user \"$1\" can write to the schema \"$2\".",
+       "config-install-pg-commit": "Committing changes",
+       "config-install-pg-plpgsql": "Checking for language PL/pgSQL",
+       "config-pg-no-plpgsql": "You need to install the language PL/pgSQL in the database $1",
+       "config-pg-no-create-privs": "The account you specified for installation does not have enough privileges to create an account.",
+       "config-pg-not-in-role": "The account you specified for the web user already exists.\nThe account you specified for installation is not a superuser and is not a member of the web user's role, so it is unable to create objects owned by the web user.\n\nMediaWiki currently requires that the tables be owned by the web user. Please specify another web account name, or click \"back\" and specify a suitably privileged install user.",
+       "config-install-user": "Creating database user",
+       "config-install-user-alreadyexists": "User \"$1\" already exists",
+       "config-install-user-create-failed": "Creating user \"$1\" failed: $2",
+       "config-install-user-grant-failed": "Granting permission to user \"$1\" failed: $2",
+       "config-install-user-missing": "The specified user \"$1\" does not exist.",
+       "config-install-user-missing-create": "The specified user \"$1\" does not exist.\nPlease click the \"create account\" checkbox below if you want to create it.",
+       "config-install-tables": "Creating tables",
+       "config-install-tables-exist": "<strong>Warning:</strong> MediaWiki tables seem to already exist.\nSkipping creation.",
+       "config-install-tables-failed": "<strong>Error:</strong> Table creation failed with the following error: $1",
+       "config-install-interwiki": "Populating default interwiki table",
+       "config-install-interwiki-list": "Could not read file <code>interwiki.list</code>.",
+       "config-install-interwiki-exists": "<strong>Warning:</strong> The interwiki table seems to already have entries.\nSkipping default list.",
+       "config-install-stats": "Initializing statistics",
+       "config-install-keys": "Generating secret keys",
+       "config-insecure-keys": "<strong>Warning:</strong> {{PLURAL:$2|A secure key|Secure keys}} ($1) generated during installation {{PLURAL:$2|is|are}} not completely safe. Consider changing {{PLURAL:$2|it|them}} manually.",
+       "config-install-sysop": "Creating administrator user account",
+       "config-install-subscribe-fail": "Unable to subscribe to mediawiki-announce: $1",
+       "config-install-subscribe-notpossible": "cURL is not installed and <code>allow_url_fopen</code> is not available.",
+       "config-install-mainpage": "Creating main page with default content",
+       "config-install-extension-tables": "Creating tables for enabled extensions",
+       "config-install-mainpage-failed": "Could not insert main page: $1",
+       "config-install-done": "<strong>Congratulations!</strong>\nYou have successfully installed MediaWiki.\n\nThe installer has generated a <code>LocalSettings.php</code> file.\nIt contains all your configuration.\n\nYou will need to download it and put it in the base of your wiki installation (the same directory as index.php). The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\n<strong>Note:</strong> If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can <strong>[$2 enter your wiki]</strong>.",
+       "config-download-localsettings": "Download <code>LocalSettings.php</code>",
+       "config-help": "help",
+       "config-nofile": "File \"$1\" could not be found. Has it been deleted?",
+       "config-extension-link": "Did you know that your wiki supports [//www.mediawiki.org/wiki/Manual:Extensions extensions]?\n\nYou can browse [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions by category].",
+       "mainpagetext": "<strong>MediaWiki has been successfully installed.</strong>",
+       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]"
 }
index 3a7b027..e5f3b82 100644 (file)
@@ -18,7 +18,8 @@
                        "Carlitosag",
                        "Chocolate con galleta",
                        "Csbotero",
-                       "Sporeunai"
+                       "Sporeunai",
+                       "Ihojose"
                ]
        },
        "config-desc": "El instalador de MediaWiki",
        "config-download-localsettings": "Descargar archivo <code>LocalSettings.php</code>",
        "config-help": "Ayuda",
        "config-nofile": "El archivo \"$1\" no se pudo encontrar. ¿Se ha eliminado?",
-       "config-extension-link": "¿Sabías que tu wiki soporta [//www.mediawiki.org/wiki/Manual:Extensions extensiones]?\n\nPuedes navegar las [//www.mediawiki.org/wiki/Category:Extensions_by_category extensiones por categoría] o la [//www.mediawiki.org/wiki/Extension_Matrix matriz de extensiones] para ver la lista completa de extensiones.",
+       "config-extension-link": "¿Sabías que tu wiki soporta [//www.mediawiki.org/wiki/Manual:Extensions extensiones]?\n\nPuedes navegar las [//www.mediawiki.org/wiki/Category:Extensions_by_category extensiones por categoría].",
        "mainpagetext": "'''MediaWiki ha sido instalado con éxito.'''",
        "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Ayuda:Guía del usuario de contenidos] para obtener información sobre el uso del software wiki.\n\n== Empezando ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Regionalizar MediaWiki para tu idioma]"
 }
index 0afae85..62c6b7c 100644 (file)
        "config-db-username": "نام کاربری پایگاه اطلاعات:",
        "config-db-password": "گذرواژه پایگاه داده‌ها:",
        "config-db-password-empty": "لطفاً یک رمز عبور برای کاربر جدید پایگاه اطلا‌عاتی وارد کنید: $1\nدر صورتی که ممکن است کاربران بدون رمز عبور به وجود آیند،امن نیست.",
-       "config-db-username-empty": "شما باید یک مقدار برای \"نام کاربری پایگاه اطلاعاتی\" وارد کنید",
+       "config-db-username-empty": "شما باید یک مقدار برای \"نام کاربری {{int:config-db-username}}\" وارد کنید",
        "config-db-install-username": "نام کاربری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌شد.\nاین نام کاربری حساب مدیاویکی نیست; نام کاربری برای پایگاه اطلاعاتی شما است.",
        "config-db-install-password": "رمز عبوری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌شد.\nاین رمز عبور برای حساب مدیاویکی نیست;رمز عبور برای پایگاه اطلاعاتی شما است.",
        "config-db-install-help": "نام کاربری و رمز عبوری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌ٰشد.",
        "config-header-oracle": "تنظیمات اوراکل",
        "config-header-mssql": "تنظیمات سرور مایکرپسافت اس‌کیو‌ال",
        "config-invalid-db-type": "نوع پایگاه اطلاعاتی نامعتبر",
-       "config-missing-db-name": "شما باید یک مقدار برای \"نام پایگاه اطلاعاتی\" وارد کنید",
-       "config-missing-db-host": "شما باید یک مقدار برای \"گروه پایگاه اطلاعاتی\" وارد کنید",
-       "config-missing-db-server-oracle": "شما باید یک مقدار برای \"تی‌ان‌اس پایگاه اطلاعاتی\" وارد کنید",
+       "config-missing-db-name": "شما باید یک مقدار برای \"نام {{int:config-db-name}}\" وارد کنید",
+       "config-missing-db-host": "شما باید یک مقدار برای \"گروه {{int:config-db-host}}\" وارد کنید",
+       "config-missing-db-server-oracle": "شما باید یک مقدار برای \"تی‌ان‌اس {{int:config-db-host-oracle}}\" وارد کنید",
        "config-invalid-db-server-oracle": "تی‌ان‌اس پایگاه اطلاعاتی $1 نامعتبر.\nیا از \"نام تی‌ان‌اس\" یا یک سلسله \"ارتباط آسان\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]) استفاده کنید.",
        "config-invalid-db-name": "نام پایگاه اطلاعاتی نامعتبر \"$1\".\nفقط حروف اِی‌اس‌سی‌آی‌آی بزرگ (اِی-زدکوچک،اِی-زد بزرگ)،اعداد (۰-۹)،آندرلاین (_) و خط تیره کوتاه (-) استفاده کنید.",
        "config-invalid-db-prefix": "پیشوند پایگاه اطلاعاتی نامعتبر \"$1\".\nفقط حروف اِی‌اس‌سی‌آی‌آی بزرگ (اِی-زدکوچک،اِی-زد بزرگ)،اعداد (۰-۹)،آندرلاین (_) و خط تیره کوتاه (-) استفاده کنید.",
        "config-download-localsettings": "دریافت <code>LocalSettings.php</code>",
        "config-help": "راهنما",
        "config-nofile": "پروندهٔ «$1» یافت نشد. آیا حذف شده‌است؟",
-       "config-extension-link": "آیا می‌دانستید که ویکی شما [//www.mediawiki.org/wiki/Manual:Extensions extensions] را پشتیبانی می‌کند؟\nشما می‌توانید [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions by category] یا [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] را برای دیدن همهٔ فهرست وسیع،جسته‌وگریخته بخوانید.",
+       "config-extension-link": "آیا می‌دانستید که ویکی شما [//www.mediawiki.org/wiki/Manual:Extensions extensions] را پشتیبانی می‌کند؟\nشما می‌توانید [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions by category]",
        "mainpagetext": "'''نرم‌افزار ویکی با موفقیت نصب شد.'''",
        "mainpagedocfooter": "از [//meta.wikimedia.org/wiki/Help:Contents راهنمای کاربران]\nبرای استفاده از نرم‌افزار ویکی کمک بگیرید.\n\n== آغاز به کار ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings تنظیم پیکربندی]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki پرسش‌های متداول]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ارسال نسخه‌های مدیاویکی]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise مدیاویکی برای زبان شما]"
 }
index fb5cfbb..ee9ede5 100644 (file)
@@ -11,7 +11,8 @@
                        "VezonThunder",
                        "아라",
                        "Elseweyr",
-                       "Lliehu"
+                       "Lliehu",
+                       "Syreeni"
                ]
        },
        "config-desc": "MediaWiki-asennin",
        "config-env-php-toolow": "PHP $1 on asennettu.\nMediaWiki vaatii PHP:n version $2 tai uudemman.",
        "config-no-db": "Sopivaa tietokanta-ajuria ei löytynyt! Sinun täytyy asentaa tietokanta-ajurit PHP:lle.\nSeuraavat tietokantatyypit ovat tuettuja: $1.",
        "config-safe-mode": "'''Varoitus:''' PHP:n [http://www.php.net/features.safe-mode safe mode] -tila on aktiivinen.\nSe voi aiheuttaa ongelmia erityisesti tiedostojen tallentamisen ja matemaattisten kaavojen kanssa.",
+       "config-xml-bad": "PHP:n XML-moduulia ei löydy.\nMediaWiki käyttää tämän moduulin funktioita, eikä toimi tässä kokoonpanossa.\nJos käytät Mandrakea, asenna php-xml paketti.",
+       "config-memory-raised": "PHP:n <code>memory_limit</code> on $1, nostetaan arvoon $2.",
        "config-memory-bad": "'''Varoitus:''' PHP:n <code>memory_limit</code> on $1.\nTämä on luultavasti liian alhainen.\nAsennus saattaa epäonnistua!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] on asennettu",
        "config-apc": "[http://www.php.net/apc APC] on asennettu.",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] on asennettu",
        "config-diff3-bad": "GNU diff3:a ei löytynyt.",
+       "config-imagemagick": "Löydettiin ImageMagick: <code>$1</code>.\nKuvien esikatselukuvat otetaan samalla käyttöön jos otetaan tiedostojen tallennus.",
+       "config-using-server": "Palvelimen nimenä käytetään \"<nowiki>$1</nowiki>\".",
+       "config-using-uri": "Palvelinen URL-osoitteena käytetään \"<nowiki>$1$2</nowiki>\".",
        "config-db-type": "Tietokannan tyyppi",
        "config-db-host": "Tietokantapalvelin",
        "config-db-wiki-settings": "Identifioi tämä wiki",
        "config-db-install-help": "Anna käyttäjätunnus ja salasana, joita käytetään asennuksen aikana.",
        "config-db-account-lock": "Käytä samaa tunnusta ja salasanaa myös asennuksen jälkeen",
        "config-db-prefix": "Tietokantataulujen etuliite",
+       "config-db-prefix-help": "Jos tietokantaa käytetään useammalle wikille tai MediaWikille ja muille sovelluksille, suositellaan käytettäväksi tauluissa etuliitettä, joilla ne erotetaan toisistaan ja vältetään näin virheitä.\nÄlä käytä välilyöntejä.\n\nYleensä tämä kenttä jätetään tyhjäksi.",
        "config-db-charset": "Tietokannan merkistö",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0, binääri",
        "config-charset-mysql5": "MySQL 4.1/5.0, UTF-8",
        "config-charset-mysql4": "MySQL 4.0, taaksepäin yhteensopiva UTF-8",
        "config-mysql-old": "MediaWiki tarvitsee MySQL:n version $1 tai uudemman. Nykyinen versio on $2.",
+       "config-pg-test-error": "Tietokantaan <strong>$1 ei voida muodostaa yhteyttä</strong>: $2",
        "config-type-mysql": "MySQL (tai yhteensopiva)",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-header-postgres": "PostgreSQL-asetukset",
        "config-header-sqlite": "SQLite-asetukset",
        "config-header-oracle": "Oracle-asetukset",
+       "config-header-mssql": "Microsoft SQL Server asetukset",
        "config-invalid-db-type": "Virheellinen tietokantatyyppi",
        "config-missing-db-name": "Kenttä »Tietokannan nimi» on pakollinen",
        "config-invalid-db-name": "”$1” ei kelpaa tietokannan nimeksi.\nKäytä ainoastaan kirjaimia (a-z, A-Z), numeroita (0-9), alaviivoja (_) ja tavuviivoja (-).",
        "config-invalid-db-prefix": "”$1” ei kelpaa tietokannan etuliitteeksi.\nKäytä ainoastaan kirjaimia (a-z, A-Z), numeroita (0-9), alaviivoja (_) ja tavuviivoja (-).",
+       "config-connection-error": "$1.\n\nTarkista isäntä, käyttäjänimi, salasana ja yritä uudestaan.",
        "config-postgres-old": "MediaWiki tarvitsee PostgreSQL:n version $1 tai uudemman. Nykyinen versio on $2.",
+       "config-mssql-old": "Vaaditaan Microsoft SQL Server $1 tai uudempi. Sinulla on käytössä $2.",
        "config-sqlite-name-help": "Valitse nimi, joka yksilöi tämän wikin.\nÄlä käytä välilyöntejä tai viivoja.\nNimeä käytetään SQLite-tietokannan tiedostonimessä.",
        "config-sqlite-dir-unwritable": "Hakemistoon ”$1” kirjoittaminen epäonnistui.\nMuuta hakemiston käyttöoikeuksia siten, että palvelinohjelmisto voi kirjoittaa siihen ja yritä uudelleen.",
        "config-sqlite-readonly": "Tiedostoon <code>$1</code> ei voi kirjoittaa.",
        "config-sqlite-fts3-downgrade": "PHP:stä puuttuu FTS3-tuki. Poistetaan ominaisuus käytöstä tietokantatauluista.",
+       "config-can-upgrade": "Tietokanta sisältää jo MediaWiki tauluja.\nPäivitä ne MediaWiki-versioon $1 painamalla <strong>Jatka</strong>.",
        "config-upgrade-done": "Päivitys valmis.\n\nVoit [$1 aloittaa wikin käytön].\n\nNapsauta alla olevaa painiketta, jos haluat luoda uudelleen <code>LocalSettings.php</code>-tiedoston.\nTämä '''ei ole suositeltavaa''', jos wikissäsi ei ole ongelmia.",
        "config-upgrade-done-no-regenerate": "Päivitys valmis.\n\nVoit [$1 aloittaa wikin käytön].",
        "config-regenerate": "Luo LocalSettings.php uudelleen →",
        "config-show-table-status": "Kysely <code>SHOW TABLE STATUS</code> epäonnistui!",
+       "config-db-web-help": "Valitse käyttäjänimi ja salasana joita palvelin käyttää muodostaessaan yhteyttä tietokantapalvelimeen wikin normaalin toiminnan aikana.",
+       "config-db-web-account-same": "Käytä samaa tiliä kuin asennuksessa",
+       "config-db-web-create": "Lisää tili, jos sitä ei ole jo olemassa",
+       "config-db-web-no-create-privs": "Tilillä jota käytetään asennuksessa ei ole oikeuksia luoda uutta tiliä.\nTähän määriteltävä tili täytyy olla jo olemassa.",
        "config-mysql-engine": "Tallennusmoottori",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
+       "config-mysql-charset": "Tietokannan merkistökoodaus:",
        "config-mysql-binary": "Binääri",
        "config-mysql-utf8": "UTF-8",
        "config-site-name": "Wikin nimi",
+       "config-site-name-help": "Tämä näkyy selaimen otsikkona ja muissa kohdissa.",
        "config-site-name-blank": "Kirjoita sivuston nimi.",
        "config-project-namespace": "Projektinimiavaruus",
        "config-ns-generic": "Projekti",
        "config-ns-site-name": "Sama kuin wikin nimi: $1",
        "config-ns-other": "Muu (määritä)",
+       "config-ns-other-default": "MinunWiki",
+       "config-admin-box": "Ylläpitäjän tili",
        "config-admin-name": "Käyttäjänimesi:",
        "config-admin-password": "Salasana",
        "config-admin-password-confirm": "Salasana uudelleen",
+       "config-admin-help": "Syötä käyttäjänimi tähän, esimerkiksi \"Matti Meikäläinen\".\nTätä nimeä käytetään kirjauduttaessa wikiin.",
        "config-admin-name-blank": "Anna ylläpitäjän käyttäjänimi.",
+       "config-admin-name-invalid": "Annettu nimi \"<nowiki>$1</nowiki>\" on virheellinen.\nSyötä toinen nimi.",
+       "config-admin-password-blank": "Syötä ylläpitäjän salasana.",
+       "config-admin-password-mismatch": "Antamasi salasanat eivät täsmää.",
        "config-admin-email": "Sähköpostiosoite",
+       "config-admin-email-help": "Syötä sähköpostiosoite johon vastaanotetaan viestit muilta wikin käyttäjiltä, nollataan salasana ja ilmoitetaan tarkkailulistalla olevista sivuista. Kenttä voidaan jättää myös tyhjäksi.",
        "config-admin-error-bademail": "Annoit virheellisen sähköpostiosoitteen.",
+       "config-subscribe": "Liity [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce päivityssähköpostilistalle].",
+       "config-subscribe-help": "Tällä harvoin käytettävällä sähköpostilistalla julkaistaan päivitysilmoituksia ja turvallisuuspäivityksiä.\nLiittymistä listalle suositellaan samoin kuin päivittämään MediaWiki kun uusi versio julkaistaan.",
+       "config-subscribe-noemail": "Yritit liittyä päivityssähköpostilistalle antamatta sähköpostiosoitetta.\nSyötä sähköpostiosoite jos haluat liittyä listalle.",
        "config-almost-done": "Olet jo lähes valmis!\nVoit ohittaa jäljellä olevat määritykset ja asentaa wikin juuri nyt.",
+       "config-optional-continue": "Säädä lisää asetuksia.",
+       "config-optional-skip": "Nyt riittää, asenna wiki näillä tiedoilla.",
+       "config-profile": "Käyttäjäprofiilin oikeudet:",
        "config-profile-wiki": "Avoin wiki",
        "config-profile-no-anon": "Tunnuksen luonti vaaditaan",
        "config-profile-private": "Yksityinen wiki",
        "config-license": "Tekijänoikeus ja lisenssi:",
        "config-license-pd": "Public domain",
        "config-email-settings": "Sähköpostiasetukset",
+       "config-enable-email": "Ota käyttöön sähköpostien lähetys",
+       "config-email-user": "Ota käyttöön käyttäjältä käyttäjälle sähköpostit",
+       "config-email-user-help": "Salli käyttäjien lähettää sähköpostia toisilleen jos he ovat ottaneet käyttöön toiminnon asetuksissaan.",
+       "config-email-usertalk": "Ota käyttöön käyttäjien keskustelusivusta ilmoittaminen",
+       "config-email-usertalk-help": "Salli käyttäjien vastaanottaa ilmoituksia käyttäjän keskustelusivulla tapahtuneista muutoksista jos he ovat ottaneet käyttöön toiminnon asetuksissaan.",
+       "config-email-watchlist": "Ota käyttöön tarkkailulistasta ilmoittaminen",
+       "config-email-watchlist-help": "Salli käyttäjien vastaanottaa ilmoituksia tarkkailulistalla olevilla sivuilla tapahtuneista muutoksista jos he ovat ottaneet käyttöön toiminnon asetuksissaan.",
+       "config-email-auth": "Ota käyttöön sähköpostin vahvistaminen",
+       "config-email-sender": "Palautusähköpostiosoite:",
+       "config-upload-settings": "Kuvien ja tiedostojen lataaminen",
+       "config-upload-enable": "Ota käyttöön tiedostojen lataaminen",
+       "config-upload-deleted": "Poistettujen tiedostojen hakemisto:",
+       "config-upload-deleted-help": "Valitse hakemisto johon poistetut tiedostot arkistoidaan.\nHakemiston ei tulisi olla käytettävissä internetverkosta.",
        "config-logo": "Logon URL-osoite",
        "config-cc-again": "Valitse uudelleen...",
        "config-extensions": "Laajennukset",
+       "config-extensions-help": "Yllä luetellut laajennukset löytyvät <code>./extensions</code> hakemistosta.\n\nNe saattavat vaatia lisäasetuksia, mutta voit ottaa ne käyttöön nyt.",
+       "config-install-alreadydone": "<strong>Varoitus:</strong> MediaWiki on jo asennettu ja yrität asentaa sitä uudestaan.\nSiirry seuraavalle sivulle.",
+       "config-install-begin": "Painamalla \"{{int:config-continue}}\", aloitetaan MediaWikin asentaminen. \nJos haluat vielä tehdä muutoksia, paina \"{{int:config-back}}\".",
        "config-install-step-done": "valmis",
        "config-install-step-failed": "epäonnistui",
+       "config-install-extensions": "Sisällytetään laajennukset",
+       "config-install-database": "Asennetaan tietokantaa",
        "config-install-user-alreadyexists": "Käyttäjä $1 on jo olemassa",
        "config-install-interwiki-list": "Tiedostoa <code>interwiki.list</code> ei voitu lukea.",
        "config-download-localsettings": "Lataa <code>LocalSettings.php</code>",
index f4bfdf2..2aa0bca 100644 (file)
                        "Wyz",
                        "Yumeki",
                        "아라",
-                       "Maxim21"
+                       "Maxim21",
+                       "Wladek92"
                ]
        },
        "config-desc": "Le programme d’installation de MediaWiki",
        "config-title": "Installation de MediaWiki $1",
        "config-information": "Informations",
        "config-localsettings-upgrade": "Un fichier <code>LocalSettings.php</code> a été détecté.\nPour mettre à jour cette installation, veuillez saisir la valeur de <code>$wgUpgradeKey</code> dans le champ ci-dessous.\nVous la trouverez dans <code>LocalSettings.php</code>.",
-       "config-localsettings-cli-upgrade": "Un fichier <code>LocalSettings.php</code> a été détecté.\nPour mettre à niveau cette installation, veuillez exécuter <code>update.php</code>",
+       "config-localsettings-cli-upgrade": "Un fichier <code>LocalSettings.php</code> a été détecté.\nPour mettre à niveau cette installation, veuillez exécuter <code>update.php</code> à la place",
        "config-localsettings-key": "Clé de mise à jour :",
        "config-localsettings-badkey": "La clé que vous avez fournie est incorrecte.",
        "config-upgrade-key-missing": "Une installation existante de MediaWiki a été détectée.\n\nPour mettre à jour cette installation, veuillez ajouter la ligne suivante à la fin de votre fichier <code>LocalSettings.php</code>\n\n$1",
@@ -67,7 +68,7 @@
        "config-unicode-using-utf8": "Utilisation de utf8_normalize.so par Brion Vibber pour la normalisation Unicode.",
        "config-unicode-using-intl": "Utilisation de [http://pecl.php.net/intl l'extension PECL intl] pour la normalisation Unicode.",
        "config-unicode-pure-php-warning": "<strong>Attention</strong> : L'[http://pecl.php.net/intl extension PECL intl] n'est pas disponible pour la normalisation d’Unicode, retour à la version lente implémentée en PHP.\nSi votre site web sera très fréquenté, vous devriez lire ceci : [//www.mediawiki.org/wiki/Unicode_normalization_considerations ''Unicode normalization''] (en anglais).",
-       "config-unicode-update-warning": "'''Attention''': La version installée du ''wrapper'' de normalisation Unicode utilise une vieille version de la [http://site.icu-project.org/ bibliothèque logicielle ''ICU Project''].\nVous devriez faire une [//www.mediawiki.org/wiki/Unicode_normalization_considerations mise à jour] (texte en anglais) si l'usage d'Unicode vous semble important.",
+       "config-unicode-update-warning": "'''Attention''': La version installée du ''wrapper'' de normalisation Unicode utilise une vieille version de la [http://site.icu-project.org/ bibliothèque logicielle ''ICU Project''].\nVous devriez faire une [//www.mediawiki.org/wiki/Unicode_normalization_considerations mise à jour] (texte en anglais) si vous êtes tout à fait concerné par l'usage d'Unicode.",
        "config-no-db": "Impossible de trouver un pilote de base de données approprié ! Vous devez installer un pilote de base de données pour PHP. Les types de bases de données suivants sont reconnus : $1.\n\nSi vous avez compilé PHP vous-même, reconfigurez-le avec un client de base de données activé, par exemple en utilisant <code>./configure --with-mysqli</code>. Si vous avez installé PHP depuis un paquet Debian ou Ubuntu, alors vous devrez aussi installer, par exemple, le paquet <code>php5-mysql</code>.",
        "config-outdated-sqlite": "'''Attention''': vous avez SQLite $1, qui est inférieur à la version minimale requise $2. SQLite sera indisponible.",
        "config-no-fts3": "'''Attention :''' SQLite est compilé sans le module [//sqlite.org/fts3.html FTS3] ; les fonctions de recherche ne seront pas disponibles sur ce moteur.",
        "config-memory-raised": "Le paramètre <code>memory_limit</code> de PHP était à $1, porté à $2.",
        "config-memory-bad": "'''Attention :''' Le paramètre <code>memory_limit</code> de PHP est à $1.\nCette valeur est probablement trop faible.\nIl est possible que l’installation échoue !",
        "config-ctype": "'''Fatal ''': PHP doit être compilé avec le support pour l'[http://www.php.net/manual/en/ctype.installation.php extension Ctype].",
-       "config-json": "'''Erreur fatale :''' PHP a été compilé sans le support de JSON.\nVous devez soit installez l’extension JSON de PHP ou l’extension [http://pecl.php.net/package/jsonc PECL jsonc] avant d’installer MediaWiki.\n* L’extension PHP est comprise dans Red Hat Enterprise Linux (CentOS) 5 et 6, mais doit être activée dans <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Certaines distributions Linux après mai 2013 ne comprennent pas l’extension PHP, mais oint mis à la place l’extension PECL sous al forme <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
+       "config-json": "'''Erreur fatale :''' PHP a été compilé sans le support de JSON.\nVous devez soit installez l’extension JSON de PHP ou l’extension [http://pecl.php.net/package/jsonc PECL jsonc] avant d’installer MediaWiki.\n* L’extension PHP est comprise dans Red Hat Enterprise Linux (CentOS) 5 et 6, mais doit être activée dans <code>/etc/php.ini</code> ou <code>/etc/php.d/json.ini</code>.\n* Certaines distributions Linux après mai 2013 ne comprennent pas l’extension PHP, mais ont mis à la place l’extension PECL sous la forme <code>php5-json</code> ou <code>php-pecl-jsonc</code>.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] est installé",
        "config-apc": "[http://www.php.net/apc APC] est installé",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] est installé",
        "config-no-cache": "'''Attention :''' Impossible de trouver [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].\nLa mise en cache d'objets n'est pas activée.",
-       "config-mod-security": "'''Attention''': Votre serveur web a [http://modsecurity.org/ mod_security] activé. S&il est mal configuré, cela peut poser des problèmes à MediaWiki ou à d'autres applications qui permettent aux utilisateurs de publier un contenu quelconque.\nReportez-vous à [http://modsecurity.org/documentation/ la documentation de mod_security] ou contactez le support de votre hébergeur si vous rencontrez des erreurs aléatoires.",
+       "config-mod-security": "'''Attention''': Votre serveur web a [http://modsecurity.org/ mod_security] activé. S'il est mal configuré, cela peut poser des problèmes à MediaWiki ou à d'autres applications qui permettent aux utilisateurs de publier un contenu quelconque.\nReportez-vous à [http://modsecurity.org/documentation/ la documentation de mod_security] ou contactez le support de votre hébergeur si vous rencontrez des erreurs aléatoires.",
        "config-diff3-bad": "GNU diff3 introuvable.",
        "config-git": "Logiciel de contrôle de version Git trouvé : <code>$1</code>.",
        "config-git-bad": "Logiciel de contrôle de version Git non trouvé.",
        "config-imagemagick": "ImageMagick trouvé : <code>$1</code>.\nLa miniaturisation d'images sera activée si vous activez le téléversement de fichiers.",
        "config-gd": "La bibliothèque graphique GD intégrée a été trouvée.\nLa miniaturisation d'images sera activée si vous activez le téléversement de fichiers.",
-       "config-no-scaling": "Impossible de trouver la bibliothèque GD ou ImageMagick.\nLa miniaturisation d'images sera désactivé.",
-       "config-no-uri": "'''Erreur :''' Impossible de déterminer l'URI du script actuel.\nInstallation avortée.",
+       "config-no-scaling": "Impossible de trouver la bibliothèque GD ou ImageMagick.\nLa miniaturisation d'images sera désactivée.",
+       "config-no-uri": "'''Erreur :''' Impossible de déterminer l'URI du script actuel.\nInstallation interrompue.",
        "config-no-cli-uri": "'''Attention''': Aucun <code>--scriptpath</code> n'a été spécifié; <code>$1</code> sera utilisé par défaut",
        "config-using-server": "Utilisation du nom de serveur \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Utilisation de l'URL de serveur \"<nowiki>$1$2</nowiki>\".",
        "config-db-name": "Nom de la base de données :",
        "config-db-name-help": "Choisissez un nom qui identifie votre wiki.\nIl ne doit pas contenir d'espaces.\n\nSi vous utilisez un hébergement web partagé, votre hébergeur vous fournira un nom spécifique de base de données à utiliser, ou bien vous permet de créer des bases de données via un panneau de contrôle.",
        "config-db-name-oracle": "Schéma de base de données :",
-       "config-db-account-oracle-warn": "Il existe trois scénarios pris en charge pour l’installation d'Oracle comme backend de base :\n\nSi vous souhaitez créer un compte de base de données dans le cadre de la procédure d’installation, veuillez fournir un compte avec le rôle de SYSDBA comme compte de base de données pour l’installation et spécifiez les informations d’identification souhaitées pour le compte d'accès au web, sinon vous pouvez créer le compte d’accès web manuellement et fournir uniquement ce compte (si elle a exigé des autorisations nécessaires pour créer les objets de schéma) ou fournir deux comptes différents, l’un avec les privilèges de créer et une restreinte pour l’accès web.\n\nUn script pour créer un compte avec des privilèges requis peut être trouvé dans le répertoire « entretien/oracle/ » de cette installation. N’oubliez pas que le fait de l’utilisation d’un compte limité désactive toutes les fonctionnalités d’entretien avec le compte par défaut.",
+       "config-db-account-oracle-warn": "Il existe trois scénarios pris en charge pour l’installation d'Oracle comme backend de base de données:\n\nSi vous souhaitez créer un compte de base de données dans le cadre de la procédure d’installation, veuillez fournir un compte avec le rôle de SYSDBA comme compte de base de données pour l’installation et spécifier les informations d’identification souhaitées pour le compte d'accès au web, sinon vous pouvez créer le compte d’accès web manuellement et fournir uniquement ce compte (si elle a exigé des autorisations nécessaires pour créer les objets de schéma) ou fournir deux comptes différents, l’un avec les privilèges pour créer et l'autre restreint, pour l’accès web.\n\nUn script pour créer un compte avec des privilèges requis peut être trouvé dans le répertoire « entretien/oracle/ » de cette installation. N’oubliez pas que le fait de l’utilisation d’un compte limité désactive toutes les fonctionnalités d’entretien avec le compte par défaut.",
        "config-db-install-account": "Compte d'utilisateur pour l'installation",
        "config-db-username": "Nom d’utilisateur de la base de données :",
        "config-db-password": "Mot de passe de la base de données :",
-       "config-db-password-empty": "Veuillez entrer un mot de passe pour le nouvel compte de la base de données : $1.\nBien qu'il soit possible de créer un compte sans mot de passe, ce n'est pas recommandé pour des questions de sécurité.",
+       "config-db-password-empty": "Veuillez entrer un mot de passe pour le nouveau compte de la base de données : $1.\nBien qu'il soit possible de créer un compte sans mot de passe, ce n'est pas recommandé pour des questions de sécurité.",
        "config-db-username-empty": "Vous devez entrer une valeur pour « {{int:config-db-username}} ».",
        "config-db-install-username": "Entrez le nom d’utilisateur qui sera utilisé pour se connecter à la base de données pendant le processus d'installation. Il ne s’agit pas du nom d’utilisateur du compte MediaWiki, mais du nom d’utilisateur pour votre base de données.",
        "config-db-install-password": "Entrez le mot de passe qui sera utilisé pour se connecter à la base de données pendant le processus d'installation. Il ne s’agit pas du mot de passe du compte MediaWiki, mais du mot de passe pour votre base de données.",
        "config-db-wiki-account": "Compte d'utilisateur pour le fonctionnement habituel",
        "config-db-wiki-help": "Entrez le nom d'utilisateur et le mot de passe qui seront utilisés pour se connecter à la base de données pendant le fonctionnement habituel du wiki.\nSi le compte n'existe pas, et le compte d'installation dispose de privilèges suffisants, ce compte d'utilisateur sera créé avec les privilèges minimum requis pour faire fonctionner le wiki.",
        "config-db-prefix": "Préfixe des tables de la base de données :",
-       "config-db-prefix-help": "Si vous avez besoin de partager une base de données entre plusieurs wikis, ou entre MediaWiki et une autre application Web, vous pouvez choisir d'ajouter un préfixe à tous les noms de table pour éviter les conflits.\nNe pas utiliser des espaces.\n\nCe champ est généralement laissé vide.",
+       "config-db-prefix-help": "Si vous avez besoin de partager une base de données entre plusieurs wikis, ou entre MediaWiki et une autre application Web, vous pouvez choisir d'ajouter un préfixe à tous les noms de table pour éviter les conflits.\nNe pas utiliser d'espaces.\n\nCe champ est généralement laissé vide.",
        "config-db-charset": "Jeu de caractères de la base de données",
-       "config-charset-mysql5-binary": "MySQL 4.1/5.0 binaire",
+       "config-charset-mysql5-binary": "binaire MySQL 4.1/5.0",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-charset-mysql4": "MySQL 4.0 rétrocompatible UTF-8",
        "config-charset-help": "'''Attention:''' Si vous utilisez ''backwards-compatible UTF-8'' sur MySQL 4.1+, et ensuite sauvegardez la base de données avec <code>mysqldump</code>, cela peut détruire tous les caractères non-ASCII, ce qui rend inutilisable vos copies de sauvegarde de façon irréversible !\n\nEn ''mode binaire'', MediaWiki stocke le texte UTF-8 dans des champs binaires de la base de données. C'est plus efficace que le ''mode UTF-8'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.\nEn ''mode UTF-8'', MySQL connaîtra le jeu de caractères de vos données et pourra présenter et convertir les données de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
-       "config-mysql-old": "MySQL $1 ou version ultérieure est requis, vous avez $2.",
+       "config-mysql-old": "MySQL $1 ou version ultérieure est requis. Vous avez $2.",
        "config-db-port": "Port de la base de données :",
        "config-db-schema": "Schéma pour MediaWiki :",
-       "config-db-schema-help": "Les schémas ci-dessus sont généralement corrects.\nNe les changez que si vous êtes sûr que c'est nécessaire.",
+       "config-db-schema-help": "Ce schéma est généralement correct.\nNe le changez que si vous êtes sûr que c'est nécessaire.",
        "config-pg-test-error": "Impossible de se connecter à la base de données '''$1''' : $2",
        "config-sqlite-dir": "Dossier des données SQLite :",
-       "config-sqlite-dir-help": "SQLite stocke toutes les données dans un fichier unique.\n\nLe répertoire que vous inscrivez doit être accessible en écriture par le serveur lors de l'installation.\n\nIl '''ne faut pas''' qu'il soit accessible via le web, c'est pourquoi il n'est pas à l'endroit où vos fichiers PHP sont.\n\nL'installateur écrira un fichier <code>.htaccess</code> en même temps, mais s'il y a échec, quelqu'un peut accéder à votre base de données.\nCela comprend les données des utilisateurs (adresses de courriel, mots de passe hachés) ainsi que des révisions supprimées et d'autres données confidentielles du wiki.\n\nEnvisagez de placer la base de données ailleurs, par exemple dans <code>/var/lib/mediawiki/yourwiki</code>.",
+       "config-sqlite-dir-help": "SQLite stocke toutes les données dans un fichier unique.\n\nLe répertoire que vous fournissez doit être accessible en écriture par le serveur lors de l'installation.\n\nIl '''ne faut pas''' qu'il soit accessible via le web, c'est pourquoi il n'est pas à l'endroit où sont vos fichiers PHP.\n\nL'installateur écrira un fichier <code>.htaccess</code> en même temps, mais s'il y a échec, quelqu'un peut accéder à votre base de données.\nCela comprend les données des utilisateurs (adresses de courriel, mots de passe hachés) ainsi que des révisions supprimées et d'autres données confidentielles du wiki.\n\nEnvisagez de placer la base de données ailleurs, par exemple dans <code>/var/lib/mediawiki/yourwiki</code>.",
        "config-oracle-def-ts": "Espace de stockage (''tablespace'') par défaut :",
        "config-oracle-temp-ts": "Espace de stockage (''tablespace'') temporaire :",
        "config-type-mysql": "MySQL (ou compatible)",
        "config-missing-db-host": "Vous devez entrer une valeur pour « {{int:config-db-host}} ».",
        "config-missing-db-server-oracle": "Vous devez entrer une valeur pour « {{int:config-db-host-oracle}} ».",
        "config-invalid-db-server-oracle": "Le nom TNS de la base de données (« $1 ») est invalide.\nUtilisez uniquement la chaîne \"TNS Name\" ou \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Méthodes de nommage Oracle])",
-       "config-invalid-db-name": "Nom de la base de données invalide (« $1 »).\nIl ne peut contenir que des lettres latines (a-z, A-Z), des chiffres (0-9), des caractères de soulignement (_) et des tirets (-).",
-       "config-invalid-db-prefix": "Préfixe de la base de données non valide « $1 ».\nIl ne peut contenir que des lettres latines (a-z, A-Z), des chiffres (0-9), des caractères de soulignement (_) et des tirets (-).",
+       "config-invalid-db-name": "Nom de la base de données invalide (« $1 »).\nUtiliser seulement les lettres ASCII (a-z, A-Z), les chiffres (0-9), les caractères de soulignement (_) et les tirets (-).",
+       "config-invalid-db-prefix": "Préfixe de la base de données non valide « $1 ».\nUtiliser seulement les lettres ASCII (a-z, A-Z), les chiffres (0-9), les caractères de soulignement (_) et les tirets (-).",
        "config-connection-error": "$1.\n\nVérifier le nom d’hôte, le nom d’utilisateur et le mot de passe ci-dessous puis réessayer.",
-       "config-invalid-schema": "Schéma invalide pour MediaWiki « $1 ».\nUtilisez seulement des lettres latines (a-z, A-Z), des chiffres (0-9) et des caractères de soulignement (_).",
-       "config-db-sys-create-oracle": "L'installateur ne reconnaît que les compte SYSDBA lors de la création d'un nouveau compte.",
-       "config-db-sys-user-exists-oracle": "Le compte « $1 » existe déjà. Un SYSDBA peut seulement servir à créer un nouveau compte.",
-       "config-postgres-old": "PostgreSQL $1 ou version ultérieure est requis, vous avez $2.",
+       "config-invalid-schema": "Schéma invalide pour MediaWiki « $1 ».\nUtiliser seulement les lettres ASCII (a-z, A-Z), les chiffres (0-9) et les caractères de soulignement (_).",
+       "config-db-sys-create-oracle": "L'installateur ne reconnaît que le compte SYSDBA lors de la création d'un nouveau compte.",
+       "config-db-sys-user-exists-oracle": "Le compte « $1 » existe déjà. Seul SYSDBA peut être utilisé pour créer un nouveau compte.",
+       "config-postgres-old": "PostgreSQL $1 ou version ultérieure est requis. Vous avez $2.",
        "config-mssql-old": "Microsoft SQL Server version $1 ou supérieur est requis. Vous avez la version $2.",
-       "config-sqlite-name-help": "Choisir un nom qui identifie votre wiki.\nNe pas utiliser des espaces ou des traits d'union.\nIl sera utilisé pour le fichier de données SQLite.",
-       "config-sqlite-parent-unwritable-group": "Impossible de créer le répertoire de données <nowiki><code>$1</code></nowiki>, parce que le répertoire parent <nowiki><code>$2</code></nowiki> n'est pas accessible en écriture par le serveur Web.\n\nL'utilisateur du serveur web est connu.\nRendre le répertoire <nowiki><code>$3</code></nowiki> accessible en écriture pour continuer.\nSur un système UNIX/Linux, saisir :\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
-       "config-sqlite-parent-unwritable-nogroup": "Impossible de créer le répertoire de données <nowiki><code>$1</code></nowiki>, parce que le répertoire parent <nowiki><code>$2</code></nowiki> n'est pas accessible en écriture par le serveur Web.\n\nL'utilisateur du serveur web est inconnu.\nRendre le répertoire <nowiki><code>$3</code></nowiki> globalement accessible en écriture pour continuer.\nSur un système UNIX/Linux, saisir :\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+       "config-sqlite-name-help": "Choisir un nom qui identifie votre wiki.\nNe pas utiliser d'espaces ni de traits d'union.\nIl sera utilisé pour le fichier de données SQLite.",
+       "config-sqlite-parent-unwritable-group": "Impossible de créer le répertoire de données <nowiki><code>$1</code></nowiki>, parce que le répertoire parent <nowiki><code>$2</code></nowiki> n'est pas accessible en écriture par le serveur Web.\n\nL'installateur a détecté sous quel nom d'utilisateur, le serveur web est actif.\nRendre le répertoire <nowiki><code>$3</code></nowiki> accessible en écriture pour continuer.\nSur un système UNIX/Linux, saisir :\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "Impossible de créer le répertoire de données <nowiki><code>$1</code></nowiki>, parce que le répertoire parent <nowiki><code>$2</code></nowiki> n'est pas accessible en écriture par le serveur Web.\n\nL'installateur n'a pas pu déterminer le nom de l'utilisateur sous lequel le serveur s'exécute.\nRendre le répertoire <nowiki><code>$3</code></nowiki> globalement accessible en écriture pour continuer.\nSur un système UNIX/Linux, saisir :\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
        "config-sqlite-mkdir-error": "Erreur de création du répertoire de données « $1 ».\nVérifiez l'emplacement et essayez à nouveau.",
-       "config-sqlite-dir-unwritable": "Impossible d'écrire dans le répertoire « $1 ».\nChanger les permissions de sorte que le serveur peut y écrire et essayez à nouveau.",
+       "config-sqlite-dir-unwritable": "Impossible d'écrire dans le répertoire « $1 ».\nChanger les permissions de sorte que le serveur puisse y écrire et essayez à nouveau.",
        "config-sqlite-connection-error": "$1.\n\nVérifier le répertoire des données et le nom de la base de données ci-dessous et réessayer.",
        "config-sqlite-readonly": "Le fichier <code>$1</code> n'est pas accessible en écriture.",
        "config-sqlite-cant-create-db": "Impossible de créer le fichier de base de données <code>$1</code>.",
-       "config-sqlite-fts3-downgrade": "PHP ne vient pas avec FTS3, les tables sont diminuées.",
+       "config-sqlite-fts3-downgrade": "PHP n'a pas trouvé le support FTS3, les tables sont restreintes.",
        "config-can-upgrade": "Il y a des tables MediaWiki dans cette base de données.\nPour les mettre au niveau de MediaWiki $1, cliquez sur '''Continuer'''.",
-       "config-upgrade-done": "Mise à jour complétée.\n\nVous pouvez maintenant [$1 commencer à utiliser votre wiki].\n\nSi vous souhaitez régénérer votre fichier <code>LocalSettings.php</code>, cliquez sur le bouton ci-dessous.\nCe '''n'est pas recommandé''' sauf si vous rencontrez des problèmes avec votre wiki.",
+       "config-upgrade-done": "Mise à jour terminée.\n\nVous pouvez maintenant [$1 commencer à utiliser votre wiki].\n\nSi vous souhaitez régénérer votre fichier <code>LocalSettings.php</code>, cliquez sur le bouton ci-dessous.\nCeci '''n'est pas recommandé''' sauf si vous rencontrez des problèmes avec votre wiki.",
        "config-upgrade-done-no-regenerate": "Mise à jour terminée.\n\nVous pouvez maintenant [$1 commencer à utiliser votre wiki].",
        "config-regenerate": "Regénérer LocalSettings.php →",
        "config-show-table-status": "Échec de la requête <code>SHOW TABLE STATUS</code> !",
-       "config-unknown-collation": "'''Attention:''' La base de données effectue un classement alphabétique (''collation'') inconnu.",
+       "config-unknown-collation": "'''Attention:''' La base de données utilise un classement alphabétique (''collation'') inconnu.",
        "config-db-web-account": "Compte de la base de données pour l'accès Web",
        "config-db-web-help": "Sélectionnez le nom d'utilisateur et le mot de passe que le serveur web utilisera pour se connecter au serveur de base de données pendant le fonctionnement habituel du wiki.",
        "config-db-web-account-same": "Utilisez le même compte que pour l'installation",
        "config-mysql-engine": "Moteur de stockage :",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "''' Avertissement ''': vous avez sélectionné MyISAM comme moteur de stockage pour MySQL, ce qui n'est pas recommandé pour une utilisation avec MediaWiki, parce que:\n * il supporte à peine la simultanéité en raison de verrouillage de table\n * il est plus sujet à la corruption que les autres moteurs\n * le codebase MediaWiki ne gère pas toujours MyISAM comme il se doit\nSi votre installation MySQL supporte InnoDB, il est fortement recommandé que vous le choisissez plutôt. Si votre installation MySQL ne supporte pas les tables InnoDB, il est peut-être temps de faire une mise à niveau.",
+       "config-mysql-myisam-dep": "''' Avertissement ''': vous avez sélectionné MyISAM comme moteur de stockage pour MySQL, ce qui n'est pas recommandé pour une utilisation avec MediaWiki, parce que:\n * il supporte à peine la simultanéité en raison de verrouillage de table\n * il est plus sujet à la corruption que les autres moteurs\n * le codebase MediaWiki ne gère pas toujours MyISAM comme il se doit\n\nSi votre installation MySQL supporte InnoDB, il est fortement recommandé que vous le choisissiez plutôt. \nSi votre installation MySQL ne supporte pas les tables InnoDB, il est peut-être temps de faire une mise à niveau.",
        "config-mysql-only-myisam-dep": "'''Attention :''' MyISAM est le seul moteur de stockage disponible pour MySQL sur cette machine, et cela n’est pas recommandé pour une utilisation avec MédiaWiki, car :\n* il supporte très peu les accès concurrents à cause du verrouillage des tables\n* il est plus sujet à corruption que les autres moteurs\n* le code de base de MédiaWiki ne gère pas toujours MyISAM comme il faudrait\n\nVotre installation MySQL ne supporte pas InnoDB ; il est peut-être temps de la mettre à jour.",
-       "config-mysql-engine-help": "'''InnoDB''' est presque toujours la meilleure option, car il supporte bien l'[http://fr.wikipedia.org/wiki/Ordonnancement_dans_les_syst%C3%A8mes_d%27exploitation ordonnancement].\n\n'''MyISAM''' peut être plus rapide dans les installations monoposte ou en lecture seule. Les bases de données MyISAM ont tendance à se corrompre plus souvent que celles d'InnoDB.",
+       "config-mysql-engine-help": "'''InnoDB''' est presque toujours la meilleure option, car il supporte bien les accès concurrents.\n\n'''MyISAM''' peut être plus rapide dans les installations monoposte ou en lecture seule. \nLes bases de données MyISAM ont tendance à se corrompre plus souvent que les bases d'InnoDB.",
        "config-mysql-charset": "Jeu de caractères de la base de données :",
        "config-mysql-binary": "Binaire",
        "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "En ''mode binaire'', MediaWiki stocke le texte au format UTF-8 dans la base de données. C'est plus efficace que le ''UTF-8 mode'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.\n\nEn ''mode binaire'', MediaWiki stocke le texte UTF-8 dans des champs binaires de la base de données. C'est plus efficace que le ''mode UTF-8'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.\nEn ''mode UTF-8'', MySQL connaîtra le jeu de caractères de vos données et pourra présenter et convertir les données de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
+       "config-mysql-charset-help": "En ''mode binaire'', MediaWiki stocke le texte au format UTF-8 dans la base de données dans des champs binaires.\nC'est plus efficace que le ''UTF-8 mode'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.\n\nEn ''mode UTF-8'', MySQL reconnaîtra le jeu de caractères dans lequel sont vos données et pourra les présenter et les convertir de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
        "config-mssql-auth": "Type d’authentification :",
        "config-mssql-install-auth": "Sélectionner le type d’authentification qui sera utilisé pour se connecter à la base de données pendant le processus d’installation.\nSi vous sélectionnez « {{int:config-mssql-windowsauth}} », les informations d’identification de l’utilisateur faisant tourner le serveur seront utilisées.",
        "config-mssql-web-auth": "Sélectionner le type d’authentification que le serveur web utilisera pour se connecter au serveur de base de données lors des opérations habituelles du wiki.\nSi vous sélectionnez « {{int:config-mssql-windowsauth}} », les informations d’identification de l’utilisateur sous lequel tourne le serveur web seront utilisées.",
        "config-mssql-sqlauth": "Authentification de SQL Server",
        "config-mssql-windowsauth": "Authentification Windows",
        "config-site-name": "Nom du wiki :",
-       "config-site-name-help": "Il apparaîtra dans la barre de titre du navigateur et en divers autres endroits.",
+       "config-site-name-help": "Ceci apparaîtra dans la barre de titre du navigateur et en divers autres endroits.",
        "config-site-name-blank": "Entrez un nom de site.",
        "config-project-namespace": "Espace de noms du projet :",
        "config-ns-generic": "Projet",
        "config-ns-site-name": "Même nom que le wiki : $1",
        "config-ns-other": "Autre (préciser)",
        "config-ns-other-default": "MonWiki",
-       "config-project-namespace-help": "Suivant l'exemple de Wikipédia, plusieurs wikis gardent leurs pages de politique séparées de leurs pages de contenu, dans un ''espace de noms'' propre.\nTous les titres de page de cet espace de noms commence par un préfixe défini, que vous pouvez spécifier ici.\nTraditionnellement, ce préfixe est dérivé du nom du wiki, mais il ne peut contenir des caractères de ponctuation tels que « # » ou « : ».",
-       "config-ns-invalid": "L'espace de noms spécifié « <nowiki>$1</nowiki> » n'est pas valide.\nSpécifiez un espace de noms pour le projet.",
-       "config-ns-conflict": "L'espace de noms spécifié « <nowiki>$1</nowiki> » est en conflit avec un espace de noms par défaut de MediaWiki.\nChoisir un autre espace de noms.",
+       "config-project-namespace-help": "Suivant l'exemple de Wikipédia, plusieurs wikis gardent leurs pages de politique séparées de leurs pages de contenu, dans un ''espace de noms de niveau projet'' propre.\nTous les titres de page de cet espace de noms commence par un préfixe défini, que vous pouvez spécifier ici.\nTraditionnellement, ce préfixe est dérivé du nom du wiki, et ne peut contenir de caractères de ponctuation tels que « # » ou « : ».",
+       "config-ns-invalid": "L'espace de noms spécifié « <nowiki>$1</nowiki> » n'est pas valide.\nSpécifiez un espace de noms différent pour le projet.",
+       "config-ns-conflict": "L'espace de noms spécifié « <nowiki>$1</nowiki> » est en conflit avec un espace de noms par défaut de MediaWiki.\nChoisir un autre espace de noms pour le projet.",
        "config-admin-box": "Compte administrateur",
        "config-admin-name": "Votre nom d’utilisateur :",
        "config-admin-password": "Mot de passe :",
        "config-admin-error-user": "Erreur interne lors de la création d'un administrateur avec le nom « <nowiki>$1</nowiki> ».",
        "config-admin-error-password": "Erreur interne lors de l'inscription d'un mot de passe pour l'administrateur « <nowiki>$1</nowiki> » : <pre>$2</pre>",
        "config-admin-error-bademail": "Vous avez entré une adresse de courriel invalide",
-       "config-subscribe": "Abonnez-vous à la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce liste d'annonce des nouvelles versions] (la page peut afficher le texte en français).",
+       "config-subscribe": "Abonnez-vous à la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce liste d'annonce des nouvelles versions]",
        "config-subscribe-help": "Il s'agit d'une liste de diffusion à faible volume utilisée servant à annoncer les nouvelles versions, y compris les versions améliorant la sécurité du logiciel.\nVous devriez y souscrire et mettre à jour votre version de MediaWiki lorsque de nouvelles versions sont publiées.",
        "config-subscribe-noemail": "Vous avez essayé de vous abonner à la liste de diffusion des communiqués, sans fournir une adresse courriel ! S'il vous plaît, fournir une adresse électronique si vous souhaitez vous abonner à la liste de diffusion.",
        "config-almost-done": "Vous avez presque fini !\nVous pouvez passer la configuration restante et installer immédiatement le wiki.",
        "config-profile-no-anon": "Création de compte requise",
        "config-profile-fishbowl": "Éditeurs autorisés seulement",
        "config-profile-private": "Wiki privé",
-       "config-profile-help": "Les wikis fonctionnent mieux lorsque vous laissez le plus de personnes possible le modifier.\nAvec MediaWiki, il est facile de vérifier les modifications récentes et de révoquer tout dommage créé par des utilisateurs débutants ou mal intentionnés.\n\nCependant, de nombreuses autres utilisations ont été trouvées au logiciel et il n’est pas toujours facile de convaincre tout le monde des bénéfices de l’esprit wiki.\nVous avez donc le choix.\n\nLe modèle '''{{int:config-profile-wiki}}''' autorise toute personne à modifier, y compris sans s’identifier.\n'''{{int:config-profile-no-anon}}''' fournit plus de contrôle, par l’identification, mais peut rebuter les contributeurs occasionnels.\n\n'''{{int:config-profile-fishbowl}}''' autorise la modification par les utilisateurs approuvés, mais le public peut toujours lire les pages et leur historique.\n'''{{int:config-profile-private}}''' n’autorise que les utilisateurs approuvés à voir et modifier les pages.\n\nDes configurations de droits d’utilisateurs plus complexes sont disponibles après l'installation, voir la [//www.mediawiki.org/wiki/Manual:User_rights page correspondante du manuel].",
+       "config-profile-help": "Les wikis fonctionnent mieux lorsque vous laissez le plus de personnes possible les modifier.\nAvec MediaWiki, il est facile de vérifier les modifications récentes et de révoquer tout dommage créé par des utilisateurs débutants ou mal intentionnés.\n\nCependant, de nombreuses autres utilisations ont été trouvées au logiciel et il n’est pas toujours facile de convaincre tout le monde des bénéfices de l’esprit wiki.\nVous avez donc le choix.\n\nLe modèle '''{{int:config-profile-wiki}}''' autorise toute personne à modifier, y compris sans s’identifier.\n'''{{int:config-profile-no-anon}}''' fournit plus de contrôle, mais peut rebuter les contributeurs occasionnels.\n\n'''{{int:config-profile-fishbowl}}''' autorise la modification par les utilisateurs approuvés, mais le public peut toujours lire les pages et leur historique.\n'''{{int:config-profile-private}}''' n’autorise que les utilisateurs approuvés à voir les pages dans le même groupe que les utilisateurs autorisés à y écrire.\n\nDes configurations de droits d’utilisateurs plus complexes sont disponibles après l'installation, voir la [//www.mediawiki.org/wiki/Manual:User_rights page correspondante du manuel].",
        "config-license": "Droits d'auteur et licence :",
        "config-license-none": "Aucune licence en bas de page",
        "config-license-cc-by-sa": "Creative Commons attribution partage à l'identique",
        "config-license-gfdl": "GNU Free Documentation License 1.3 ou ultérieure",
        "config-license-pd": "Domaine public",
        "config-license-cc-choose": "Sélectionner une licence Creative Commons personnalisée",
-       "config-license-help": "Beaucoup de wikis publics mettent l'ensemble des contributions sous [http://freedomdefined.org/Definition/Fr licence libre].\nCela contribue à créer un sentiment d'appartenance dans leur communauté et encourage les contributions sur le long terme.\nCe n'est généralement pas nécessaire pour un wiki privé ou d'entreprise.\n\nSi vous souhaitez utiliser des textes de Wikipédia, et souhaitez que Wikipédia réutilise des textes de votre wiki, vous devriez choisir la [http://creativecommons.org/licenses/by-sa/3.0/deed.fr licence ''Creative Commons Attribution Share Alike''] (CC-by-sa).\n\nWikipédia a déjà été publié selon les termes de la [http://fr.wikipedia.org/wiki/Licence_de_documentation_libre_GNU ''GNU Free Documentation License''] (GFDL).\nC'est une licence valide, mais elle est difficile à comprendre. De plus, elle possède des caractéristiques qui rendent difficiles la réutilisation.",
+       "config-license-help": "Beaucoup de wikis publics mettent l'ensemble des contributions sous [http://freedomdefined.org/Definition/Fr licence libre].\nCela contribue à créer un sentiment d'appartenance dans leur communauté et encourage les contributions sur le long terme.\nCe n'est généralement pas nécessaire pour un wiki privé ou d'entreprise.\n\nSi vous souhaitez utiliser des textes de Wikipédia, et souhaitez que Wikipédia réutilise des textes de votre wiki, vous devriez choisir la licence ''Creative Commons Attribution Share Alike''].\n\nWikipédia utilisait auparavent la ''GNU Free Documentation License'' (GFDL).\nC'est une licence valide, mais elle est difficile à comprendre. \nDe plus, elle possède des caractéristiques qui rendent difficile la réutilisation.sour GFDL des contenus.",
        "config-email-settings": "Paramètres de courriel",
        "config-enable-email": "Activer les courriels sortants",
        "config-enable-email-help": "Si vous souhaitez utiliser le courriel, vous devez [http://www.php.net/manual/en/mail.configuration.php configurer des paramètres PHP] (texte en anglais).\nSi vous ne voulez pas du service de courriel, vous pouvez le désactiver ici.",
        "config-email-sender-help": "Entrez l'adresse de courriel à utiliser comme adresse de retour des courriels sortant.\nLes courriels rejetés y seront envoyés.\nDe nombreux serveurs de courriels exigent au moins un [http://fr.wikipedia.org/wiki/Nom_de_domaine nom de domaine] valide.",
        "config-upload-settings": "Téléchargement des images et des fichiers",
        "config-upload-enable": "Activer le téléchargement des fichiers",
-       "config-upload-help": "Le téléchargement des fichiers expose votre serveur à des risques de sécurité.\nPour plus d'informations, lire la section [//www.mediawiki.org/wiki/Manual:Security ''Security''] du manuel d'installation (en anglais).\n\nPour autoriser le téléchargement des fichiers, modifier le mode du sous-répertoire <code>images</code> qui se situe sous le répertoire racine de MediaWiki.\nEnsuite, activez cette option.",
+       "config-upload-help": "Le téléchargement des fichiers expose votre serveur à des risques de sécurité.\nPour plus d'informations, lire la section [//www.mediawiki.org/wiki/Manual:Security ''Security''] du manuel d'installation (en anglais).\n\nPour autoriser le téléchargement des fichiers, modifier le mode du sous-répertoire <code>images</code> qui se situe sous le répertoire racine de MediaWiki de sorte à ce que le serveur web puisse écrire dedans.\nEnsuite, activez cette option.",
        "config-upload-deleted": "Répertoire pour les fichiers supprimés :",
        "config-upload-deleted-help": "Choisissez un répertoire qui servira à archiver les fichiers supprimés.\nIdéalement, il ne devrait pas être accessible depuis le web.",
        "config-logo": "URL du logo :",
        "config-advanced-settings": "Configuration avancée",
        "config-cache-options": "Paramètres pour la mise en cache des objets:",
        "config-cache-help": "La mise en cache des objets améliore la vitesse de MediaWiki en mettant en cache les données fréquemment utilisées.\nLes sites de taille moyenne à grande sont fortement encouragés à l'activer. Les petits sites y verront également des avantages.",
-       "config-cache-none": "Aucune mise en cache (aucune fonctionnalité supprimée, mais la vitesse peut changer sur les wikis importants)",
+       "config-cache-none": "Pas de mise en cache (aucune fonctionnalité n'a été supprimée, mais la vitesse peut changer sur les wikis importants)",
        "config-cache-accel": "Mise en cache des objets PHP (APC, XCache ou WinCache)",
        "config-cache-memcached": "Utiliser Memcached (nécessite une installation et une configuration supplémentaires)",
        "config-memcached-servers": "serveurs pour Memcached :",
-       "config-memcached-help": "Liste des adresses IP à utiliser pour Memcached.\nElles doivent être séparés par des virgules et vous devez spécifier le port à utiliser. Par exemple :\n  127.0.0.1:11211\n  192.168.1.25:1234",
-       "config-memcache-needservers": "Vous avez sélectionné Memcached comme type de cache, mais ne précisez pas de serveur.",
+       "config-memcached-help": "Liste des adresses IP à utiliser pour Memcached.\nUne par ligne, en indiquant le port à utiliser. Par exemple :\n  127.0.0.1:11211\n  192.168.1.25:1234",
+       "config-memcache-needservers": "Vous avez sélectionné Memcached comme type de cache, mais n'avez pas précisé de serveurs.",
        "config-memcache-badip": "Vous avez entré une adresse IP invalide pour Memcached: $1.",
        "config-memcache-noport": "Vous n'avez pas entré un port pour le serveur Memcached : $1.\nSi vous ne le connaissez pas, la valeur par défaut est 11211.",
        "config-memcache-badport": "Les numéros de port de Memcached sont situés entre $1 et $2.",
        "config-extensions": "Extensions",
        "config-extensions-help": "Les extensions énumérées ci-dessus ont été détectées dans votre répertoire <code>./extensions</code>.\n\nElles peuvent nécessiter une configuration supplémentaire, mais vous pouvez les activer maintenant",
        "config-install-alreadydone": "'''Attention''': Vous semblez avoir déjà installé MediaWiki et tentez de l'installer à nouveau.\nS'il vous plaît, allez à la page suivante.",
-       "config-install-begin": "En appuyant sur {{int:config-continue}}, vous commencerez l'installation de MediaWiki.\nSi vous voulez apporter des modifications, appuyez sur \"{{int:config-back}}\".",
+       "config-install-begin": "En appuyant sur {{int:config-continue}}, vous commencerez l'installation de MediaWiki.\nSi vous voulez encore apporter des modifications, appuyez sur \"{{int:config-back}}\".",
        "config-install-step-done": "fait",
        "config-install-step-failed": "échec",
        "config-install-extensions": "Inclusion des extensions",
        "config-install-pg-plpgsql": "Vérification du langage PL/pgSQL",
        "config-pg-no-plpgsql": "Vous devez installer le langage PL/pgSQL dans la base de données $1",
        "config-pg-no-create-privs": "Le compte que vous avez spécifié pour l'installation n'a pas suffisamment de privilèges pour créer un compte.",
-       "config-pg-not-in-role": "Le compte que vous avez spécifié pour l'utilisateur web existe déjà !\nLe compte que vous avez spécifié pour l'installation n'est pas un super-utilisateur et n'est pas membre du rôle de l'internaute, il est donc incapable de créer des objets appartenant à l'utilisateur web.!\n\nMediaWiki exige actuellement que les tableaux soient possédés par un utilisateur web. S'il vous plaît, spécifier un autre nom de compte web, ou cliquez sur \"retour\" et spécifier un utilisateur avec les privilèges suffisants.",
+       "config-pg-not-in-role": "Le compte que vous avez spécifié pour l'utilisateur web existe déjà.\nLe compte que vous avez spécifié pour l'installation n'est pas un super-utilisateur et n'est pas un membre du rôle de l'internaute, il est donc incapable de créer des objets appartenant à l'utilisateur web.\n\nMediaWiki exige actuellement que les tables soient possédés par un utilisateur web. S'il vous plaît, spécifiez un autre nom de compte web, ou cliquez sur \"retour\" et spécifiez un utilisateur ayant les privilèges suffisants pour installer.",
        "config-install-user": "Création d'un utilisateur de la base de données",
        "config-install-user-alreadyexists": "L'utilisateur « $1 » existe déjà.",
        "config-install-user-create-failed": "Échec lors de la création de l'utilisateur « $1 » : $2",
        "config-install-user-grant-failed": "Échec lors de l'ajout de permissions à l'utilisateur « $1 » : $2",
        "config-install-user-missing": "L'utilisateur \"$1\" n'existe pas.",
-       "config-install-user-missing-create": "L'utilisateur \"$1\" n'existe pas !\nS'il vous plaît, cocher \"Compte de créer\" dans la case ci-dessous si vous voulez le créer.",
+       "config-install-user-missing-create": "L'utilisateur \"$1\" n'existe pas.\nS'il vous plaît, cocher \"Compte de créer\" dans la case ci-dessous si vous voulez le créer.",
        "config-install-tables": "Création des tables",
        "config-install-tables-exist": "'''Avertissement:''' Les tables MediaWiki semblent déjà exister.\nCréation omise.",
-       "config-install-tables-failed": "'''Erreur:''' échec lors de la création de la table avec l'erreur suivante: $1",
+       "config-install-tables-failed": "'''Erreur:''' échec lors de la création de table avec l'erreur suivante: $1",
        "config-install-interwiki": "Remplissage par défaut de la table des interwikis",
-       "config-install-interwiki-list": "Impossible de trouver le fichier <code>interwiki.list</code>.",
+       "config-install-interwiki-list": "Impossible de lire le fichier <code>interwiki.list</code>.",
        "config-install-interwiki-exists": "'''Attention:''' La table des interwikis semble déjà contenir des entrées.\nLa liste par défaut ne sera pas inscrite.",
        "config-install-stats": "Initialisation des statistiques",
        "config-install-keys": "Génération de la clé secrète",
        "config-install-mainpage": "Création de la page principale avec un contenu par défaut",
        "config-install-extension-tables": "Création de tables pour les extensions activées",
        "config-install-mainpage-failed": "Impossible d’insérer la page principale : $1",
-       "config-install-done": "'''Félicitations!'''\nVous avez réussi à installer MediaWiki.\n\nLe programme d'installation a généré <code>LocalSettings.php</code>, un fichier qui contient tous les paramètres de configuration.\n\nSi le téléchargement n'a pas été offert, ou que vous l'avez annulé, vous pouvez démarrer à nouveau le téléchargement en cliquant ce lien :\n\n$3\n\n'''Note''': Si vous ne le faites pas maintenant, ce fichier de configuration généré ne sera pas disponible plus tard si vous quittez l'installation sans le télécharger.\n\nLorsque c'est fait, vous pouvez '''[$2 accéder à votre wiki]'''.",
+       "config-install-done": "'''Félicitations!'''\nVous avez réussi à installer MediaWiki.\n\nLe programme d'installation a généré un fichier <code>LocalSettings.php</code>. Il contient tous les paramètres de votre configuration.\n\nVous devrez le télécharger et le mettre à la racine de votre installation wiki (dans le même répertoire que index.php). Le téléchargement démarre automatiquement.\n\nSi le téléchargement n'a pas été offert, ou que vous l'avez annulé, vous pouvez démarrer à nouveau le téléchargement en cliquant ce lien :\n\n$3\n\n'''Note''': Si vous ne le faites pas maintenant, ce fichier de configuration généré ne sera pas disponible plus tard si vous quittez l'installation sans le télécharger.\n\nLorsque c'est fait, vous pouvez '''[$2 accéder à votre wiki]'''.",
        "config-download-localsettings": "Télécharger <code>LocalSettings.php</code>",
        "config-help": "aide",
        "config-nofile": "Le fichier « $1 » est introuvable. A-t-il été supprimé ?",
-       "config-extension-link": "Saviez-vous que votre wiki supporte [//www.mediawiki.org/wiki/Manual:Extensions des extensions] ?\n\nVous pouvez consulter les [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions par catégorie] ou la [//www.mediawiki.org/wiki/Extension_Matrix Matrice des extensions] pourvoir la liste complète des extensions.",
+       "config-extension-link": "Saviez-vous que votre wiki supporte [//www.mediawiki.org/wiki/Manual:Extensions des extensions] ?\n\nVous pouvez consulter les [//www.mediawiki.org/wiki/Category:Extensions_by_category extensions par catégorie].",
        "mainpagetext": "<strong>MediaWiki a été installé avec succès.</strong>",
        "mainpagedocfooter": "Consultez le [//meta.wikimedia.org/wiki/Aide:Contenu Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.\n\n== Pour démarrer ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Liste des paramètres de configuration]\n* [//www.mediawiki.org/wiki/Manual:FAQ/fr FAQ sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]"
 }
index afde799..3e862c0 100644 (file)
        "config-download-localsettings": "הורדת <code>LocalSettings.php</code>",
        "config-help": "עזרה",
        "config-nofile": "הקובץ \"$1\" לא נמצא. האם הוא נמחק?",
-       "config-extension-link": "הידעת שמדיה־ויקי תומכת ב־[//www.mediawiki.org/wiki/Manual:Extensions הרחבות]?\n\nבאפשרותך לעיין ב־[//www.mediawiki.org/wiki/Category:Extensions_by_category הרחבות לפי קטגוריה] או ב־[//www.mediawiki.org/wiki/Extension_Matrix מטריצת ההרחבות] לרשימה מלאה של הרחבות.",
+       "config-extension-link": "הידעת שמדיה־ויקי תומכת ב־[//www.mediawiki.org/wiki/Manual:Extensions הרחבות]?\n\nבאפשרותך לעיין ב־[//www.mediawiki.org/wiki/Category:Extensions_by_category הרחבות לפי קטגוריה].",
        "mainpagetext": "'''תוכנת מדיה־ויקי הותקנה בהצלחה.'''",
        "mainpagedocfooter": "היעזרו ב[//meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings רשימת ההגדרות]\n* [//www.mediawiki.org/wiki/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]"
 }
index fa248b8..04e4399 100644 (file)
@@ -88,6 +88,8 @@
        "config-no-cli-uri": "'''Attenzione''': <code>--scriptpath</code> non specificato, si utilizza il valore predefinito: <code>$1</code>.",
        "config-using-server": "Nome server in uso \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "URL del server in uso \"<nowiki>$1$2</nowiki>\".",
+       "config-uploads-not-safe": "<strong>Attenzione:</strong> la directory predefinita per i caricamenti <code>$1</code> è vulnerabile all'esecuzione arbitraria di script.\nAnche se MediaWiki controlla tutti i file caricati per rischi alla sicurezza, è fortemente raccomandato di [//www.mediawiki.org/wiki/Manual:Security#Upload_security chiudere questa vulnerabilità di sicurezza] prima di abilitare i caricamenti.",
+       "config-no-cli-uploads-check": "<strong>Attenzione:</strong> la directory predefinita per i caricamenti (<code>$1</code>) non è stata verificata per la vulnerabilità sull'esecuzione arbitraria di script durante l'installazione da linea di comando.",
        "config-brokenlibxml": "Il tuo sistema ha una combinazione di versioni di PHP e libxml2 che è difettosa e che può provocare un danneggiamento non visibile di dati in MediaWiki ed in altre applicazioni per il web.\nAggiorna a libxml2 2.7.3 o successivo ([https://bugs.php.net/bug.php?id=45996 il bug è studiato dal lato PHP]).\nInstallazione interrotta.",
        "config-db-type": "Tipo di database:",
        "config-db-host": "Host del database:",
        "config-missing-db-name": "È necessario immettere un valore per \"{{int:config-db-name}}\".",
        "config-missing-db-host": "È necessario immettere un valore per \"{{int:config-db-host}}\".",
        "config-missing-db-server-oracle": "È necessario immettere un valore per \"{{int:config-db-host-oracle}}\".",
+       "config-invalid-db-server-oracle": "TNS database \"$1\" non valido.\nUsa \"TNS Name\" o una stringa \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods]).",
        "config-invalid-db-name": "Nome di database \"$1\" non valido.\nUtilizza soltanto caratteri ASCII come lettere (a-z, A-Z), numeri (0-9), sottolineatura (_) e trattini (-).",
        "config-invalid-db-prefix": "Prefisso database \"$1\" non valido.\nUtilizza soltanto caratteri ASCII come lettere (a-z, A-Z), numeri (0-9), sottolineatura (_) e trattini (-).",
        "config-connection-error": "$1.\n\nControlla host, nome utente e password e prova ancora.",
        "config-install-user-create-failed": "Creazione dell'utente \"$1\" non riuscita: $2",
        "config-install-user-grant-failed": "Errore durante la concessione delle autorizzazione all'utente \"$1\": $2",
        "config-install-user-missing": "L'utente indicato \"$1\" non esiste.",
+       "config-install-user-missing-create": "L'utente indicato \"$1\" non esiste.\nSeleziona la casella \"crea utenza\" qui sotto se vuoi crearla.",
        "config-install-tables": "Creazione tabelle",
        "config-install-tables-exist": "'''Attenzione:''' sembra che le tabelle di MediaWiki esistono già.\nSalto la creazione.",
        "config-install-tables-failed": "'''Errore''': La creazione della tabella non è riuscita: $1",
        "config-install-mainpage": "Creazione della pagina principale con contenuto predefinito",
        "config-install-extension-tables": "Creazione delle tabelle per le estensioni attivate",
        "config-install-mainpage-failed": "Impossibile inserire la pagina principale: $1",
+       "config-install-done": "<strong>Complimenti!</strong>\nHai installato correttamente MediaWiki.\n\nIl programma di installazione ha generato un file <code>LocalSettings.php</code> che contiene tutte le impostazioni.\n\nDevi scaricarlo ed inserirlo nella directory base del tuo wiki (la stessa dove è presente index.php). Il download dovrebbe partire automaticamente.\n\nSe il download non si avvia, o se è stato annullato, puoi riavviarlo cliccando sul collegamento di seguito:\n\n$3\n\n<strong>Nota:</strong> se esci ora dall'installazione senza scaricare il file di configurazione che è stato generato, questo poi non sarà più disponibile in seguito.\n\nQuando hai fatto, puoi <strong>[$2 entrare nel tuo wiki]</strong>.",
        "config-download-localsettings": "Scarica <code>LocalSettings.php</code>",
        "config-help": "aiuto",
        "config-nofile": "Il file \"$1\" non può essere trovato. È stato eliminato?",
+       "config-extension-link": "Sapevi che il tuo wiki supporta le  [//www.mediawiki.org/wiki/Manual:Extensions estensioni]?\n\nPuoi navigare tra le [//www.mediawiki.org/wiki/Category:Extensions_by_category estensioni per categoria].",
        "mainpagetext": "'''Installazione di MediaWiki completata correttamente.'''",
        "mainpagedocfooter": "Consultare la [//meta.wikimedia.org/wiki/Aiuto:Sommario Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\nI seguenti collegamenti sono in lingua inglese:\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Impostazioni di configurazione]\n* [//www.mediawiki.org/wiki/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localizza MediaWiki nella tua lingua]"
 }
index 0275547..890dba8 100644 (file)
        "config-db-username": "データベースのユーザー名:",
        "config-db-password": "データベースのパスワード:",
        "config-db-password-empty": "新しいデータベースの利用者名 $1 のパスワードを入力してください。\nパスワードを設定せずにユーザーを作成できる場合もありますが、安全ではありません。",
-       "config-db-username-empty": "「{{int:config-db-username}}」を入力してください",
+       "config-db-username-empty": "「{{int:config-db-username}}」を入力してください",
        "config-db-install-username": "インストール中にデータベースへの接続で使用するユーザー名を入力してください。\nこれは MediaWiki アカウントの利用者名のことではありません。あなたのデータベースでのユーザー名です。",
        "config-db-install-password": "インストール中にデータベースへの接続で使用するパスワードを入力してください。\nこれは MediaWiki アカウントのパスワードのことではありません。あなたのデータベースでのパスワードです。",
        "config-db-install-help": "インストール作業中にデータベースに接続するための利用者名とパスワードを入力してください。",
        "config-sqlite-connection-error": "$1。\n\nデータ ディレクトリおよびデータベース名を確認してから、再度試してください。",
        "config-sqlite-readonly": "ファイル <code>$1</code> に書き込めません。",
        "config-sqlite-cant-create-db": "データベース ファイル <code>$1</code> を作成できませんでした。",
-       "config-sqlite-fts3-downgrade": "PHP が FTS3 に対応していないため、テーブルをダウングレードしています",
+       "config-sqlite-fts3-downgrade": "PHP が FTS3 に対応していないため、テーブルをダウングレードしています",
        "config-can-upgrade": "このデータベースには MediaWiki テーブルがあります。\nこれらのテーブルを MediaWiki $1 にアップグレードするには、<strong>続行</strong>をクリックしてください。",
        "config-upgrade-done": "更新は完了しました。\n\n[$1 ウィキを使い始める]ことができます。\n\n<code>LocalSettings.php</code> ファイルを再生成したい場合は、下のボタンを押してください。\nウィキに問題がある場合を除き、再生成は<strong>推奨されません</strong>。",
        "config-upgrade-done-no-regenerate": "アップグレードが完了しました。\n\n[$1 ウィキの使用を開始]することができます。",
        "config-install-stats": "統計情報の初期化",
        "config-install-keys": "秘密鍵の生成",
        "config-install-sysop": "管理者のアカウントの作成",
+       "config-install-subscribe-notpossible": "cURL がインストールされていないため、<code>allow_url_fopen</code> を利用できません。",
        "config-install-mainpage": "メインページを既定の内容で作成",
        "config-install-mainpage-failed": "メインページを挿入できませんでした: $1",
        "config-install-done": "<strong>おめでとうございます!</strong>\nMediaWikiのインストールに成功しました。\n\n<code>LocalSettings.php</code>ファイルが生成されました。\nこのファイルはすべての設定を含んでいます。\n\nこれをダウンロードして、ウィキをインストールした基準ディレクトリ (index.phpと同じディレクトリ) に設置する必要があります。ダウンロードは自動的に開始されるはずです。\n\nダウンロードが開始されていない場合、またはダウンロードをキャンセルした場合は、下記のリンクをクリックしてダウンロードを再開できます:\n\n$3\n\n<strong>注意:</strong> この生成された設定ファイルをダウンロードせずにインストールを終了すると、このファイルは利用できなくなります。\n\n上記の作業が完了すると、<strong>[$2 ウィキに入る]</strong>ことができます。",
index 4bb0c68..f74df12 100644 (file)
@@ -4,7 +4,8 @@
                        "Kwj2772",
                        "아라",
                        "Hym411",
-                       "Priviet"
+                       "Priviet",
+                       "Namoroka"
                ]
        },
        "config-desc": "미디어위키 설치 프로그램",
        "config-download-localsettings": "<code>LocalSettings.php</code> 다운로드",
        "config-help": "도움말",
        "config-nofile": "\"$1\" 파일을 찾을 수 없습니다. 이미 삭제되었나요?",
-       "config-extension-link": "당신의 위키가 [//www.mediawiki.org/wiki/Manual:Extensions 확장 기능]을 지원한다는 것을 알고 계십니까?\n\n전체 확장 기능의 목록을 확인하려면 [//www.mediawiki.org/wiki/Category:Extensions_by_category 분류별 확장 기능]이나 [//www.mediawiki.org/wiki/Extension_Matrix 확장 기능 표]를 찾아보실 수 있습니다.",
+       "config-extension-link": "당신의 위키가 [//www.mediawiki.org/wiki/Manual:Extensions 확장 기능]을 지원한다는 것을 알고 계십니까?\n\n[//www.mediawiki.org/wiki/Category:Extensions_by_category 분류별 확장 기능]을 찾아보실 수 있습니다.",
        "mainpagetext": "'''미디어위키가 성공적으로 설치되었습니다.'''",
        "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents 이곳]에서 위키 소프트웨어에 대한 정보를 얻을 수 있습니다.\n\n== 시작하기 ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings 설정하기 목록]\n* [//www.mediawiki.org/wiki/Manual:FAQ 미디어위키 FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 미디어위키 릴리스 메일링 리스트]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources 내 언어로 미디어위키 지역화]"
 }
index d8a7752..e2851e2 100644 (file)
        "config-download-localsettings": "Преземи го <code>LocalSettings.php</code>",
        "config-help": "помош",
        "config-nofile": "Податотеката „$1“ не е пронајдена. Да не е избришана?",
-       "config-extension-link": "Дали сте знаеле дека вашето вики поддржува [//www.mediawiki.org/wiki/Manual:Extensions додатоци]?\n\nМожете да ги прелистате [//www.mediawiki.org/wiki/Category:Extensions_by_category по категории] или да ја посетите [//www.mediawiki.org/wiki/Extension_Matrix матрицата], каде ќе најдете полн список на додатоци.",
+       "config-extension-link": "Дали сте знаеле дека вашето вики поддржува [//www.mediawiki.org/wiki/Manual:Extensions додатоци]?\n\nМожете да ги прелистате [//www.mediawiki.org/wiki/Category:Extensions_by_category по категории]",
        "mainpagetext": "'''МедијаВики е успешно воспоставен.'''",
        "mainpagedocfooter": "Погледнете го [//meta.wikimedia.org/wiki/Help:Contents Упатството за корисници] за подетални иформации како се користи вики-програмот.\n\n==Од каде да почнете==\n* [//meta.wikimedia.org/wiki/Manual:Configuration_settings Список на нагодувања]\n* [//meta.wikimedia.org/wiki/Manual:FAQ ЧПП (често поставувани прашања) за МедијаВики].\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Поштенски список на МедијаВики за нови верзии]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Локализирајте го МедијаВики на вашиот јазик]"
 }
index bfc8d53..1886a03 100644 (file)
        "config-header-oracle": "Ustawienia Oracle",
        "config-header-mssql": "Ustawienia Microsoft SQL Server",
        "config-invalid-db-type": "Nieprawidłowy typ bazy danych",
-       "config-missing-db-name": "Należy wpisać wartość w polu „Nazwa bazy danych”",
-       "config-missing-db-host": "Musisz wpisać wartość w polu „Serwer bazy danych”",
-       "config-missing-db-server-oracle": "Należy wpisać wartość w polu „Nazwa instancji bazy danych (TNS)”",
+       "config-missing-db-name": "Należy wpisać wartość w polu „{{int:config-db-name}}”.",
+       "config-missing-db-host": "Należy wpisać wartość w polu „{{int:config-db-host}}”.",
+       "config-missing-db-server-oracle": "Należy wpisać wartość w polu „{{int:config-db-host-oracle}}”.",
        "config-invalid-db-server-oracle": "Nieprawidłowa nazwa instancji bazy danych (TNS) „$1”.\nUżyj \"TNS Name\" lub \"Easy Connect\" ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])",
        "config-invalid-db-name": "Nieprawidłowa nazwa bazy danych „$1”.\nUżywaj wyłącznie liter ASCII (a-z, A-Z), cyfr (0-9), podkreślenia (_) lub znaku odejmowania (-).",
        "config-invalid-db-prefix": "Nieprawidłowy prefiks bazy danych „$1”.\nUżywaj wyłącznie liter ASCII (a-z, A-Z), cyfr (0-9), podkreślenia (_) lub znaku odejmowania (-).",
        "config-mysql-utf8": "UTF‐8",
        "config-mysql-charset-help": "W '''trybie binarnym''', MediaWiki zapisuje tekst UTF-8 do bazy danych w polach binarnych.\nJest on bardziej wydajny niż tryb UTF-8 w MySQL i pozwala na używanie znaków pełnego zakresu Unicode.\n\nW '''trybie UTF-8''', MySQL będzie znać zestaw znaków w jakim zakodowano dane, można też przedstawić i przekonwertuj je odpowiednio, ale nie pozwoli Ci przechowywać znaków spoza [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes podstawowej płaszczyzny wielojęzyczności].",
        "config-mssql-auth": "Typ uwierzytelniania:",
+       "config-mssql-install-auth": "Wybierz typ uwierzytelniania, który będzie używany do łączenia się z bazą danych w trakcie procesu instalacji.\nJeśli wybierzesz „{{int:config-mssql-windowsauth}}”, będą wykorzystywane dane konta użytkownika, pod którym działa serwer www.",
        "config-mssql-sqlauth": "Uwierzytelnianie serwera SQL",
        "config-mssql-windowsauth": "Autoryzacja Windows",
        "config-site-name": "Nazwa wiki:",
index 312343e..cfe4b8e 100644 (file)
        "config-download-localsettings": "Download do <code>LocalSettings.php</code>",
        "config-help": "ajuda",
        "config-nofile": "Não foi possível encontrar o ficheiro \"$1\". Terá sido apagado?",
-       "config-extension-link": "Sabia que a sua wiki suporta [//www.mediawiki.org/wiki/Manual:Extensions extensões]?\n\nPode navegar as [//www.mediawiki.org/wiki/Category:Extensions_by_category extensões por categoria] ou a [//www.mediawiki.org/wiki/Extension_Matrix Matriz de Extensões] para ver a lista completa.",
+       "config-extension-link": "Sabia que a sua wiki suporta [//www.mediawiki.org/wiki/Manual:Extensions extensões]?\n\nPode procurar [//www.mediawiki.org/wiki/Category:Extensions_by_category extensões por categoria].",
        "mainpagetext": "'''MediaWiki instalado com sucesso.'''",
        "mainpagedocfooter": "Consulte o [//meta.wikimedia.org/wiki/Help:Contents Guia de Utilizadores] para informações sobre o uso do software wiki.\n\n== Onde começar ==\n\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de opções de configuração]\n* [//www.mediawiki.org/wiki/Manual:FAQ Perguntas e respostas frequentes sobre o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Subscreva a lista de divulgação de novas versões do MediaWiki]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources Regionalize MediaWiki para seu idioma]"
 }
index a745d5c..ccd9c2b 100644 (file)
        "config-git": "Foond the Git version control saffware: <code>$1</code>.",
        "config-git-bad": "Git version control saffware no foond.",
        "config-imagemagick": "Foond ImageMagick: <code>$1</code>.\nEemage thummnailin will be enabled gif ye enable uplaids.",
-       "config-gd": "Foond GD graphics librie biggit-in.\nEimage thumbnailing will be enabled gif ye enable uplaids.",
-       "config-no-scaling": "Coudna fynd GD librie or ImageMagick.\nEimage thumbnailing will be disabled.",
+       "config-gd": "Foond GD graphics librie biggit-in.\nEemage thummnailin will be enabled gif ye enable uplaids.",
+       "config-no-scaling": "Coudna fynd GD librie or ImageMagick.\nEemage thummnailin will be disabled.",
        "config-no-uri": "<strong>Mistak:</strong> Coudna determine the current URI.\nInstallâtion aborted.",
-       "config-no-cli-uri": "<strong>Warnishment:</strong> Naw <code>--scriptpath</code> speceefied, uising defaut: <code>$1</code>.",
+       "config-no-cli-uri": "<strong>Warnishment:</strong> Naw <code>--scriptpath</code> speceefied, uisin defaut: <code>$1</code>.",
        "config-using-server": "Uisin server name \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Uisin server URL \"<nowiki>$1$2</nowiki>\".",
        "config-uploads-not-safe": "<strong>Warnishment:</strong> Yer defaut directerie fer uplaids <code>$1</code> is vulnerable til arbitrie scripts execution.\nAathough MediaWiki checks aw uplaided files fer securitie threats, it is heily recommended tae [//www.mediawiki.org/wiki/Manual:Security#Upload_security close this security vulnerabeelitie] afore enablin uplaids.",
        "config-header-oracle": "Oracle settins",
        "config-header-mssql": "Microsoft SQL Server settings",
        "config-invalid-db-type": "Onvalid database type",
-       "config-missing-db-name": "Ye maun enter ae value fer \"Database name\"",
-       "config-missing-db-host": "Ye maun enter ae value fer \"Database host\"",
-       "config-missing-db-server-oracle": "Ye mau enter ae value fer \"Database TNS\"",
+       "config-missing-db-name": "Ye maun enter ae value fer \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "Ye maun enter ae value fer \"{{int:config-db-host}}\".",
+       "config-missing-db-server-oracle": "Ye maun enter ae value fer \"{{int:config-db-host-oracle}}\".",
        "config-invalid-db-server-oracle": "Onvalid database TNS \"$1\".\nUise either \"TNS Name\" or aen \"Easy Connect\" string ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle Naming Methods])",
        "config-invalid-db-name": "Onvalid database name \"$1\".\nUise yinly ASCII letters (a-z, A-Z), nummers (0-9), unnerscores (_) an hyphens (-).",
        "config-invalid-db-prefix": "Onvalid database prefix \"$1\".\nUise yinly ASCII letters (a-z, A-Z), nummers (0-9), unnerscores (_) an hyphens (-).",
        "config-insecure-keys": "<strong>Warnishment:</strong> {{PLURAL:$2|Ae secure key|Secure keys}} ($1) generated durin instawation {{PLURAL:$2|is|ar}} naw compleatelie safe. Consider chyngin {{PLURAL:$2|it|theim}} manuallie.",
        "config-install-sysop": "Makin admeenistrâter uiser accoont",
        "config-install-subscribe-fail": "Onable tae subscribe til mediawiki-announce: $1",
-       "config-install-subscribe-notpossible": "cURL isna instawed n <code>allow_url_fopen</code> isna available.",
+       "config-install-subscribe-notpossible": "cURL isna instawed n <code>allow_url_fopen</code> is na available.",
        "config-install-mainpage": "Cræftin main page wi defaut content",
        "config-install-extension-tables": "Makin buirds fer enabled extensions",
        "config-install-mainpage-failed": "Coudna insert main page: $1",
index a94f306..70c226d 100644 (file)
        "config-download-localsettings": "下载<code>LocalSettings.php</code>",
        "config-help": "帮助",
        "config-nofile": "找不到文件“$1”。它是否已被删除?",
-       "config-extension-link": "您是否知道您的wiki支持[//www.mediawiki.org/wiki/Manual:Extensions 拓展]?\n\n您可浏览[//www.mediawiki.org/wiki/Category:Extensions_by_category 拓展分类]或[//www.mediawiki.org/wiki/Extension_Matrix 拓展矩阵]以查找完整的拓展列表。",
+       "config-extension-link": "您是否知道您的wiki支持[//www.mediawiki.org/wiki/Manual:Extensions 拓展]?\n您可浏览[//www.mediawiki.org/wiki/Category:Extensions_by_category 拓展分类]。",
        "mainpagetext": "'''已成功安装MediaWiki。'''",
        "mainpagedocfooter": "请查阅[//meta.wikimedia.org/wiki/Help:Contents 用户指南]以获取使用本wiki软件的信息!\n\n== 入门 ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki配置设置列表]\n* [//www.mediawiki.org/wiki/Manual:FAQ/zh-hans MediaWiki常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources 本地化MediaWiki到您的语言]"
 }
index 3b655e2..ae3e9f8 100644 (file)
                        "Simon Shek",
                        "아라",
                        "Liuxinyu970226",
-                       "Xiaomingyan"
+                       "Xiaomingyan",
+                       "Cwlin0416"
                ]
        },
-       "config-desc": "MediaWiki安裝程式",
-       "config-title": "MediaWiki $1配置",
+       "config-desc": "MediaWiki 安裝程式",
+       "config-title": "MediaWiki $1 安裝",
        "config-information": "資訊",
-       "config-localsettings-upgrade": "已檢測到<code>LocalSettings.php</code>文件。要升級該配置,請在下面的框中輸入<code>$wgUpgradeKey</code>的值。您可以在<code>LocalSettings.php</code>中找到它。",
-       "config-localsettings-cli-upgrade": "已檢測到<code>LocalSettings.php</code>文件。要升級該配置,請直接執行<code>update.php</code>。",
-       "config-localsettings-key": "升級鑰:",
-       "config-localsettings-badkey": "您提供的密鑰不正確。",
-       "config-upgrade-key-missing": "檢測到MediaWiki的配置已經存在。若要升級該配置,請將下面一行文本添加到<code>LocalSettings.php</code>的底部:\n\n$1",
-       "config-localsettings-incomplete": "ç\95¶å\89\8dç\9a\84<code>LocalSettings.php</code>å\8f¯è\83½ä¸¦ä¸\8då®\8cæ\95´ï¼\8cå\9b ç\82ºè®\8aé\87\8f$1æ²\92æ\9c\89設置ã\80\82è«\8bå\9c¨<code>LocalSettings.php</code>設置該è®\8aé\87\8fï¼\8c並å\96®æ\93\8aã\80\8c{{int:Config-continue}}ã\80\8d。",
-       "config-localsettings-connection-error": "在使用<code>LocalSettings.php</code>或<code>AdminSettings.php</code>中指定的設置連接數據庫時發生錯誤。請修復相應設置並重試。\n\n$1",
-       "config-session-error": "啟動會話出錯:$1",
-       "config-session-expired": "您的會話數據可能已經過期,當前會話的使用期限被設定為$1。您可以在php.ini中設置<code>session.gc_maxlifetime</code>來延長此期限,並重新啟動本配置程序。",
-       "config-no-session": "您的會話數據丟失了!請檢查php.ini並確保<code>session.save_path</code>被設置為適當的目錄。",
+       "config-localsettings-upgrade": "已偵測到 <code>LocalSettings.php</code> 檔案。\n要升級目前安裝的版本,請在下方輸入框中輸入 <code>$wgUpgradeKey</code> 的值。\n您可以從 <code>LocalSettings.php</code> 檔案中找到。",
+       "config-localsettings-cli-upgrade": "已偵測到 <code>LocalSettings.php</code> 檔案。\n要升級目前安裝的版本,請執行 <code>update.php</code>。",
+       "config-localsettings-key": "升級鑰:",
+       "config-localsettings-badkey": "你提供的金鑰不正確。",
+       "config-upgrade-key-missing": "已偵測到先前安裝的 MediaWiki。\n要升級目前安裝的版本,請將下列文字附加到 <code>LocalSettings.php</code> 的檔案最下方:\n\n$1",
+       "config-localsettings-incomplete": "ç\9b®å\89\8dç\9a\84 <code>LocalSettings.php</code> æª\94æ¡\88ä¸\8då®\8cæ\95´ã\80\82\næ\9cªè¨­å®\9aå\8f\83æ\95¸ $1ã\80\82\nè«\8bå°\87æ­¤å\8f\83æ\95¸è¨­å®\9aè\87³ <code>LocalSettings.php</code> ä¸­ï¼\8c並é»\9eé\81¸ \"{{int:Config-continue}}\"。",
+       "config-localsettings-connection-error": "使用 <code>LocalSettings.php</code> 中所指定的資料庫設定連線發生錯誤。 請修復相關設定並再試一次。\n\n$1",
+       "config-session-error": "開始工作階段錯誤:$1",
+       "config-session-expired": "您的工作階段已過期。\n目前設定的工作階段期限為 $1。\n您可以在 php.ini 設定檔中設定 <code>session.gc_maxlifetime</code> 的參數來延長此期限。\n重新開始安裝程序。",
+       "config-no-session": "您的工作階段資料遺失!\n請檢查 php.ini 設定檔並確認 <code>session.save_path</code> 所設定的目錄是否合適。",
        "config-your-language": "您的語言:",
-       "config-your-language-help": "選擇一個要使用的語言在安裝過程中。",
-       "config-wiki-language": "Wiki語言:",
-       "config-wiki-language-help": "選擇將要安裝的wiki在多數情況下使用的語言。",
-       "config-back": "←返回",
-       "config-continue": "繼續→",
+       "config-your-language-help": "請選擇接下來安裝程序中要使用的語言。",
+       "config-wiki-language": "Wiki 語言:",
+       "config-wiki-language-help": "選擇將要安裝的 Wiki 多數情況主要使用的語言。",
+       "config-back": "← 返回",
+       "config-continue": "繼續 →",
        "config-page-language": "語言",
-       "config-page-welcome": "歡迎您來到MediaWiki!",
-       "config-page-dbconnect": "連接到數據庫",
-       "config-page-upgrade": "å\8d\87ç´\9aç\8f¾æ\9c\89ç\9a\84å®\89è£\9d",
-       "config-page-dbsettings": "數據庫設定",
+       "config-page-welcome": "歡迎您來到 MediaWiki!",
+       "config-page-dbconnect": "連線到資料庫",
+       "config-page-upgrade": "å\8d\87ç´\9aç\9b®å\89\8då®\89è£\9dç\9a\84ç\89\88æ\9c¬",
+       "config-page-dbsettings": "資料庫設定",
        "config-page-name": "名稱",
        "config-page-options": "選項",
        "config-page-install": "安裝",
        "config-page-complete": "完成!",
        "config-page-restart": "重新安裝",
-       "config-page-readme": "讀我",
-       "config-page-releasenotes": "發說明",
+       "config-page-readme": "讀我說明",
+       "config-page-releasenotes": "發說明",
        "config-page-copying": "複製",
        "config-page-upgradedoc": "升級",
-       "config-page-existingwiki": "已有wiki",
-       "config-help-restart": "是否要清除所有已輸入且保存的數據,並重新啟動安裝過程嗎?",
-       "config-restart": "是的,重新啟動",
-       "config-welcome": "=== 環境檢查 ===\n對當前環境是否適合安裝MediaWiki作基本的檢查。如果您在安裝過程中需要幫助,請提供這些檢查的結果。",
-       "config-copyright": "=== 版權和條款 ===\n\n$1\n\n本程序為自由軟件;您可依據自由軟件基金會所發表的GNU通用公共授權條款規定,就本程序再為發布與/或修改;無論您依據的是本授權的第二版或(您自行選擇的)任一日後發行的版本。\n\n本程序是基於使用目的而加以發布,然而'''不負任何擔保責任''';亦無對'''適售性'''或'''特定目的適用性'''所為的默示性擔保。詳情請參照GNU通用公共授權。\n\n您應已收到附隨於本程序的<doclink href=\"Copying\">GNU通用公共授權的副本</doclink>;如果沒有,請寫信至自由軟件基金會:59 Temple Place - Suite 330, Boston, Ma 02111-1307, USA,或[http://www.gnu.org/copyleft/gpl.html 在線閱讀]。",
-       "config-sidebar": "* [www.mediawiki.org/wiki/MediaWiki/zh-hant MediaWiki首頁]\n* [www.mediawiki.org/wiki/Help:Contents/zh 用戶指南]\n* [//www.mediawiki.org/wiki/Manual:Contents/zh 管理員指南]\n* [//www.mediawiki.org/wiki/Manual:FAQ/zh-hant 常見問題解答]\n----\n* <doclink href=Readme>自述文件</doclink>\n* <doclink href=ReleaseNotes>發行說明</doclink>\n* <doclink href=Copying>協議副本</doclink>\n* <doclink href=UpgradeDoc>升級</doclink>",
-       "config-env-good": "環境檢查已經完成。您可以安裝MediaWiki。",
-       "config-env-bad": "環境檢查已經完成。您不能安裝MediaWiki。",
-       "config-env-php": "PHP $1已安裝。",
-       "config-env-php-toolow": "已安裝PHP $1;然而,MediaWiki要求PHP $2或更高版本。",
-       "config-unicode-using-utf8": "將使用 Brion Vibber 的 utf8_normalize.so 以實作 Unicode 正規化。",
-       "config-unicode-using-intl": "將使用 [http://pecl.php.net/intl intl PECL 延伸函式庫]以實作 Unicode 正規化。",
-       "config-unicode-pure-php-warning": "<strong>警告:</strong>因為尚未安裝[http://pecl.php.net/intl intl PECL延伸函式庫]以處理Unicode正規化,故只能退而採用較慢的純PHP實作。如果您運行着一個高流量的網站,您應當閱讀[//www.mediawiki.org/wiki/Unicode_normalization_considerations/zh Unicode正規化]一文。",
-       "config-unicode-update-warning": "'''警告''':Unicode正常化封裝器的已安裝版本使用了舊版本的[http://site.icu-project.org/ ICU項目]庫。如果您需要使用Unicode,請將其[//www.mediawiki.org/wiki/Unicode_normalization_considerations 升級]。",
-       "config-no-db": "找不到合適的數據庫驅動!您需要為PHP安裝數據庫驅動。目前支持以下數據庫:$1。\n\n如果您通過自行編譯安裝的PHP,請對其進行重新配置以啟用數據庫客戶端,例如使用<code>./configure --with-mysqli</code>。如果您通過Debian或Ubuntu包安裝PHP,您仍需安裝諸如<code>php5-mysql</code>等模塊。",
-       "config-outdated-sqlite": "'''警告''':您已安裝SQLite $1,但是它的版本低於最低要求版本$2。因此您無法選擇SQLite。",
-       "config-no-fts3": "'''警告''':已編譯的SQLite不包含[//sqlite.org/fts3.html FTS3模塊],後台搜索功能將不可用。",
-       "config-register-globals": "'''警告:PHP的<code>[http://php.net/register_globals register_globals]</code>選項被啟用。'''\n'''如果可以請將之禁用。'''\nMediaWiki仍將運行,但您的服務器會被暴露給潛在的安全漏洞。",
-       "config-magic-quotes-runtime": "'''致命錯誤:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]被啟用!'''\n此選項會無法預測地破壞輸入的數據,請將其禁用,否則您將不能安裝或使用MediaWiki。",
-       "config-magic-quotes-sybase": "'''致命錯誤:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_sybase]被啟用!'''\n此選項會無法預測地破壞輸入的數據,請將其禁用,否則您將不能安裝或使用MediaWiki。",
-       "config-mbstring": "'''致命錯誤:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]被啟用!'''\n此選項會導致錯誤並不可預測地破壞數據,請將其禁用,否則您將不能安裝或使用MediaWiki。",
-       "config-safe-mode": "'''警告:'''PHP的[http://www.php.net/features.safe-mode 安全模式]已啟用。它可能會導致一些問題,尤其在對文件上傳和數學公式<code>math</code>的支持方面。",
-       "config-xml-bad": "缺少PHP的XML模塊。MediaWiki需要使用該模塊提供的函數,在當前配置下將無法工作。如果您正在使用Mandrake Linux,請安裝php-xml包。",
-       "config-pcre-no-utf8": "'''致命錯誤''':PHP的PCRE模塊在編譯時可能沒有包含PCRE_UTF8支持。MediaWiki需要UTF-8支持才能正常工作。",
-       "config-memory-raised": "PHP的內存使用上限<code>memory_limit</code>為$1,自動提升到$2。",
-       "config-memory-bad": "'''警告:'''PHP的內存使用上限<code>memory_limit</code>為$1。該設定可能過低,並導致安裝失敗!",
-       "config-ctype": "'''毀滅性錯誤''':PHP必須有[http://www.php.net/manual/en/ctype.installation.php Ctype 擴展]來支持編譯。",
-       "config-json": "'''致命錯誤:'''PHP編譯程式並無法支援JSON。於MediaWiki繼續安裝之前您必須安裝PHP JSON拓展或[http://pecl.php.net/package/jsonc PECL jsonc]拓展。\n* PHP拓展包含於紅帽Linux(CentOS)5版至6版,這些用戶必須於<code>/etc/php.ini</code>或<code>/etc/php.d/json.ini</code>啟用之。\n* 部分於2013年5月后發佈Linux缺少PHP拓展,於PECL<code>php5-json</code>或<code>php-pecl-jsonc</code>拓展安裝后即可啟用。",
-       "config-xcache": "[http://xcache.lighttpd.net/ XCache]已安裝",
-       "config-apc": "[http://www.php.net/apc APC]已安裝",
-       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache]已安裝",
-       "config-no-cache": "'''警告:'''找不到[http://www.php.net/apc APC]、[http://xcache.lighttpd.net/ XCache]或[http://www.iis.net/download/WinCacheForPhp WinCache],無法啟用對象緩存。計劃緩存未啟用。",
-       "config-mod-security": "'''警告''':您的服務器已啟動[http://modsecurity.org/ mod_security]。若其配置錯誤, 會導致MediaWiki和其他軟件的錯誤並允許用戶任意發布內容。如果您遇到任何錯誤,請查閱[http://modsecurity.org/documentation/ mod_security文檔]或聯繫您的客服。",
-       "config-diff3-bad": "找不到GNU diff3。",
-       "config-git": "發現Git版本控制軟件:<code>$1</code>。",
-       "config-git-bad": "無法找到Git版本控制軟件。",
-       "config-imagemagick": "已找到ImageMagick:<code>$1</code>。如果你啟用了上傳功能,縮略圖功能也將被啟用。",
-       "config-gd": "已找到內建的GD圖形庫。如果你啟用了上傳功能,縮略圖功能也將被啟用。",
-       "config-no-scaling": "找不到GD庫或ImageMagick。縮略圖功能將不可用。",
-       "config-no-uri": "'''錯誤:'''無法確定當前的URI。安裝已中斷。",
-       "config-no-cli-uri": "'''警告''':未指定<code>--scriptpath</code>參數,使用默認值:<code>$1</code>。",
-       "config-using-server": "使用伺服器名「<nowiki>$1</nowiki>」。",
-       "config-using-uri": "使用伺服器名「<nowiki>$1$2</nowiki>」。",
-       "config-uploads-not-safe": "'''警告:'''您的默認上傳目錄<code>$1</code>存在允許執行任意腳本的漏洞。儘管MediaWiki會對所有已上傳的文件進行安全檢查,但我們仍然強烈建議您在啟用上傳功能前[//www.mediawiki.org/wiki/Manual:Security#Upload_security 關閉該安全漏洞]。",
-       "config-no-cli-uploads-check": "'''警告''':在CLI安裝過程中,沒有對您的默認上傳目錄(<code>$1</code>)進行執行任意腳本的漏洞檢查。",
-       "config-brokenlibxml": "您的系統安裝的PHP和libxml2版本組合存在故障,並可能在MediaWiki和其他web應用程序中造成隱藏的數據損壞。請將PHP升級到5.2.9或以上,libxml2升級到2.7.3或以上([//bugs.php.net/bug.php?id=45996 PHP的故障報告])。安裝已中斷。",
-       "config-suhosin-max-value-length": "Suhosin已經安裝並將GET請求的參數長度限制在$1字節。MediaWiki的ResourceLoader部件可以在此限制下正常工作,但其性能會被降低。如果可能,請在<code>php.ini</code>中將<code>suhosin.get.max_value_length</code>設為1024或更高值,並在LocalSettings.php中將<code>$wgResourceLoaderMaxQueryLength</code>設為同一值。",
+       "config-page-existingwiki": "現有 Wiki",
+       "config-help-restart": "是否要清除所有已輸入且儲存的資料,並重新開始安裝程序嗎?",
+       "config-restart": "是的,重新開始",
+       "config-welcome": "=== 環境檢查 ===\n現在會做基本的檢查,檢查環境是否符合 MediaWiki 安裝所需。\n若您要尋求如何完成安裝的協助,請記得提供以下訊息。",
+       "config-copyright": "=== 版權聲明與授權條款 ===\n\n$1\n\n本程式為自由軟體;您可依據自由軟體基金會所發表的 GNU 通用公共授權條款規定,將本程式重新發佈與/或修改;無論您依據的是本授權條款的第二版或 (您可自行選擇) 之後的任何版本。\n\n本程式發佈的目的是希望可以提供幫助,但 <strong>不負任何擔保責任</strong>;亦無隱含對 <strong>適售性</strong> 或 <strong>特定用途的適用性</strong> 的情形擔保。詳情請參照GNU 通用公共授權。\n\n您應已隨本程式收到 <doclink href=\"Copying\">GNU 通用公共授權條款</doclink>;如果沒有,請信件通知自由軟體基金會,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA,或 [http://www.gnu.org/copyleft/gpl.html 線上閱讀]。",
+       "config-sidebar": "* [www.mediawiki.org/wiki/MediaWiki/zh-hant MediaWiki 首頁]\n* [www.mediawiki.org/wiki/Help:Contents/zh 使用者指南]\n* [//www.mediawiki.org/wiki/Manual:Contents/zh 管理者指南]\n* [//www.mediawiki.org/wiki/Manual:FAQ/zh-hant 常見問題集]\n----\n* <doclink href=Readme>讀我說明</doclink>\n* <doclink href=ReleaseNotes>發行說明</doclink>\n* <doclink href=Copying>版權聲明</doclink>\n* <doclink href=UpgradeDoc>升級</doclink>",
+       "config-env-good": "環境檢查已完成。\n您可以安裝 MediaWiki。",
+       "config-env-bad": "環境檢查已完成。\n您無法安裝 MediaWiki。",
+       "config-env-php": "PHP $1 已安裝。",
+       "config-env-php-toolow": "已安裝 PHP $1。\n但 MediaWiki 需要 PHP $2 或更新的版本。",
+       "config-unicode-using-utf8": "使用 Brion Vibber 的 utf8_normalize.so 做 Unicode 正規化。",
+       "config-unicode-using-intl": "使用 [http://pecl.php.net/intl intl PECL 擴充套件] 做 Unicode 正規化。",
+       "config-unicode-pure-php-warning": "<strong>警告:</strong> 無法使用 [http://pecl.php.net/intl intl PECL 擴充套件] 處理 Unicode 正規化,故回退使用純 PHP 實作的正規化程式,此方式處理速度較緩慢。\n\n如果您的網站瀏覽人次很高,您應先閱讀 [//www.mediawiki.org/wiki/Unicode_normalization_considerations/zh Unicode 正規化]。",
+       "config-unicode-update-warning": "<strong>警告</strong>:目前安裝的 Unicode 正規化包裝程式使用了舊版 [http://site.icu-project.org/ ICU 計劃] 的程式庫。\n若您需要使用 Unicode,您應先進行 [//www.mediawiki.org/wiki/Unicode_normalization_considerations 升級]。",
+       "config-no-db": "找不到合適的資料庫驅動程式!您需要安裝 PHP 資料庫驅動程式。\n目前支援以下類型的資料庫: $1 。\n\n如果您是自行編譯 PHP,您必須重新設定並開啟資料庫客戶端,例:使用 <code>./configure --with-mysqli</code> 指令參數。\n如果您是使用 Debian 或 Ubuntu 的套件安裝,您則需要額外安裝,例:<code>php5-mysql</code> 套件。",
+       "config-outdated-sqlite": "<strong>警告:</strong>您已安裝 SQLite $1,但是它的版本低於最低需求版本 $2。 因此您無法使用 SQLite。",
+       "config-no-fts3": "<strong>警告:</strong> SQLite 編譯時未包含 [//sqlite.org/fts3.html FTS3 模組],後台搜尋功能將無法使用。",
+       "config-register-globals": "<strong>警告:PHP 的<code>[http://php.net/register_globals register_globals]</code>選項已開啟,如果可以請關閉該選項。</strong>\nMediaWiki 仍可正常執行,但您的伺服器將會有潛藏的安全性問題。",
+       "config-magic-quotes-runtime": "<strong>嚴重:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] 選項被開啟!</strong>\n此選項會導致資料在無法預測的情況下損壞。\n您必須將開選項關閉方可繼續安裝 MediaWiki。",
+       "config-magic-quotes-sybase": "<strong>嚴重:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] 選項被開啟!</strong>\n此選項會導致資料在無法預測的情況下損壞。\n您必須將開選項關閉方可繼續安裝 MediaWiki。",
+       "config-mbstring": "<strong>嚴重:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] 選項被開啟!</strong>\n此選項會導致資料在無法預測的情況下損壞。\n您必須將開選項關閉方可繼續安裝 MediaWiki。",
+       "config-safe-mode": "<strong>警告:</strong>PHP 的 [http://www.php.net/features.safe-mode 安全模式] 選項被開啟。它可能會導致檔案上傳與數學函數 <code>math</code> 的問題。",
+       "config-xml-bad": "PHP 缺少的 XML 模組。\nMediaWiki 需要使用此模組中所提供的函數,且在目前的設定下將無法繼續作業。\n如果您使用的是 Mandrake Linux,請安裝 php-xml 套件。",
+       "config-pcre-old": "<strong>嚴重:</strong> 需要使用 PCRE $1 或更新的版本。\n您的 PHP 執行檔使用的是 PCRE $2。\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 詳細資訊]。",
+       "config-pcre-no-utf8": "<strong>嚴重:</strong> PHP 的 PCRE 模組在編譯時未包含 PCRE_UTF8 支援。\nMediaWiki 需要支援 UTF-8 才可正常運作。",
+       "config-memory-raised": "PHP 的記憶體使用上限 <code>memory_limit</code> 目前為 $1,自動提高到 $2。",
+       "config-memory-bad": "<strong>警告:</strong>PHP 的記憶體使用上限 <code>memory_limit</code> 為 $1。\n該設定值可能過低。\n這可能導致後續的安裝失敗!",
+       "config-ctype": "<strong>嚴重:</strong> PHP 編譯時必須包含 [http://www.php.net/manual/en/ctype.installation.php Ctype 擴充套件]。",
+       "config-json": "<strong>嚴重:</strong> PHP 編譯時並未包含 JSON 擴充套件。\n在 MediaWiki 繼續安裝之前您必須先安裝 PHP JSON 擴充套件或 [http://pecl.php.net/package/jsonc PECL jsonc] 擴充套件。\n* 此 PHP 擴充套件在 Red Hat Enterprice Linux (CentOS) 5 版與 6 版以有內含,須於 <code>/etc/php.ini</code> 或 <code>/etc/php.d/json.ini</code> 設定檔將該項目開啟。\n* 部分於 2013 年 5 月以後發佈的 Linux 並沒有此 PHP 擴充套件,可透過安裝 PECL 擴充套件 <code>php5-json</code> 或 <code>php-pecl-jsonc</code> 替代。",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] 已安裝",
+       "config-apc": "[http://www.php.net/apc APC] 已安裝",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] 已安裝",
+       "config-no-cache": "<strong>警告:</strong> 找不到 [http://www.php.net/apc APC]、[http://xcache.lighttpd.net/ XCache] 或 [http://www.iis.net/download/WinCacheForPhp WinCache]。\n無法開啟物件快取功能。",
+       "config-mod-security": "<strong>警告:</strong>您的網頁伺服器已開啟 [http://modsecurity.org/ mod_security] 模組,如果設定不恰當會導致使用者可在 MediaWiki 或其他應用程式發佈任意的內容。\n若您遇到任何問題,請參考 [http://modsecurity.org/documentation/ mod_security 文件] 或聯繫您的伺服器技術支援人員。",
+       "config-diff3-bad": "找不到 GNU diff3。",
+       "config-git": "找到 Git 版本控制軟體:<code>$1</code>。",
+       "config-git-bad": "查無 Git 版本控制軟體。",
+       "config-imagemagick": "找到 ImageMagick:<code>$1</code>。\n若您開啟了檔案上傳功能,將可啟用縮圖功能。",
+       "config-gd": "找到內建 GD 圖形程式庫。\n若您開啟了檔案上傳功能,將可啟用縮圖功能。",
+       "config-no-scaling": "找不到 GD 程式庫或 ImageMagick。\n無法使用縮圖功能。",
+       "config-no-uri": "<strong>錯誤:</strong>無法辨識目前的 URI 位置。\n安裝已中止。",
+       "config-no-cli-uri": "<strong>警告:</strong>:未指定 <code>--scriptpath</code> 指令參數,使用預設值:<code>$1</code>。",
+       "config-using-server": "使用伺服器名稱 \"<nowiki>$1</nowiki>\"。",
+       "config-using-uri": "使用伺服器 URL 位置 \"<nowiki>$1$2</nowiki>\"。",
+       "config-uploads-not-safe": "<strong>警告:</strong>您預設的上傳目錄 <code>$1</code> 有可被任意執行 Script 的漏洞。\n雖然 MediaWiki 會對所有上傳的檔案進行安全檢查,但我們仍強烈建議您在開啟上傳功能前了解如何 [//www.mediawiki.org/wiki/Manual:Security#Upload_security 關閉此安全漏洞]。",
+       "config-no-cli-uploads-check": "<strong>警告:</strong>透過指令介面安不會檢查您預設的上傳目錄 (<code>$1</code>) 是否有可任意執行 Script 的安全性漏洞。",
+       "config-brokenlibxml": "您的系統使用了可能造成 MediaWiki 或其他網頁應用程式資料損毀問題的 PHP 與 limbxml2 版本。\n請升級 libxml2 2.7.3 或更新的版本 ([https://bugs.php.net/bug.php?id=45996 PHP 問題報告])。\n安裝已中止。",
+       "config-suhosin-max-value-length": "Suhosin 已安裝並且限制 GET 參數的長度 <code>length</code> 為 $1 位元組。\nMediaWiki 的 ResourceLoader 元件可以在此限制下正常運作,但仍會降低執行的效能。\n如果可能的情況下,您應該設定 <code>php.ini</code> 設定檔中的項目  <code>suhosin.get.max_value_length</code> 為 1024 或者更高的數值,並且將\n<code>LocalSettings.php</code> 中的設定項目  <code>$wgResourceLoaderMaxQueryLength</code> 設為相同的數值。",
        "config-db-type": "資料庫類型:",
        "config-db-host": "資料庫主機:",
-       "config-db-host-help": "如果您的數據庫在別的服務器上,請在這裡輸入它的域名或IP地址。\n\n如果您在使用共享網站套餐,您的網站商應該已在他們的控制面板中給您數據庫信息了。\n\n如果您在Windows中安裝並且使用MySQL,“localhost”可能無效。如果確實無效,請輸入“127.0.0.1”作為IP地址。\n\n如果您在使用PostgreSQL,並且要用Unix socket來連接,請留空。",
+       "config-db-host-help": "如果您的資料庫安裝在其他伺服器上,請在此輸入該主機的名稱或 IP 位址。\n\n如果您使用共用的網頁主機,您的主機提供商應會在說明文件上告訴您正確的主機名稱。\n\n如果您安裝在 Windows 伺服器並且使用 MySQL,伺服器名稱可能無法使用使用 \"localhost\"。若確實無法使用,請改嘗試使用本機的 IP 位址 \"127.0.0.1\"。\n\n如果您使用 PostgreSQL,將此欄位空白以使用 Unix socket 來連線。",
        "config-db-host-oracle": "資料庫的 TNS:",
-       "config-db-host-oracle-help": "請輸入合法的[http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm 本地連接名],並確保tnsnames.ora文件對本安裝程序可見。<br />如果您使用的客戶端庫為10g或更新的版本,您還可以使用[http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 簡單連接名方法](easy connect naming method)。",
-       "config-db-wiki-settings": "識別這個 Wiki",
+       "config-db-host-oracle-help": "請輸入有效的 [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm 本地連線名稱],並確認安裝程式可以讀取 tnsnames.ora 檔案。<br />如果您使用的客戶端程式庫為 10g 或者更新的版本,您也可使用 [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm 簡易連線] 的命名方法進行連線。",
+       "config-db-wiki-settings": "此 Wiki 的 ID",
        "config-db-name": "資料庫名稱:",
-       "config-db-name-help": "請輸入一個可以標識您的wiki的名稱。請勿使用空格。\n\n如果您正在使用共享web主機,您的主機提供商或會給您指定一個數據庫名稱,或會讓您通過控制面板創建數據庫。",
-       "config-db-name-oracle": "資料庫架構:",
-       "config-db-account-oracle-warn": "ç\8f¾æ\9c\89ä¸\89種已æ\94¯æ\8c\81æ\96¹æ¡\88å\8f¯ä»¥å°\87Oracle設置ç\82ºå¾\8c端æ\95¸æ\93\9a庫ï¼\9a\n\nå¦\82æ\9e\9cæ\82¨å¸\8cæ\9c\9bå\9c¨å®\89è£\9dé\81\8eç¨\8b中å\89µå»ºæ\95¸æ\93\9a庫帳æ\88¶ï¼\8cè«\8bç\82ºå®\89è£\9dç¨\8båº\8fæ\8f\90ä¾\9bå\85·æ\9c\89SYSDBAè§\92è\89²ç\9a\84æ\95¸æ\93\9a庫帳æ\88¶ï¼\8c並ç\82ºweb訪å\95\8f帳æ\88¶æ\8c\87å®\9aæ\89\80é\9c\80身份è­\89æ\98\8eï¼\9bå\90¦å\89\87æ\82¨å\8f¯ä»¥æ\89\8bå\8b\95å\89µå»ºweb訪å\95\8fç\9a\84賬æ\88¶ä¸¦å\83\85é \88æ\8f\90ä¾\9b該帳æ\88¶ï¼\88確ä¿\9d帳æ\88¶å·²æ\9c\89å\89µå»ºæ\96¹æ¡\88å°\8d象ï¼\88schema objectï¼\89ç\9a\84æ\89\80é\9c\80æ¬\8aé\99\90ï¼\89ï¼\9bæ\88\96æ\8f\90ä¾\9bå\85©å\80\8bä¸\8då\90\8cç\9a\84帳æ\88¶ï¼\8cå\85¶ä¸\80å\85·æ\9c\89å\89µå»ºæ¬\8aé\99\90ï¼\8cå\8f¦ä¸\80å\89\87被é\99\90å\88¶ç\82ºweb訪å\95\8fã\80\82\n\nå\85·æ\9c\89æ\89\80é\9c\80æ¬\8aé\99\90賬æ\88¶ç\9a\84å\89µå»ºè\85³æ\9c¬å­\98æ\94¾æ\96¼æ\9c¬ç¨\8båº\8fç\9a\84â\80\9cmaintenance/oracle/â\80\9dç\9b®é\8c\84ä¸\8bã\80\82è«\8b注æ\84\8fï¼\8c使ç\94¨å\8f\97é\99\90å\88¶ç\9a\84帳æ\88¶å°\87ç¦\81ç\94¨é»\98èª\8d帳æ\88¶ç\9a\84所有維護性功能。",
-       "config-db-install-account": "用於安裝的用戶帳號",
+       "config-db-name-help": "請輸入一個可以辨識您的 Wiki 的名稱,\n請勿包含空格。\n\n如果您使用的是共用的網頁主機,您的主機提供商會給您一個指定的資料庫名稱,或者讓您透過管理介面建立資料庫。",
+       "config-db-name-oracle": "資料庫 Schema:",
+       "config-db-account-oracle-warn": "ç\9b®å\89\8dæ\9c\89ä¸\89種æ\94¯æ\8f´ Oracle å\81\9aç\82ºå¾\8c端è³\87æ\96\99庫ç\9a\84æ\96¹æ¡\88ï¼\9a\n\nå¦\82æ\9e\9cæ\82¨å¸\8cæ\9c\9bå\9c¨å®\89è£\9dç\9a\84é\81\8eç¨\8b中è\87ªå\8b\95建ç«\8bæ\96°ç\9a\84è³\87æ\96\99庫ï¼\8cè«\8bæ\8f\90ä¾\9bå\85·æ\9c\89 SYSDBA æ¬\8aé\99\90ç\9a\84帳è\99\9f並ä¸\94æ\8f\90ä¾\9bæ\9cªä¾\86è¦\81給網é \81å­\98å\8f\96使ç\94¨ç\9a\84è³\87æ\96\99庫帳è\99\9få\8f\8aå¯\86碼ã\80\82æ\88\96è\80\85æ\82¨å\8f¯ä»¥æ\89\8bå\8b\95建ç«\8b給網é \81å­\98å\8f\96使ç\94¨ç\9a\84è³\87æ\96\99庫帳è\99\9f (è«\8b確ä¿\9d該帳è\99\9fæ\9c\89建ç«\8b Schema Object ç\9a\84æ¬\8aé\99\90)ï¼\8cå\86\8dä¸\8dç\84¶æ\82¨å\8f¯ä»¥æ\8f\90ä¾\9bå\85©çµ\84ä¸\8då\90\8cç\9a\84帳è\99\9fï¼\8cä¸\80çµ\84ç\94¨ä¾\86建ç«\8bæ¬\8aé\99\90ï¼\8cè\80\8cå\8f¦ä¸\80çµ\84ç\94¨ä¾\86å\81\9aç\82ºç¶²é \81å­\98å\8f\96使ç\94¨ã\80\82\n\næ\9c¬æ¬¡å®\89è£\9d建ç«\8bç\9a\84帳è\99\9f以å\8f\8aæ¬\8aé\99\90æ\89\80é\9c\80è¦\81ç\9a\84 Scriptï¼\8cå\8f¯ä»¥å\9c¨ \"maintenance/oracle/\" ä¸­æ\89¾å\88°ã\80\82\nè«\8b注æ\84\8fï¼\8cè\8b¥æ\82¨ä½¿ç\94¨æ\9c\89é\99\90å\88¶ç\9a\84帳è\99\9få°\87æ\9c\83é \90設é\97\9cé\96\89所有維護性功能。",
+       "config-db-install-account": "安裝程序使用的使用者帳號",
        "config-db-username": "資料庫使用者名稱:",
        "config-db-password": "資料庫密碼:",
-       "config-db-password-empty": "請為新數據庫用戶$1輸入密碼。儘管您可以創建不使用密碼的用戶,但這樣做並不安全。",
-       "config-db-username-empty": "您必須鍵入用於「{{int:config-db-username}}」值",
-       "config-db-install-username": "請輸入在安裝過程中用於連接數據庫的用戶名。請勿輸入MediaWiki帳號的用戶名,請輸入您數據庫的用戶名。",
-       "config-db-install-password": "請輸入在安裝過程中用於連接數據庫的密碼。請勿輸入MediaWiki帳號的密碼,請輸入您數據庫的密碼。",
-       "config-db-install-help": "請輸入在安裝過程中用於連接數據庫的用戶名和密碼。",
-       "config-db-account-lock": "在普通操作中使用相同的用戶名和密碼",
-       "config-db-wiki-account": "用於普通操作的用戶帳號",
-       "config-db-wiki-help": "輸å\85¥å\9c¨æ\99®é\80\9aç\9a\84wikiæ\93\8dä½\9c中ï¼\88å®\89è£\9då®\8cæ\88\90å¾\8cï¼\89å°\87ç\94¨æ\96¼é\80£æ\8e¥æ\95¸æ\93\9a庫ç\9a\84ç\94¨æ\88¶å\90\8då\92\8cå¯\86碼ã\80\82å¦\82æ\9e\9c該帳è\99\9f並ä¸\8då­\98å\9c¨ï¼\8cè\80\8cå®\89è£\9d帳è\99\9få\85·æ\9c\89足夠ç\9a\84æ¬\8aé\99\90ï¼\8c該ç\94¨æ\88¶å¸³è\99\9fæ\9c\83被è\87ªå\8b\95å\89µå»ºï¼\8c並被賦äº\88足以é\81\8bè¡\8cæ­¤wikiç\9a\84æ\9c\80ä½\8eæ¬\8aé\99\90。",
-       "config-db-prefix": "數據庫表前綴:",
-       "config-db-prefix-help": "如果您需要在多個wiki之間(或在MediaWiki與其他web應用程序之間)共享一個數據庫,您可以通過添加前綴的方式來避免出現表名稱的衝突。請勿使用空格。\n\n此字段通常可留空。",
-       "config-db-charset": "數據庫字符集",
-       "config-charset-mysql5-binary": "MySQL 4.1/5.0 二進制",
-       "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
-       "config-charset-mysql4": "MySQL 4.0 UTF-8(向後兼容)",
-       "config-charset-help": "'''警告:'''如果您在MySQL 4.1+中使用'''向後兼容的UTF-8'''字符集,並在之後使用<code>mysqldump</code>備份了數據庫,則可能損壞所有的非ASCII字符,從而不可逆地破壞您的備份!\n\n在'''二進制模式'''下,MediaWiki會將UTF-8編碼的文本存於數據庫的二進制字段中。相對於MySQL的UTF-8模式,這種方法效率更高,並允許您使用全範圍的Unicode字符。\n\n在'''UTF-8模式'''下,MySQL將知道您數據使用的字符集,並能適當地提供和轉換內容。但這樣做您將無法在數據庫中存儲[//zh.wikipedia.org/wiki/基本多文種平面 基本多文種平面]以外的字符。",
-       "config-mysql-old": "需要MySQL $1或更新的版本,您的版本為$2。",
-       "config-db-port": "數據庫端口:",
-       "config-db-schema": "MediaWiki的數據庫模式",
-       "config-db-schema-help": "此數據庫模式通常是正確的,請在有明確需求時才改動之。",
-       "config-pg-test-error": "無法連接到數據庫'''$1''':$2",
+       "config-db-password-empty": "請輸入新增資料庫使用者 $1 的密碼。\n雖然您可以不設定任何密碼,但這樣做並不安全。",
+       "config-db-username-empty": "您必須輸入 \"{{int:config-db-username}}\" 欄位的內容。",
+       "config-db-install-username": "請輸入在安裝過程中用來連線資料庫的使用者名稱。\n請注意,這不是 MediaWiki 帳號的使用者名稱,這是您資料庫的使用者名稱。",
+       "config-db-install-password": "請輸入在安裝過程中用來連線資料庫的密碼。\n請注意,這不是 MediaWiki 帳號的密碼,這是您資料庫的密碼。",
+       "config-db-install-help": "請輸入在安裝過程中用來連線資料庫的使用者名稱及密碼。",
+       "config-db-account-lock": "在一般操作時使用同樣的使用者名稱及密碼。",
+       "config-db-wiki-account": "用於一般操作的使用者帳號",
+       "config-db-wiki-help": "è«\8b輸å\85¥ä¸\80è\88¬æ\93\8dä½\9cç\94¨ä¾\86é\80£ç·\9aè³\87æ\96\99庫ç\9a\84使ç\94¨è\80\85å\90\8d稱å\8f\8aå¯\86碼ã\80\82\nè\8b¥æ\82¨å®\89è£\9d使ç\94¨ç\9a\84è³\87æ\96\99庫帳è\99\9fæ\9c\89足夠ç\9a\84æ¬\8aé\99\90ï¼\8cæ\82¨å\8f¯ä»¥è¼¸å\85¥æ\96°ç\9a\84帳è\99\9fï¼\8c系統æ\9c\83è\87ªå\8b\95幫æ\82¨ä»¥æ\9c\80ä½\8eæ¬\8aé\99\90建ç«\8bä¸\80çµ\84å°\88é\96\80å\81\9aç\82º Wiki ä¸\80è\88¬æ\93\8dä½\9cç\9a\84帳è\99\9f。",
+       "config-db-prefix": "資料庫資料表名稱的字首:",
+       "config-db-prefix-help": "如果您需要讓多個 Wiki 共用同一個資料庫,或者與其他網頁應用程式共用一個資料庫,您也許會需要在所有資料表的名稱前面加上字首,可以避免資料表名稱的衝突。\n請勿使用空格。\n\n此欄位可不填。",
+       "config-db-charset": "資料庫字元集",
+       "config-charset-mysql5-binary": "MySQL 4.1/5.0 可用的二進制",
+       "config-charset-mysql5": "MySQL 4.1/5.0 可用的 UTF-8",
+       "config-charset-mysql4": "向下相容 MySQL 4.0 的 UTF-8",
+       "config-charset-help": "<strong>警告:</strong>如果您在 MySQL 4.1+ 使用了<strong>可向下相容的 UTF-8</strong>,並且透過 <code>mysqldump</code> 指令備份資料庫,可能會破壞所有非 ASCII 字元集的文字,這會導致不可還原的資料破壞!\n\n在 <strong>二進制模式</strong> 下,MediaWiki 將 UTF-8 的文字儲存在二進位型態的欄位。\n這個模式比 MySQL 的 UTF-8 模式還要更有效,並且可以讓您使用完整的 Unicode 字元集。\n在 <storng>UTF-8 模式</strong> 下,MySQL 可以知道您的資料使用何種編碼儲存,您可以正常的取得與轉換內容,但此個模式只支援到 Unicode 中的  [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes 基本多文種平面] 字元。",
+       "config-mysql-old": "需要使用 MySQL $1 或更新的版本,您的版本為 $2。",
+       "config-db-port": "資料庫埠號:",
+       "config-db-schema": "MediaWiki 的 Schema:",
+       "config-db-schema-help": "資料庫 Schema 通常不需更動。\n只在有特殊需求時才需修改。",
+       "config-pg-test-error": "無法連線到資料庫 <strong>$1</strong>:$2",
        "config-sqlite-dir": "SQLite 的資料目錄:",
-       "config-sqlite-dir-help": "SQLite會將所有的數據存儲於單一文件中。\n\n您所提供的目錄必須在安裝過程中對網頁服務器可寫。\n\n該目錄'''不應'''允許通過web訪問,因此我們不會將數據文件和PHP文件放在一起。\n\n安裝程序在創建數據文件時,亦會在相同目錄下創建<code>.htaccess</code>以控制權限。假若此等控制失效,則可能會將您的數據文件暴露於公共空間,讓他人可以獲取用戶數據(電子郵件地址、雜湊後的密碼)、被刪除的版本以及其他在wiki上被限制訪問的數據。\n\n請考慮將數據庫統一放置在某處,如<code>/var/lib/mediawiki/yourwiki</code>下。",
-       "config-oracle-def-ts": "默認表空間:",
-       "config-oracle-temp-ts": "臨時表空間:",
-       "config-type-mysql": "MySQL(或兼容程式)",
-       "config-support-info": "MediaWiki支持以下數據庫系統:\n\n$1\n\n如果您在下面列出的數據庫系統中沒有找到您希望使用的系統,請根據上方鏈向的指引啟用支持。",
-       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL]是用於MediaWiki的主要目標和最佳支援。MediaWiki也可工作於[{{int:version-db-mariadb-url}} MariaDB]和[{{int:version-db-percona-url}} Percona伺服器],當然是兼容MySQL的程式。([http://www.php.net/manual/en/mysqli.installation.php 如何編譯帶MySQL支援之PHP])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL]是一種流行的開源數據庫系統,可作為MySQL的替代([http://www.php.net/manual/en/pgsql.installation.php 如何將對PostgreSQL的支持編譯進PHP中])。本程序中可能依然存在一些小而明顯的錯誤,因此並不建議在生產環境中使用該數據庫系統。",
-       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite]是一種輕量級的數據庫系統,能被良好地支持。([http://www.php.net/manual/en/pdo.installation.php 如何將對SQLite的支持編譯進PHP中],須使用PDO)",
-       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle]是一種商用企業級的數據庫。([http://www.php.net/manual/en/oci8.installation.php 如何將對OCI8的支持編譯進PHP中])",
-       "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server]是一種用於商業企業的資料庫。([http://www.php.net/manual/en/sqlsrv.installation.php 如何編譯帶SQLSRV支援之PHP])",
-       "config-header-mysql": "MySQL 的設定",
-       "config-header-postgres": "PostgreSQL設置",
-       "config-header-sqlite": "SQLite 的設定",
-       "config-header-oracle": "甲骨文設定",
-       "config-invalid-db-type": "無效的資料庫類型",
-       "config-missing-db-name": "您必須為“數據庫名稱”輸入內容",
-       "config-missing-db-host": "您必須為“數據庫主機”輸入內容",
-       "config-missing-db-server-oracle": "您必須為“數據庫透明網絡底層(TNS)”輸入內容",
-       "config-invalid-db-server-oracle": "無效的數據庫TNS「$1」。\n請只使用「TNS Name」或「Easy Connect」 字串([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle命名法])",
-       "config-invalid-db-name": "無效的數據庫名稱“$1”。請只使用ASCII字母(a-z、A-Z)、數字(0-9)、下劃線(_)和連字號(-)。",
-       "config-invalid-db-prefix": "無效的數據庫前綴“$1”。請只使用ASCII字母(a-z、A-Z)、數字(0-9)、下劃線(_)和連字號(-)。",
-       "config-connection-error": "$1。\n\n請檢查下列的主機、用戶名和密碼設置後重試。",
-       "config-invalid-schema": "無效的MediaWiki數據庫模式“$1”。請只使用ASCII字母(a-z、A-Z)、數字(0-9)和下劃線(_)。",
-       "config-db-sys-create-oracle": "安裝程序僅支持使用SYSDBA帳戶創建新帳戶。",
-       "config-db-sys-user-exists-oracle": "用戶帳戶“$1”已經存在。SYSDBA僅可用於創建新帳戶!",
-       "config-postgres-old": "需要PostgreSQL $1或更新的版本,您的版本為$2。",
-       "config-sqlite-name-help": "請為您的wiki指定一個用於標識的名稱。請勿使用空格或連字號,該名稱將被用作SQLite的數據文件名。",
-       "config-sqlite-parent-unwritable-group": "由於父目錄<code><nowiki>$2</nowiki></code>對網頁服務器不可寫,無法創建數據目錄<code><nowiki>$1</nowiki></code>。\n\n安裝程序已確定您網頁伺服器所使用的用戶。請將<code><nowiki>$3</nowiki></code>目錄設為對該用戶可寫以繼續安裝過程。在Unix/Linux系統中,您可以逐行輸入下列命令:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
-       "config-sqlite-parent-unwritable-nogroup": "由於父目錄<code><nowiki>$2</nowiki></code>對網頁服務器不可寫,無法創建數據目錄<code><nowiki>$1</nowiki></code>。\n\n安裝程序無法確定您網頁服務器所使用的用戶。請將<code><nowiki>$3</nowiki></code>目錄設為全局可寫(對所有用戶)以繼續安裝過程。在Unix/Linux系統中,您可以逐行輸入下列命令:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
-       "config-sqlite-mkdir-error": "創建數據目錄“$1”時發生錯誤。請檢查路徑後重試。",
-       "config-sqlite-dir-unwritable": "無法寫入目錄“$1”。請修改該目錄的權限,使其對網頁服務器可寫後重試。",
-       "config-sqlite-connection-error": "$1。\n\n請檢查下列的數據目錄和數據庫名稱後重試。",
-       "config-sqlite-readonly": "文件<code>$1</code>不可寫。",
-       "config-sqlite-cant-create-db": "無法創建數據文件<code>$1</code>。",
-       "config-sqlite-fts3-downgrade": "PHP缺少FTS3支持,正在降級數據表",
-       "config-can-upgrade": "在數據庫中發現了MediaWiki的數據表。要將它們升級至MediaWiki $1,請點擊'''繼續'''。",
-       "config-upgrade-done": "升級完成。\n\n現在您可以[$1 開始使用您的wiki]了。\n\n如果您需要重新生成<code>LocalSettings.php</code>文件,請點擊下面的按鈕。除非您的wiki出現了問題,我們'''不推薦'''您執行此操作。",
-       "config-upgrade-done-no-regenerate": "升級完成。\n\n現在您可以[$1 開始使用您的wiki]了。",
-       "config-regenerate": "重新生成LocalSettings.php →",
-       "config-show-table-status": "查詢<code>SHOW TABLE STATUS</code>失敗!",
-       "config-unknown-collation": "'''警告:'''數據庫使用了無法識別的整理。",
-       "config-db-web-account": "供網頁訪問使用的數據庫帳號",
-       "config-db-web-help": "請指定在wiki執行普通操作時,網頁服務器用於連接數據庫服務器的用戶名和密碼。",
-       "config-db-web-account-same": "使用和安裝程序相同的帳號",
-       "config-db-web-create": "建立帳號,如果它不存在",
-       "config-db-web-no-create-privs": "您指定給安裝程序的帳號缺少創建帳號的權限,因此您指定的帳號必須已經存在。",
-       "config-mysql-engine": "存儲引擎:",
+       "config-sqlite-dir-help": "SQLite 會將所有的資料存儲於單一檔案中。\n\n您所提供的目錄在安裝過程中必須開啟給網頁伺服器的寫入權限。\n\n該目錄 <strong>不應</strong> 可以被透過網頁所開啟,這也是為什麼我們不將資料與 PHP 檔案放在一起。\n\n安裝程式在建立資料庫檔案時,會同時在目錄下建立 <code>.htaccess</code> 以控制網頁伺服器權限。若此設定失效,則會導致任何人可以直接存取您的原始資料檔案,而資料庫的內容包含原始的使用者資料 (電子郵件地址、加密後的密碼)、刪除後的修訂及其他在 Wiki 上被限制存取的資料。\n\n請考慮將資料庫統一放置在某處,如 <code>/var/lib/mediawiki/yourwiki</code> 底下。",
+       "config-oracle-def-ts": "預設資料表空間:",
+       "config-oracle-temp-ts": "臨時資料表空間:",
+       "config-type-mysql": "MySQL (或與其相容的程式)",
+       "config-type-mssql": "Microsoft SQL Server",
+       "config-support-info": "MediaWiki 支援以下資料庫系統:\n\n$1\n\n如果您下方沒有看到您要使用的資料庫系統,請根據上方連結指示開啟資料庫的支援。",
+       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] 是 MediaWiki 主要支援的資料庫系統。MediaWiki 也同時可運作與於 [{{int:version-db-mariadb-url}} MariaDB] 和[{{int:version-db-percona-url}} Percona 伺服器],上述這些與 MySQL 相容的資料庫系統。([http://www.php.net/manual/en/mysqli.installation.php 如何編譯支援 MySQL 的 PHP])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] 是一套受歡迎的開源資料庫系統,在開源方案當中,可用來替代 MySQL。目前仍有一些次要的問題需要解決,較不建議使用在上線環境當中。 ([http://www.php.net/manual/en/pgsql.installation.php 如何編譯支援 PostgreSQL 的 PHP])。",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] 是一套輕量級的資料庫系統,MediaWiki 可在此資料庫系統上良好的運作。([http://www.php.net/manual/en/pdo.installation.php 如何編譯支援 SQLite 的 PHP],須透過 PDO)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] 是一套商用企業級的資料庫。([http://www.php.net/manual/en/oci8.installation.php 如何編譯支援 OCI8 的 PHP])",
+       "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] 是一套 Windows 專用的商用企業級的資料庫。 ([http://www.php.net/manual/en/sqlsrv.installation.php 如何編譯支援 SQLSRV 的 PHP])",
+       "config-header-mysql": "MySQL 設定",
+       "config-header-postgres": "PostgreSQL 設定",
+       "config-header-sqlite": "SQLite 設定",
+       "config-header-oracle": "Oracle 設定",
+       "config-header-mssql": "Microsoft SQL Server 設定",
+       "config-invalid-db-type": "無效的資料庫類型。",
+       "config-missing-db-name": "您必須輸入 \"{{int:config-db-name}}\" 欄位的內容。",
+       "config-missing-db-host": "您必須輸入 \"{{int:config-db-host}}\" 欄位的內容。",
+       "config-missing-db-server-oracle": "您必須輸入 \"{{int:config-db-host-oracle}}\" 欄位的內容。",
+       "config-invalid-db-server-oracle": "無效的資料庫 TNS \"$1\"。\n請使用符合 \"TNS 名稱\" 或 \"簡易連線\" 規則的字串([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Oracle命名規則])",
+       "config-invalid-db-name": "無效的資料庫名稱 \"$1\"。\n僅允許使用 ASCII 字母(a-z、A-Z)、數字(0-9)、底線(_)與連字號(-)。",
+       "config-invalid-db-prefix": "無效的資料庫字首 \"$1\"。\n僅允許使用 ASCII 字母(a-z、A-Z)、數字(0-9)、底線(_)與連字號(-)。",
+       "config-connection-error": "$1。\n\n請檢查主機、使用者名稱和密碼設定,然後重試。",
+       "config-invalid-schema": "無效的資料庫 Schema \"$1\"。\n僅允許使用 ASCII 字母(a-z、A-Z)、數字(0-9)、底線(_)與連字號(-)。",
+       "config-db-sys-create-oracle": "安裝程式只支援使用 SYSDBA 帳號建立新帳號。",
+       "config-db-sys-user-exists-oracle": "使用者帳號 \"$1\" 已存在。 SYSDBA 只可用來建立新的帳號!",
+       "config-postgres-old": "需要使用 PostgreSQL $1 或更新的版本,您的版本為 $2。",
+       "config-mssql-old": "需要使用 Microsoft SQL Server $1 或更新的版本,您的版本為 $2。",
+       "config-sqlite-name-help": "請為您的 Wiki 設定一個用來辨識的名稱。\n請勿使用空格或連字號,\n該名稱會被用來做為 SQLite 資料檔的名稱。",
+       "config-sqlite-parent-unwritable-group": "無法建立資料目錄 <nowiki>$1</nowiki></code>,因網頁伺服器對該目錄所在的上層目錄 <code><nowiki>$2</nowiki></code> 沒有寫入權限。\n\n安裝程序所使用的身份依據您用來執行網頁伺服器的身份而定,\n請開啟網頁伺服器對 <code><nowiki>$3</nowiki></code> 的寫入權以繼續安裝,\n在 Unix/Linux 系統可以執行以下指令:\n\n<pre>cd $2\nmkdir $3\nchgrp $4 $3\nchmod g+w $3</pre>",
+       "config-sqlite-parent-unwritable-nogroup": "無法建立資料目錄 <nowiki>$1</nowiki></code>,因網頁伺服器對該目錄所在的上層目錄 <code><nowiki>$2</nowiki></code> 沒有寫入權限。\n\n安裝程序所使用的身份依據您用來執行網頁伺服器的身份而定,\n請開啟全部人對 <code><nowiki>$3</nowiki></code> 的寫入權以繼續安裝,\n在 Unix/Linux 系統可以執行以下指令:\n\n<pre>cd $2\nmkdir $3\nchmod a+w $3</pre>",
+       "config-sqlite-mkdir-error": "建立資料目錄 \"$1\" 時發生錯誤。\n請檢查路徑後再試一次。",
+       "config-sqlite-dir-unwritable": "無法寫入目錄 \"$1\"。\n請修改該目錄的權限,請開啟網頁伺服器的寫入權限後,再試一次。",
+       "config-sqlite-connection-error": "$1。\n\n請檢查下方資料目錄與資料庫名稱,再試一次。",
+       "config-sqlite-readonly": "檔案 <code>$1</code> 無寫入權限。",
+       "config-sqlite-cant-create-db": "無法建立資料庫檔案 <code>$1</code>。",
+       "config-sqlite-fts3-downgrade": "PHP 不支援 FTS3,正在降級資料表。",
+       "config-can-upgrade": "在資料庫中找到 MediaWiki 的資料表。\n要升級至 MediaWiki $1,請點選 <strong>繼續</strong>。",
+       "config-upgrade-done": "升級完成。\n\n現在您可以 [$1 開始使用您的 Wiki] 了。\n\n如果您需要重新產生 <code>LocalSettings.php</code> 檔案,請點擊下方按鈕。\n除非您的 Wiki 出現了問題,否則我們 <strong>不建議</strong> 您執行此操作。",
+       "config-upgrade-done-no-regenerate": "升級完成。\n\n現在您可以 [$1 開始使用您的 Wiki] 了。",
+       "config-regenerate": "重新產生 LocalSettings.php →",
+       "config-show-table-status": "<code>SHOW TABLE STATUS</code> 查詢失敗!",
+       "config-unknown-collation": "<strong>警告:</strong>資料庫使用了無法辨識的字元與排序規則。",
+       "config-db-web-account": "供網頁存取使用的資料庫帳號",
+       "config-db-web-help": "請設定網頁伺服器在一般操作時連線到資料庫使用的使用者名稱及密碼。",
+       "config-db-web-account-same": "使用與安裝程序相同的帳號",
+       "config-db-web-create": "如果帳號不存在則建立新帳號",
+       "config-db-web-no-create-privs": "您指定給安裝程序使用的帳號沒有足夠的權限建立新帳號。\n在此處必須指定已經存在的帳號。",
+       "config-mysql-engine": "儲存引擎:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "'''警告''':您選擇了MyISAM作為MySQL的存儲引擎,MediaWiki並不推薦您這麼做,因為:\n* 它僅能通過表鎖定來勉強支持並發\n* 與其他引擎相比,它更容易被損壞\n* MediaWiki代碼庫並不總會去處理MyISAM\n\n如果您的MySQL程序支持InnoDB,我們高度推薦您使用該引擎替代MyISAM。\n如果您的MySQL程序不支持InnoDB,請考慮升級。",
-       "config-mysql-only-myisam-dep": "'''警告''':MyISAM貌似於此伺服器為唯一可用存儲程式,MediaWiki並不推薦您這麼做,因為:\n* 它僅能通過表鎖定來勉強支持並發\n* 與其他引擎相比,它更容易被損壞\n* MediaWiki代碼庫並不總會去處理MyISAM\n\n您的MySQL安裝程式無法支援InnoDB,可能您需要升級或更換一台伺服器。",
-       "config-mysql-engine-help": "'''InnoDB'''通常是最佳選項,因為它對並發操作有着良好的支持。\n\n'''MyISAM'''在單用戶或只讀環境下可能會有更快的性能表現。但MyISAM數據庫出錯的概率一般要大於InnoDB數據庫。",
-       "config-mysql-charset": "資料庫字集:",
+       "config-mysql-myisam-dep": "<strong>警告:</strong>您選擇用來做為 MySQL 的儲存引撆 MyISAM 並不建議使用在 MediaWiki,主要原因為:\n* MyISAM 使用的資料表鎖定較無法承受多人同時連線\n* 比起其他儲存引擎相,它較容易損壞\n* MediaWiki 程式碼並沒有針對 MyISAM 做特別的處理\n\n若您安裝的 MySQL 支援 InnoDB,我們強烈建議您改用 InnoDB。\n若您安裝的 MySQL 不支援 InnoDB,則應考慮升級 MySQL。",
+       "config-mysql-only-myisam-dep": "<strong>警告:</strong>您的伺服器上的 MySQL 唯一可用的儲存引擎是 MyISAM,但並不建議使用,主要原因為:\n* MyISAM 使用的資料表鎖定較無法承受多人同時連線\n* 比起其他儲存引擎相,它較容易損壞\n* MediaWiki 程式碼並沒有針對 MyISAM 做特別的處理\n\n若您安裝的 MySQL 不支援 InnoDB,則應考慮升級 MySQL。",
+       "config-mysql-engine-help": "由於對同時連線有較好的處理能力,<strong>InnoDB</strong> 通常是最佳的選項。\n\n<strong>MyISAM</strong> 只在單人使用或者唯讀作業的情況之下才可能有較快的處理能力。\n相較於 InnoDB,MyISAM 也較容易出現資料損毀的情況。",
+       "config-mysql-charset": "資料庫字集:",
        "config-mysql-binary": "二進制",
        "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "在'''二進制模式'''下,MediaWiki會將UTF-8編碼的文本存於數據庫的二進制字段中。相對於MySQL的UTF-8模式,這種方法效率更高,並允許您使用全範圍的Unicode字符。\n\n在'''UTF-8模式'''下,MySQL將知道您數據使用的字符集,並能適當地提供和轉換內容。但這樣做您將無法在數據庫中存儲[//zh.wikipedia.org/wiki/基本多文種平面 基本多文種平面]以外的字符。",
-       "config-site-name": "Wiki的名稱:",
-       "config-site-name-help": "填入的內容會出現在瀏覽器的標題欄以及其他多處位置中。",
-       "config-site-name-blank": "輸入站點名稱。",
-       "config-project-namespace": "項目名字空間:",
-       "config-ns-generic": "項目",
-       "config-ns-site-name": "與wiki名稱相同:$1",
-       "config-ns-other": "其他(請註明)",
-       "config-ns-other-default": "我的Wiki",
-       "config-project-namespace-help": "依循維基百科形成的慣例,許多wiki將他們的方針頁面存放在與內容頁面不同的“'''項目名字空間'''”中。所有位於該名字空間下的頁面標題都會被冠以固定的前綴,您可以在此處指定這一前綴。傳統上,這一前綴應與wiki的命名保持一致,但請勿在其中使用標點符號,如“#”或“:”。",
-       "config-ns-invalid": "指定的名字空間“<nowiki>$1</nowiki>”無效,請為項目名字空間指定其他名稱。",
-       "config-ns-conflict": "指定的名字空間“<nowiki>$1</nowiki>”與默認的MediaWiki名字空間衝突。請指定一個不同的項目名字空間。",
+       "config-mysql-charset-help": "在 <strong>二進制模式</strong> 下,MediaWiki 將 UTF-8 的文字儲存在二進位型態的欄位。\n這個模式比 MySQL 的 UTF-8 模式還要更有效,並且可以讓您使用完整的 Unicode 字元集。\n\n在 <storng>UTF-8 模式</strong> 下,MySQL 可以知道您的資料使用何種編碼儲存,您可以正常的取得與轉換內容,但此個模式只支援到 Unicode 中的  [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes 基本多文種平面] 字元。",
+       "config-mssql-auth": "身份驗證類型:",
+       "config-mssql-install-auth": "請選擇安裝程序中要用來連線資料庫使用的身份驗證類型。\n若您選擇 \"{{int:config-mssql-windowsauth}}\",不論網頁伺服器是使用何種身份執行都會使用這組驗證資料。",
+       "config-mssql-web-auth": "請選擇一般操作中要用來連線資料庫使用的身份驗證類型。\n若您選擇 \"{{int:config-mssql-windowsauth}}\",不論網頁伺服器是使用何種身份執行都會使用這組驗證資料。",
+       "config-mssql-sqlauth": "SQL Server 身份驗證",
+       "config-mssql-windowsauth": "Windows 身份驗證",
+       "config-site-name": "Wiki 的名稱:",
+       "config-site-name-help": "您所填入的內容會出現在瀏覽器的標題列以及各種其他地方。",
+       "config-site-name-blank": "請輸入網站名稱。",
+       "config-project-namespace": "專案命名空間:",
+       "config-ns-generic": "專案",
+       "config-ns-site-name": "同 Wiki 名稱:$1",
+       "config-ns-other": "其他 (請註明)",
+       "config-ns-other-default": "我的 Wiki",
+       "config-project-namespace-help": "許多 Wiki 以維基百科(Wikipedia)做為範例將政策頁面從內容頁面抽離,放置在 \"'''專案命名空間'''\" 中。\n所有在此命名空間裡的頁面都會有特定的字首,您可以在此處設定。\n通常這些字首是由該 Wiki 的名稱所衍伸出來,但無法使用標點符號,如 \"#\" 或 \":\"。",
+       "config-ns-invalid": "您指定的命名空間 \"<nowiki>$1</nowiki>\" 無效,\n請指定另一個專案命名空間。",
+       "config-ns-conflict": "您指定的命名空間 \"<nowiki>$1</nowiki>\" 與 MediaWiki 預設的命名空間衝突。\n請指定另一個專案命名空間。",
        "config-admin-box": "管理員帳號",
-       "config-admin-name": "您的用戶名:",
+       "config-admin-name": "您的使用者名稱:",
        "config-admin-password": "密碼:",
        "config-admin-password-confirm": "再次輸入密碼:",
-       "config-admin-help": "在此輸入您想使用的用戶名,例如“喬幫主”。您將使用該名稱登錄本wiki。",
+       "config-admin-help": "在此輸入您想使用的使用者名稱,例如 \"Joe Bloggs\"。\n此名稱將用來登入 Wiki。",
        "config-admin-name-blank": "輸入管理員的使用者名稱。",
-       "config-admin-name-invalid": "指定的用戶名“<nowiki>$1</nowiki>”無效,請指定其他用戶名。",
+       "config-admin-name-invalid": "指定的使用者名稱 \"<nowiki>$1</nowiki>\" 無效,請改用其他使用者名稱。",
        "config-admin-password-blank": "輸入管理員帳號密碼。",
        "config-admin-password-mismatch": "兩次輸入的密碼並不相同。",
-       "config-admin-email": "電郵地址:",
-       "config-admin-email-help": "輸入電子郵件地址後,您可以收到此wiki上其他用戶發來的電子郵件,並能重置您的密碼,還可在監視列表中頁面被更改時收到郵件通知。您可以將此字段留空。",
-       "config-admin-error-user": "å\9c¨å\89µå»ºç\94¨æ\88¶å\90\8dç\82ºâ\80\9c<nowiki>$1</nowiki>â\80\9dç\9a\84管ç\90\86å\93¡å¸³è\99\9fæ\99\82ç\99¼ç\94\9f內部錯誤。",
-       "config-admin-error-password": "在為管理員“<nowiki>$1</nowiki>”設置密碼時發生內部錯誤:<pre>$2</pre>",
-       "config-admin-error-bademail": "你輸入了一個無效的電子郵件地址。",
-       "config-subscribe": "訂閱[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 發行公告郵件列表]。",
-       "config-subscribe-help": "此低流量的郵件列表僅用於發行公告,其中包括重要安全公告。請訂閱該列表以便在新的版本推出時升級您的MediaWiki。",
-       "config-subscribe-noemail": "您選擇了訂閱發行公告郵件列表,但沒有提供電子郵件地址。請提供一個電子郵件地址以訂閱郵件列表。",
-       "config-almost-done": "æ\82¨å¹¾ä¹\8eå·²ç¶\93å®\8cæ\88\90äº\86ï¼\81ç\8f¾å\9c¨æ\82¨å\8f¯ä»¥è·³é\81\8eå\89©ä¸\8bç\9a\84é\85\8dç½®æµ\81ç¨\8b並ç«\8bå\8d³å®\89è£\9dwiki。",
+       "config-admin-email": "電子郵件位址:",
+       "config-admin-email-help": "在此輸入的電子郵件信箱可用來接收 Wiki 上其他使用者所發送的訊息、重設您的密碼與通知監視列表中頁面更動。您可將此欄位留空。",
+       "config-admin-error-user": "建ç«\8b管ç\90\86å\93¡å¸³è\99\9f \"<nowiki>$1</nowiki>\" æ\99\82ç\99¼é\80\81內部錯誤。",
+       "config-admin-error-password": "設定管理員 \"<nowiki>$1</nowiki>\" 的密碼時發送內部錯誤:<pre>$2</pre>",
+       "config-admin-error-bademail": "您輸入了不正確的電子郵件地址。",
+       "config-subscribe": "訂閱 [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 發佈公告郵寄清單]。",
+       "config-subscribe-help": "這是一個用於發佈公告的低郵件量郵寄清單,內容包括重要的安全公告。\n您應該訂閱它並在 MediaWiki 發佈新版的時候更新系統。",
+       "config-subscribe-noemail": "您正嘗試不填寫電子郵件地址訂閱發佈公告郵寄清單。 \n請如果您希望訂閱郵寄清單,請提供一個有效的電子郵件地址。",
+       "config-almost-done": "æ\82¨å¿«è¦\81å®\8cæ\88\90äº\86!\næ\82¨ç\8f¾å\9c¨å\8f¯ä»¥è·³é\81\8eå\85¶é¤\98ç\9a\84設å®\9aé \85ç\9b®ä¸¦ä¸\94ç«\8bå\8d³å®\89è£\9d Wiki。",
        "config-optional-continue": "多問我一些問題吧。",
-       "config-optional-skip": "æ\88\91å·²ç¶\93ä¸\8dè\80\90ç\85©äº\86ï¼\8cè\95ç·\8aå®\89è£\9dæ\88\91ç\9a\84wiki。",
-       "config-profile": "用戶權限配置:",
-       "config-profile-wiki": "開放的wiki",
+       "config-optional-skip": "æ\88\91å·²ç¶\93ä¸\8dè\80\90ç\85©äº\86ï¼\8cè«\8bè¶\95ç·\8aå®\89è£\9d Wiki。",
+       "config-profile": "使用者權限基本資料:",
+       "config-profile-wiki": "開放式 Wiki",
        "config-profile-no-anon": "需要註冊帳號",
-       "config-profile-fishbowl": "編輯受限",
-       "config-profile-private": "非公開wiki",
-       "config-profile-help": "如果您允許盡量多的人編寫維基,網站上的內容會更加豐富。在MediaWiki中,您可以輕鬆地審查最近更改,並輕易回退掉新手或破壞者造成的損害。\n\n然而,許多人覺得讓MediaWiki存在多種角色將更加好用;同時,要說服所有人都願以維基方式作貢獻並非一件易事。因此,您有以下選擇:\n\n'''{{int:config-profile-wiki}}'''允許包括未登錄用戶在內的所有人編輯。'''{{int:config-profile-no-anon}}'''的維基需要額外的註冊流程,這有可能會阻礙隨意貢獻者。\n\n'''{{int:config-profile-fishbowl}}'''模式只允許獲批准的用戶編輯,但對公眾開放頁面瀏覽(包括歷史記錄)。'''{{int:config-profile-private}}'''則只允許獲批准的用戶瀏覽、編輯頁面。\n\n安裝完成後,您還可以對用戶權限進行更多、更複雜的配置,參見[//www.mediawiki.org/wiki/Manual:User_rights 相關的使用手冊]。",
-       "config-license": "版權和許可證:",
-       "config-license-none": "頁腳無許可證",
-       "config-license-cc-by-sa": "知識共享署名-相同方式分享",
-       "config-license-cc-by": "知識共享署名",
-       "config-license-cc-by-nc-sa": "知識共享署名-非商業性使用-相同方式共享",
-       "config-license-cc-0": "知識共享Zero(公有領域)",
-       "config-license-gfdl": "GNU自由文檔許可證1.3或更高版本",
+       "config-profile-fishbowl": "僅授權的編輯者",
+       "config-profile-private": "封閉式 Wiki",
+       "config-profile-help": "Wiki 最佳的運作方式是盡可能讓大家都可以編輯文件。\n在 MediaWiki,可以很輕易的審查最近做的所有變更動作,並且可以還原由新手或惡意使用者造成的損害。\n\n不論如何,很多人發現 MediaWiki 可以廣泛的運用在各種地方,但並不是很容易可以說服每個人都遵守對 Wiki 有益的方式。\n所以您必須做出以下選擇。\n\n使用 <strong>{{int:config-profile-wiki}}</strong> 模式,允許所有人編輯文章,包含未匿名使用者。\n使用 <strong>{{int:config-profile-no-anon}}</strong> 模式,允許所有人編輯文章,不包含未登入的使用者。此模式較能管理所有使用者的言論,但會扼殺臨時使用者的貢獻機會。\n\n使用 <strong>{{int:config-profile-fishbowl}}</strong> 模式,僅經核准的使用者可以編輯,所有人可以檢視頁面,包含修訂的記錄。\n使用 <strong>{{int:config-profile-private}}</strong> 模式,僅經核准的使用者可以編輯、檢視頁面。\n\n有關更多複雜的使用者權限設定可在安裝程序結束後設定,請參考 [//www.mediawiki.org/wiki/Manual:User_rights 相關文件說明]。",
+       "config-license": "版權聲明與授權條款:",
+       "config-license-none": "無授權條款頁腳",
+       "config-license-cc-by-sa": "創作共用 Attribution-ShareAlike",
+       "config-license-cc-by": "創作共用 Attribution",
+       "config-license-cc-by-nc-sa": "創作共用 Attribution-NonCommercial-ShareAlike",
+       "config-license-cc-0": "創作共用 Zero (公共領域)",
+       "config-license-gfdl": "GNU 自由文件授權條款 1.3 或更高版本",
        "config-license-pd": "公共領域",
-       "config-license-cc-choose": "選擇自定義的知識共享許可證",
-       "config-license-help": "許多公共wiki會以[http://freedomdefined.org/Definition 自由許可證]的方式釋放出編者的所有貢獻。這有助於構建社區的主人翁意識,並能鼓勵長期貢獻。對於非公共wiki或公司wiki,這並非必要條件。\n\n如果您希望使用來自維基百科的內容,並希望維基百科能接受複製自您的wiki的內容,請選擇'''知識共享署名-相同方式共享'''。\n\nGNU自由文檔許可證是維基百科曾經使用過的許可證,並迄今有效。然而,該許可證難以理解,並會增加重用內容的難度。",
+       "config-license-cc-choose": "請選擇一個自訂的創作共用授權條款",
+       "config-license-help": "許多開放式 Wiki 會以 [http://freedomdefined.org/Definition 自由授權條款] 的方式釋放出編者的所有貢獻,這有助於構建社群的所有權,並且能鼓勵長期貢獻。對於封閉式的 Wiki 或公司 Wiki,則是非必要的。\n\n如果您希望使用來自維基百科(Wikipedia)的內容,並希望維基百科能接受您的 Wiki 內容,請應選擇 <strong>創作共用 Attribution Share Alike</strong> 授權條款。\n\n維基百科̽(Wikipedia)先前是使用 GNU 自由文件授權條款,\n但該授權條款的內容較難理解,因此較難再利用在該條款底下的內容。",
        "config-email-settings": "E-mail 設定",
-       "config-enable-email": "啟用出站電子郵件",
-       "config-enable-email-help": "如果您希望使用電子郵件功能,請正確配置[http://www.php.net/manual/en/mail.configuration.php PHP的郵件設定]。如果您不需要任何電子郵件功能,請在此處禁用它。",
-       "config-email-user": "啟用用戶到用戶的電子郵件",
-       "config-email-user-help": "允許所有用戶互發郵件,假若他們啟用了該功能。",
-       "config-email-usertalk": "啟用使用者討論頁面通知",
-       "config-email-usertalk-help": "允許用戶收到用戶討論頁被修改的通知,假若他們啟用了該功能。",
-       "config-email-watchlist": "啟用監視列表通知",
-       "config-email-watchlist-help": "允許用戶收到與其監視列表有關的通知,假若他們啟用了該功能。",
-       "config-email-auth": "啟用電子郵件認證",
-       "config-email-auth-help": "如果啟用此選項,在用戶設置或修改電子郵件地址時,就會收到一封郵件,內含確認電子地址的鏈接。只有經過身份驗證的電子郵件地址,才能收到來自其他用戶的電子郵件,或任何修改通知的郵件。'''建議'''公開wiki啟用本選項,以防對電子郵件功能的濫用。",
-       "config-email-sender": "返回電子郵件地址:",
-       "config-email-sender-help": "輸å\85¥è¦\81ç\94¨ä¾\86ç\99¼é\80\81å\87ºç«\99é\9b»å­\90é\83µä»¶ç\9a\84å\9c°å\9d\80ï¼\8c該å\9c°å\9d\80å°\87æ\9c\83æ\94¶å\88°è¢«æ\8b\92æ\94¶ç\9a\84é\83µä»¶ã\80\82許å¤\9aé\83µä»¶æ\9c\8då\8b\99å\99¨è¦\81æ±\82å\9f\9få\90\8dé\83¨å\88\86å¿\85é \88æ\9c\89æ\95\88。",
+       "config-enable-email": "開啟外寄電子郵件",
+       "config-enable-email-help": "如果您要使用電子郵件功能,請正確設定 [http://www.php.net/manual/en/mail.configuration.php PHP 的郵件設定]。\n如果您不需要使用電子郵件功能,請在此處關閉。",
+       "config-email-user": "開啟使用者對使用者間的電子郵件互通",
+       "config-email-user-help": "若使用者在個人偏好開啟了此功能,則可允許使用者間相互發送郵件。",
+       "config-email-usertalk": "開啟使用者討論頁面通知",
+       "config-email-usertalk-help": "若使用者在個人偏好開啟了此功能,則可收到使用者討論頁面被修改的通知。",
+       "config-email-watchlist": "開啟監視列表通知",
+       "config-email-watchlist-help": "若使用者在個人偏好開啟了此功能,允許使用者收到與其監視列表有關的通知。",
+       "config-email-auth": "開啟電子郵件身份認證",
+       "config-email-auth-help": "若開啟此選項,使用者不論設定或者更改電子郵件地址,都必須透過收信的方式確認沒有問題。\n只有驗證過的電子郵件地址可以收到來自其他使用者或修改通知的信件。\n公開的 Wiki 會 <strong>建議</strong> 設定此選項,以防使用者濫用電子郵件功能。",
+       "config-email-sender": "電子郵件回覆地址:",
+       "config-email-sender-help": "è«\8b輸å\85¥è¦\81ç\94¨ä¾\86å\81\9aç\82ºå¤\96å¯\84é\83µä»¶ç\9a\84é\9b»å­\90é\83µä»¶å\9b\9eè¦\86å\9c°å\9d\80ã\80\82\n該é\83µä»¶å\9c°å\9d\80æ\9c\83æ\94¶å\88°è¢«æ\8b\92æ\94¶ç\9a\84信件ã\80\82\n許å¤\9aé\83µä»¶ä¼ºæ\9c\8då\99¨æ\9c\83è¦\81æ±\82使ç\94¨æ\9c\89æ\95\88ç\9a\84網å\9f\9få\90\8d稱。",
        "config-upload-settings": "圖片和檔案上傳",
-       "config-upload-enable": "啟用檔案上傳",
-       "config-upload-help": "æ\96\87件ä¸\8aå\82³å\8f¯è\83½æ\9c\83å°\87æ\82¨ç\9a\84æ\9c\8då\8b\99å\99¨æ\9a´é\9c²å\9c¨å®\89å\85¨é¢¨é\9aªä¸\8bã\80\82æ\9c\89é\97\9cæ\9b´å¤\9aç\9a\84ä¿¡æ\81¯ï¼\8cè«\8bå\8f\83é\96±æ\89\8bå\86\8aç\9a\84[//www.mediawiki.org/wiki/Manual:Security å®\89å\85¨é\83¨å\88\86\80\82\n\nè¦\81å\95\9fç\94¨æ\96\87件ä¸\8aå\82³ï¼\8cè«\8bå\85\88å°\87MediaWikiæ ¹ç\9b®é\8c\84ä¸\8bç\9a\84<code>images</code>å­\90ç\9b®é\8c\84æ\9b´æ\94¹ç\82ºå°\8dwebæ\9c\8då\8b\99å\99¨å\8f¯å¯«ï¼\8cç\84¶å¾\8cå\86\8då\95\9fç\94¨æ­¤選項。",
-       "config-upload-deleted": "å·²å\88ªé\99¤æ\96\87件的目錄:",
-       "config-upload-deleted-help": "指定用於存放被刪除文件的目錄。理想情況下,該目錄不應能通過web訪問。",
-       "config-logo": "標誌URL:",
-       "config-logo-help": "在MediaWiki的默認外觀中,左側欄菜單之上有一塊135x160像素的標誌區。請上傳一幅相應大小的圖像,並在此輸入URL。\n\n你可以用<code>$wgStylePath</code>或<code>$wgScriptPath</code>來表示相對於這些位置的路徑。\n\n如果您不希望使用標誌,請將本處留空。",
-       "config-instantcommons": "啟用即時共享資源",
-       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons 即時共享資源]可以讓wiki使用來自[//commons.wikimedia.org/ 維基共享資源]網站的圖像、音頻和其他媒體文件。要啟用該功能,MediaWiki必須能夠訪問互聯網。\n\n有關此功能的詳細信息,包括如何將其他wiki網站設為具有類似共享功能的方法,請參考[//mediawiki.org/wiki/Manual:$wgForeignFileRepos 手冊]。",
-       "config-cc-error": "知識共享許可證挑選器無法找到結果,請手動輸入許可證的名稱。",
-       "config-cc-again": "重新選取......",
-       "config-cc-not-chosen": "選擇您希望使用的知識共享許可證,並點擊“繼續”。",
-       "config-advanced-settings": "進階配置",
-       "config-cache-options": "對象緩存設置:",
-       "config-cache-help": "對象緩存可通過緩存頻繁使用的數據來提高MediaWiki的速度。高度推薦中到大型的網站啟用該功能,小型網站亦能從其中受益。",
-       "config-cache-none": "無緩存(不影響功能,但對較大型的wiki網站會有速度影響)",
-       "config-cache-accel": "PHP對象緩存(APC、XCache或WinCache)",
-       "config-cache-memcached": "使用Memcached(需要另外安裝並配置)",
-       "config-memcached-servers": "Memcached服務器:",
-       "config-memcached-help": "用於Memcached的IP地址列表。請保持每行一條,並指定要使用的端口。例如:\n127.0.0.1:11211\n192.168.1.25:1234",
-       "config-memcache-needservers": "您選擇了Memcached作為您的緩存,但並未指定任何服務器。",
-       "config-memcache-badip": "您為Memcached輸入了無效的IP地址:$1。",
-       "config-memcache-noport": "您沒有指定Memcached服務器的端口:$1。如果您不清楚端口是多少,默認值為11211。",
-       "config-memcache-badport": "Memcached的端口號應該在$1到$2之間。",
+       "config-upload-enable": "開啟檔案上傳",
+       "config-upload-help": "æª\94æ¡\88ä¸\8aå\82³å\8a\9fè\83½æ\9c\83è®\93æ\82¨ç\9a\84伺æ\9c\8då\99¨æ\9a´é\9c²å\9c¨æ½\9bè\97\8fç\9a\84å®\89å\85¨æ\80§é¢¨é\9aªä¹\8bä¸\8bã\80\82\nè¦\81å\8f\96å¾\97æ\9b´å¤\9aç\9b¸é\97\9cç\9a\84è³\87è¨\8aï¼\8cè«\8bå\8f\83è\80\83 [//www.mediawiki.org/wiki/Manual:Security å®\89å\85¨æ\80§ç« ç¯\80\80\82\n\nè¦\81é\96\8bå\95\9fæª\94æ¡\88ä¸\8aå\82³é\9c\80è¦\81å°\87 MediaWiki æ ¹ç\9b®é\8c\84åº\95ä¸\8bç\9a\84 <code>images</code> ç\9b®é\8c\84é\96\8bå\95\9f網é \81伺æ\9c\8då\99¨ç\9a\84寫å\85¥æ¬\8aï¼\8c\nç\84¶å¾\8cå\86\8då\95\9få\8b\95選項。",
+       "config-upload-deleted": "å·²å\88ªé\99¤æª\94æ¡\88的目錄:",
+       "config-upload-deleted-help": "請選擇用來存放已刪除檔案的目錄。\n理想情況下,此目錄不可被網頁直接存取。",
+       "config-logo": "標誌 URL 位置:",
+       "config-logo-help": "在 MediaWiki 的預設介面,側欄選單上方有一塊 135x160 像素用來放置標誌的區域。\n請上傳合適大小的圖片並在此輸入 URL 網址。\n\n您可以透過 <code>$wgStylePath</code> 或者 <code>$wgScriptPath</code> 來表示您的圖片與這些路徑的相對位置。\n\n如果您不想使用標誌,可略過此欄位。",
+       "config-instantcommons": "開啟即時共享資源",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons 即時共享資源] 是允許 Wiki 使用來自 [//commons.wikimedia.org/ Wikimedia Commons] 網站上的圖片、聲音以及其他媒體的一項功能。\n若要開啟此功能,您的 MediaWiki 必須能夠連線網際網路。\n更多有關此功能的訊息,包含如何存除了 Wikimedia Commons 之外其他網站的說明,請參考 \n[//mediawiki.org/wiki/Manual:$wgForeignFileRepos 操作手冊]。",
+       "config-cc-error": "查無該創作共用授權條款,\n請手動輸入您的授權條款名稱。",
+       "config-cc-again": "請重新選取...",
+       "config-cc-not-chosen": "請選擇您要使用的創作共享授權條款,然後點選 \"繼續\"。",
+       "config-advanced-settings": "進階設定",
+       "config-cache-options": "物件快取設定:",
+       "config-cache-help": "物件快取是用來增進 MediaWiki 速度的一項功能,透過快取經常使用的資料。\n中型到大型的網站我們會建議開啟這個選項,對小型的網站也有一定程度的效果。",
+       "config-cache-none": "不快取 (不會影響功能,但在大型 Wiki 網站可能會有處理速度的問題)",
+       "config-cache-accel": "使用 PHP 物件快取 (APC、XCache 或 WinCache)",
+       "config-cache-memcached": "使用 Memcached (需要額外安裝與設定)",
+       "config-memcached-servers": "Memcached 伺服器:",
+       "config-memcached-help": "請列出 Memcached 伺服器的 IP 位址。\n每一行只指定一個位置並且要註明使用的埠號,例如:\n 127.0.0.1:11211\n 192.168.1.25:1234",
+       "config-memcache-needservers": "您的快取類型選擇使用 Memcached,但並未設定任何的伺服器。",
+       "config-memcache-badip": "您輸入了一筆無效的 Memcached IP 位置:$1。",
+       "config-memcache-noport": "您沒有輸入 Memcached 伺服器的埠號:$1。\n如果您不曉得埠號為多少,預設為 11211。",
+       "config-memcache-badport": "Memcached 埠號應介於 $1 到 $2 之間。",
        "config-extensions": "擴充套件",
-       "config-extensions-help": "已在您的<code>./extensions</code>目錄中發現下列擴展。\n\n您可能要對它們進行額外的配置,但您現在可以啟用它們。",
-       "config-install-alreadydone": "'''警告:'''您似乎已經安裝了MediaWiki,並試圖重新安裝它。請前往下一個頁面。",
-       "config-install-begin": "點擊「{{int:config-continue}}」後,您將開始安裝MediaWiki。如果您還想對配置作一些修改,請點擊「{{int:config-back}}」。",
+       "config-extensions-help": "已在您的 <code>./extensions</code> 目錄中發現下列擴充套件。\n\n這些擴充套件可能需要做額外的設定,但您可以現在先開啟功能。",
+       "config-install-alreadydone": "<strong>警告:</strong>您已經安裝 MediaWiki,並且試圖重新安裝。\n請點繼續前往下一個頁面。",
+       "config-install-begin": "請點選 \"{{int:config-continue}}\" 開始安裝 MediaWiki。\n若您還想要修改設定,請點選 \"{{int:config-back}}\"。",
        "config-install-step-done": "完成",
        "config-install-step-failed": "失敗",
-       "config-install-extensions": "正在啟用擴展",
-       "config-install-database": "正在配置數據庫",
-       "config-install-schema": "å\89µå»ºæ\9e¶æ§\8b",
-       "config-install-pg-schema-not-exist": "PostgreSQL 架構不存在",
-       "config-install-pg-schema-failed": "創建數據表失敗。請確保用戶“$1”擁有寫入模式“$2”的權限。",
+       "config-install-extensions": "正在開啟擴充套件",
+       "config-install-database": "正在設定資料庫",
+       "config-install-schema": "建ç«\8b Schema",
+       "config-install-pg-schema-not-exist": "PostgreSQL Schema 不存在",
+       "config-install-pg-schema-failed": "資料表建立失敗。\n請確認使用者 \"$1\" 可以寫入 Schema \"$2\"。",
        "config-install-pg-commit": "提交更改",
-       "config-install-pg-plpgsql": "正在檢查PL/pgSQL語言",
-       "config-pg-no-plpgsql": "您需要為數據庫$1安裝PL/pgSQL語言",
-       "config-pg-no-create-privs": "為安裝程序指定的帳號缺少創建帳號的權限。",
-       "config-pg-not-in-role": "æ\82¨æ\8c\87å®\9aç\82ºwebç\94¨æ\88¶ç\9a\84帳æ\88¶å·²ç¶\93å­\98å\9c¨ã\80\82\næ\82¨çµ¦æ\9c¬ç¨\8båº\8fæ\8c\87å®\9aç\9a\84帳æ\88¶ä¸\8dæ\98¯è¶\85ç´\9aç\94¨æ\88¶ï¼\8cä¹\9fä¸\8dæ\98¯webç\94¨æ\88¶è§\92è\89²ç\9a\84æ\88\90å\93¡ï¼\8cæ\89\80以å®\83ä¸\8dè\83½å\89µå»ºwebç\94¨æ\88¶æ\89\80æ\93\81æ\9c\89ç\9a\84å°\8d象ã\80\82\n\nMediaWikiç\95¶å\89\8dé\9c\80è¦\81使ç\94¨ç\94±webç\94¨æ\88¶æ\89\80æ\9c\89ç\9a\84表ã\80\82è«\8bæ\8c\87å®\9aå\8f¦ä¸\80å\80\8bweb帳æ\88¶å\90\8d稱ï¼\8cæ\88\96é»\9eæ\93\8aâ\80\9cå¾\8cé\80\80â\80\9d並æ\8c\87å®\9aå\85·æ\9c\89é\81©ç\95¶æ¬\8aé\99\90ç\9a\84å®\89è£\9dç\94¨æ\88。",
-       "config-install-user": "æ­£å\9c¨å\89µå»ºæ\95¸æ\93\9a庫ç\94¨æ\88",
-       "config-install-user-alreadyexists": "用戶“$1”已存在",
-       "config-install-user-create-failed": "å\89µå»ºç\94¨æ\88¶â\80\9c$1â\80\9d失敗:$2",
-       "config-install-user-grant-failed": "授予用戶“$1”權限失敗:$2",
-       "config-install-user-missing": "指定的用戶“$1”不存在。",
-       "config-install-user-missing-create": "指定的用戶“$1”不存在。如果您想要創建一名,請點選“創建帳戶”下面的複選框。",
-       "config-install-tables": "æ­£å\9c¨å\89µå»ºæ\95¸æ\93\9a表",
-       "config-install-tables-exist": "'''警告''':MediaWiki的數據表似乎已經存在,跳過創建。",
-       "config-install-tables-failed": "'''錯誤''':創建數據表出錯,下為錯誤信息:$1",
-       "config-install-interwiki": "æ­£å\9c¨å¡«å\85\85é»\98èª\8dç\9a\84è·¨wikiæ\95¸æ\93\9a表",
-       "config-install-interwiki-list": "æ\89¾ä¸\8då\88°æ\96\87件<code>interwiki.list</code>。",
-       "config-install-interwiki-exists": "'''警告''':跨wiki數據表似乎已有內容,跳過默認列表。",
-       "config-install-stats": "初始化統計",
-       "config-install-keys": "ç\94\9fæ\88\90å¯\86鑰中",
-       "config-insecure-keys": "'''警告''':在安裝過程中生成的$2個安全密鑰($1)不一定安全。請考慮手動更改之。",
-       "config-install-sysop": "æ­£å\9c¨å\89µå»ºç®¡ç\90\86å\93¡ç\94¨æ\88帳號",
-       "config-install-subscribe-fail": "無法訂閱mediawiki-announce:$1",
-       "config-install-subscribe-notpossible": "æ²\92æ\9c\89å®\89è£\9dcURLï¼\8c<code>allow_url_fopen</code>ä¹\9fä¸\8då\8f¯ç\94¨。",
-       "config-install-mainpage": "正在創建顯示默認內容的首頁",
-       "config-install-extension-tables": "正在為已啟用擴展創建數據表",
-       "config-install-mainpage-failed": "無法插入首頁:$1",
-       "config-install-done": "'''恭喜!'''\n您已經成功地安裝了MediaWiki。\n\n安裝程序已經生成了<code>LocalSettings.php</code>文件,其中包含了您所有的配置。\n\n您需要下載該文件,並將其放在您wiki的根目錄(index.php的同級目錄)中。稍後下載將自動開始。\n\n如果瀏覽器沒有提示您下載,或者您取消了下載,您可以點擊下面的鏈接重新開始下載:\n\n$3\n\n'''注意''':如果您現在不完成本步驟,而是沒有下載便退出了安裝過程,此後您將無法獲得自動生成的配置文件。\n\n當本步驟完成後,您可以 '''[$2 進入您的wiki]'''。",
-       "config-download-localsettings": "下載<code>LocalSettings.php</code>",
+       "config-install-pg-plpgsql": "正在檢查 PL/pgSQL 語言",
+       "config-pg-no-plpgsql": "您需要安裝 PL/pgSQL 到資料庫 $1",
+       "config-pg-no-create-privs": "您所指定用來給安裝程序使用的帳號沒有足夠的權限可以建立新帳號。",
+       "config-pg-not-in-role": "æ\82¨æ\8c\87å®\9aç\94¨ä¾\86給網é \81å­\98å\8f\96ç\9a\84帳è\99\9få·²å­\98å\9c¨ã\80\82\næ\82¨æ\8c\87å®\9aç\94¨ä¾\86給å®\89è£\9dç¨\8båº\8f使ç\94¨ç\9a\84ç\9a\84帳è\99\9fæ\97¢ä¸\8dæ\98¯ç®¡ç\90\86è\80\85ï¼\8cä¹\9fä¸\8dæ\98¯çµ¦ç¶²é \81å­\98å\8f\96使ç\94¨è\80\85ï¼\8cå\9b æ­¤ç\84¡æ³\95使ç\94¨ç¶²é \81å­\98å\8f\96使ç\94¨è\80\85ç\9a\84æ¬\8aé\99\90建ç«\8bç\89©ä»¶ã\80\82\n\nMediaWiki ç\9b®å\89\8dé\9c\80è¦\81使ç\94¨ç\94±ç¶²é \81使ç\94¨è\80\85æ\89\80建ç«\8bç\9a\84è³\87æ\96\99表ã\80\82è«\8bæ\8c\87å®\9aå\8f¦ä¸\80å\80\8b網é \81使ç\94¨è\80\85ç\9a\84帳è\99\9få\90\8d稱ï¼\8cæ\88\96é»\9eé\81¸ \"è¿\94å\9b\9e\" æ\8c\87å®\9aå\85·æ\9c\89é\81©ç\95¶æ¬\8aé\99\90使ç\94¨è\80\85給å®\89è£\9dç¨\8båº\8f使ç\94¨。",
+       "config-install-user": "æ­£å\9c¨å»ºç«\8bè³\87æ\96\99庫使ç\94¨è\80\85",
+       "config-install-user-alreadyexists": "使用者 \"$1\" 已存在",
+       "config-install-user-create-failed": "建ç«\8b使ç\94¨è\80\85 \"$1\" 失敗:$2",
+       "config-install-user-grant-failed": "授序權限給使用者 \"$1\" 失敗:$2",
+       "config-install-user-missing": "指定的使用者 \"$1\" 不存在。",
+       "config-install-user-missing-create": "指定的使用者 \"$1\" 不存在。\n若您想建立帳號,請勾選下方 \"建立帳號\" 核選方塊。",
+       "config-install-tables": "æ­£å\9c¨å»ºç«\8bè³\87æ\96\99表",
+       "config-install-tables-exist": "<strong>警告:</strong> MediaWiki 資料表已存在,略過建立資料表。",
+       "config-install-tables-failed": "<strong>錯誤:</strong>建立資料表失敗,以下為錯誤訊息:$1",
+       "config-install-interwiki": "æ­£å\9c¨å\8c¯å\85¥é \90設ç\9a\84 interwiki è³\87æ\96\99表",
+       "config-install-interwiki-list": "æ\9f¥ç\84¡æª\94æ¡\88 <code>interwiki.list</code>。",
+       "config-install-interwiki-exists": "<strong>警告:</strong> interwiki 資料表內已有資料,略過建立預設資料。",
+       "config-install-stats": "初始化統計資訊",
+       "config-install-keys": "ç\94¢ç\94\9fç§\98å¯\86é\87\91鑰中",
+       "config-insecure-keys": "<strong>警告:</strong>在安裝過程中所產生的 $2 組安全金鑰($1)並不完全安全。請考慮手動更改。",
+       "config-install-sysop": "æ­£å\9c¨å»ºç«\8b管ç\90\86å\93¡ä½¿ç\94¨è\80\85帳號",
+       "config-install-subscribe-fail": "無法訂閱 mediawiki-announce:$1",
+       "config-install-subscribe-notpossible": "æ\9cªå®\89è£\9d cURLï¼\8cå\9b æ­¤ç\84¡æ³\95使ç\94¨ <code>allow_url_fopen</code> è¨­å®\9aé \85ç\9b®。",
+       "config-install-mainpage": "正在使用預設的內容建立首頁",
+       "config-install-extension-tables": "正在建立已啟動的擴充套件的資料表",
+       "config-install-mainpage-failed": "無法插入首頁$1",
+       "config-install-done": "<strong>恭喜!</strong>\n您已經成功地安裝了 MediaWiki。\n\n安裝程式已自動產生 <code>LocalSettings.php</code> 檔案,\n該檔案中包含了您所有的設定項目。\n\n您需要下載該檔案,並將其放置在您的 Wiki 的根目錄 (index.php 所在的目錄) 中,下載稍後會自動開始。\n\n若瀏覽器沒有提示您下載,或者您取消了下載,您可以點選下方連結重新下載:\n\n$3\n\n<strong>注意:</strong>若您現在未下載檔案,稍後結束安裝程式之後將無法下載設定檔。\n\n當您完成本步驟後,您可以 <strong>[$2 進入您的 Wiki]</strong>。",
+       "config-download-localsettings": "下載 <code>LocalSettings.php</code>",
        "config-help": "說明",
-       "config-nofile": "æª\94æ¡\88ã\80\8c$1ã\80\8dç\84¡æ³\95æ\89¾å°\8bã\80\82é\9b£é\81\93å®\83被刪除?",
-       "config-extension-link": "您是否了解您的wiki支援[//www.mediawiki.org/wiki/Manual:Extensions 拓展]?您可瀏覽[//www.mediawiki.org/wiki/Category:Extensions_by_category 包含所有拓展的分類]或[//www.mediawiki.org/wiki/Extension_Matrix 拓展矩陣]以顯示拓展的完整列表。",
-       "mainpagetext": "'''已成功安裝MediaWiki。'''",
-       "mainpagedocfooter": "請參閱[//meta.wikimedia.org/wiki/Help:Contents 用戶手冊]以獲得使用此wiki軟體的訊息!\n\n== 入門 ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki配置設定清單]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki常見問題解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki發佈郵件清單]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki界面本地化]"
+       "config-nofile": "æ\9f¥ç\84¡æª\94æ¡\88 \"$1\"ï¼\8cæ\98¯å\90¦å·²被刪除?",
+       "config-extension-link": "您是否了解您的 Wiki 支援 [//www.mediawiki.org/wiki/Manual:Extensions 擴充套件]?\n\n\n您可以瀏覽 [//www.mediawiki.org/wiki/Category:Extensions_by_category 擴充套件分類] 或 [//www.mediawiki.org/wiki/Extension_Matrix 擴充套件資料表] 以取得相關的資訊。",
+       "mainpagetext": "<strong>已成功安裝 MediaWiki。</strong>",
+       "mainpagedocfooter": "請參閱 [//meta.wikimedia.org/wiki/Help:Contents 使用者手冊] 以取得使用 Wiki 的相關訊息!\n\n== 新手入門 ==\n* [//www.mediawiki.org/wiki/Manual:Configuration_settings MediaWiki 系統設定]\n* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常見問答集]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵寄清單]\n* [//www.mediawiki.org/wiki/Localisation#Translation_resources MediaWiki 介面在地化]"
 }
index 3456373..4ee370e 100644 (file)
@@ -92,7 +92,8 @@ abstract class Job implements IJobSpecification {
         * @deprecated since 1.21
         */
        public static function batchInsert( $jobs ) {
-               return JobQueueGroup::singleton()->push( $jobs );
+               JobQueueGroup::singleton()->push( $jobs );
+               return true;
        }
 
        /**
@@ -107,7 +108,8 @@ abstract class Job implements IJobSpecification {
         * @deprecated since 1.21
         */
        public static function safeBatchInsert( $jobs ) {
-               return JobQueueGroup::singleton()->push( $jobs, JobQueue::QOS_ATOMIC );
+               JobQueueGroup::singleton()->push( $jobs, JobQueue::QOS_ATOMIC );
+               return true;
        }
 
        /**
@@ -281,7 +283,8 @@ abstract class Job implements IJobSpecification {
         * @deprecated since 1.21
         */
        public function insert() {
-               return JobQueueGroup::singleton()->push( $this );
+               JobQueueGroup::singleton()->push( $this );
+               return true;
        }
 
        /**
index c858e42..c00d22e 100644 (file)
@@ -323,7 +323,7 @@ abstract class JobQueue {
         */
        final public function batchPush( array $jobs, $flags = 0 ) {
                if ( !count( $jobs ) ) {
-                       return true; // nothing to do
+                       return; // nothing to do
                }
 
                foreach ( $jobs as $job ) {
@@ -344,7 +344,7 @@ abstract class JobQueue {
        /**
         * @see JobQueue::batchPush()
         * @param array $jobs
-        * @param array $flags
+        * @param int $flags
         */
        abstract protected function doBatchPush( array $jobs, $flags );
 
index 1991bb4..08873cc 100644 (file)
@@ -189,9 +189,9 @@ class JobQueueDB extends JobQueue {
        /**
         * @see JobQueue::doBatchPush()
         * @param array $jobs
-        * @param array $flags
+        * @param int $flags
         * @throws DBError|Exception
-        * @return bool
+        * @return void
         */
        protected function doBatchPush( array $jobs, $flags ) {
                $dbw = $this->getMasterDB();
@@ -203,8 +203,6 @@ class JobQueueDB extends JobQueue {
                                $that->doBatchPushInternal( $dbw, $jobs, $flags, $method );
                        }
                );
-
-               return true;
        }
 
        /**
@@ -215,11 +213,11 @@ class JobQueueDB extends JobQueue {
         * @param int $flags
         * @param string $method
         * @throws DBError
-        * @return bool
+        * @return void
         */
        public function doBatchPushInternal( IDatabase $dbw, array $jobs, $flags, $method ) {
                if ( !count( $jobs ) ) {
-                       return true;
+                       return;
                }
 
                $rowSet = array(); // (sha1 => job) map for jobs that are de-duplicated
@@ -277,7 +275,7 @@ class JobQueueDB extends JobQueue {
 
                $this->cache->set( $this->getCacheKey( 'empty' ), 'false', JobQueueDB::CACHE_TTL_LONG );
 
-               return true;
+               return;
        }
 
        /**
index 9d46a00..58d5c67 100644 (file)
@@ -221,7 +221,9 @@ class JobQueueFederated extends JobQueue {
                // Try to insert the jobs and update $partitionsTry on any failures.
                // Retry to insert any remaning jobs again, ignoring the bad partitions.
                $jobsLeft = $jobs;
+               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                for ( $i = $this->maxPartitionsTry; $i > 0 && count( $jobsLeft ); --$i ) {
+                       // @codingStandardsIgnoreEnd
                        try {
                                $partitionRing->getLiveRing();
                        } catch ( UnexpectedValueException $e ) {
@@ -233,8 +235,6 @@ class JobQueueFederated extends JobQueue {
                        throw new JobQueueError(
                                "Could not insert job(s), {$this->maxPartitionsTry} partitions tried." );
                }
-
-               return true;
        }
 
        /**
index 948baa0..16908a7 100644 (file)
@@ -106,13 +106,12 @@ class JobQueueGroup {
         *
         * @param Job|array $jobs A single Job or a list of Jobs
         * @throws MWException
-        * @return bool
-        * @todo Return value here is not useful
+        * @return void
         */
        public function push( $jobs ) {
                $jobs = is_array( $jobs ) ? $jobs : array( $jobs );
                if ( !count( $jobs ) ) {
-                       return true;
+                       return;
                }
 
                $jobsByType = array(); // (job type => list of jobs)
@@ -135,8 +134,6 @@ class JobQueueGroup {
                                $this->cache->clear( 'queues-ready' );
                        }
                }
-
-               return true;
        }
 
        /**
index f5a266e..6739a84 100644 (file)
@@ -71,12 +71,6 @@ class JobQueueRedis extends JobQueue {
        /** @var string Key to prefix the queue keys with (used for testing) */
        protected $key;
 
-       /**
-        * @var null|int maximum seconds between execution of periodic tasks.  Used to speed up
-        * testing but should otherwise be left unset.
-        */
-       protected $maximumPeriodicTaskSeconds;
-
        /**
         * @params include:
         *   - redisConfig : An array of parameters to RedisConnectionPool::__construct().
@@ -85,10 +79,6 @@ class JobQueueRedis extends JobQueue {
         *                   If a hostname is specified but no port, the standard port number
         *                   6379 will be used. Required.
         *   - compression : The type of compression to use; one of (none,gzip).
-        *   - maximumPeriodicTaskSeconds : Maximum seconds between check periodic tasks.  Set to
-        *                   force faster execution of periodic tasks for inegration tests that
-        *                   rely on checkDelay.  Without this the integration tests are very very
-        *                   slow.  This really shouldn't be set in production.
         * @param array $params
         */
        public function __construct( array $params ) {
@@ -97,8 +87,6 @@ class JobQueueRedis extends JobQueue {
                $this->server = $params['redisServer'];
                $this->compression = isset( $params['compression'] ) ? $params['compression'] : 'none';
                $this->redisPool = RedisConnectionPool::singleton( $params['redisConfig'] );
-               $this->maximumPeriodicTaskSeconds = isset( $params['maximumPeriodicTaskSeconds'] ) ?
-                       $params['maximumPeriodicTaskSeconds'] : null;
        }
 
        protected function supportedOrders() {
@@ -194,8 +182,8 @@ class JobQueueRedis extends JobQueue {
        /**
         * @see JobQueue::doBatchPush()
         * @param array $jobs
-        * @param array $flags
-        * @return bool
+        * @param int $flags
+        * @return void
         * @throws JobQueueError
         */
        protected function doBatchPush( array $jobs, $flags ) {
@@ -211,7 +199,7 @@ class JobQueueRedis extends JobQueue {
                }
 
                if ( !count( $items ) ) {
-                       return true; // nothing to do
+                       return; // nothing to do
                }
 
                $conn = $this->getConnection();
@@ -235,7 +223,7 @@ class JobQueueRedis extends JobQueue {
                        if ( $failed > 0 ) {
                                wfDebugLog( 'JobQueueRedis', "Could not insert {$failed} {$this->type} job(s)." );
 
-                               return false;
+                               throw new RedisException( "Could not insert {$failed} {$this->type} job(s)." );
                        }
                        JobQueue::incrStats( 'job-insert', $this->type, count( $items ), $this->wiki );
                        JobQueue::incrStats( 'job-insert-duplicate', $this->type,
@@ -243,8 +231,6 @@ class JobQueueRedis extends JobQueue {
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $conn, $e );
                }
-
-               return true;
        }
 
        /**
@@ -738,10 +724,7 @@ LUA;
                }
                $period = min( $periods );
                $period = max( $period, 30 ); // sanity
-               // Support override for faster testing
-               if ( $this->maximumPeriodicTaskSeconds !== null ) {
-                       $period = min( $period, $this->maximumPeriodicTaskSeconds );
-               }
+
                return array(
                        'recyclePruneAndUndelayJobs' => array(
                                'callback' => array( $this, 'recyclePruneAndUndelayJobs' ),
index 97d98a4..e45dd3a 100644 (file)
@@ -136,6 +136,11 @@ class FormatJson {
         * @return string|bool
         */
        private static function encode54( $value, $pretty, $escaping ) {
+               static $bug66021;
+               if ( $pretty !== false && $bug66021 === null ) {
+                       $bug66021 = json_encode( array(), JSON_PRETTY_PRINT ) !== '[]';
+               }
+
                // PHP escapes '/' to prevent breaking out of inline script blocks using '</script>',
                // which is hardly useful when '<' and '>' are escaped (and inadequate), and such
                // escaping negatively impacts the human readability of URLs and similar strings.
@@ -149,9 +154,10 @@ class FormatJson {
                }
 
                if ( $pretty !== false ) {
-                       // Remove whitespace inside empty arrays/objects; different JSON encoders
-                       // vary on this, and we want our output to be consistent across implementations.
-                       $json = preg_replace( self::WS_CLEANUP_REGEX, '', $json );
+                       // Workaround for <https://bugs.php.net/bug.php?id=66021>
+                       if ( $bug66021 ) {
+                               $json = preg_replace( self::WS_CLEANUP_REGEX, '', $json );
+                       }
                        if ( $pretty !== '    ' ) {
                                // Change the four-space indent to a tab indent
                                $json = str_replace( "\n    ", "\n\t", $json );
index 0063a9b..4f0651d 100644 (file)
@@ -93,6 +93,7 @@ class CSSJanus {
                        return;
                }
 
+               // @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong
                $patterns =& self::$patterns;
                $patterns['escape'] = "(?:{$patterns['unicode']}|\\[^\r\n\f0-9a-f])";
                $patterns['nmstart'] = "(?:[_a-z]|{$patterns['nonAscii']}|{$patterns['escape']})";
@@ -127,6 +128,7 @@ class CSSJanus {
                // callback's job more straightforward
                $patterns['bg_horizontal_percentage'] = "/(background(?:-position)?\s*:\s*[^%]*?)(-?{$patterns['num']})(%\s*(?:{$patterns['quantity']}|{$patterns['ident']}))/";
                $patterns['bg_horizontal_percentage_x'] = "/(background-position-x\s*:\s*)(-?{$patterns['num']})(%)/";
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -145,15 +147,15 @@ class CSSJanus {
                self::buildPatterns();
 
                // Tokenize single line rules with /* @noflip */
-               $noFlipSingle = new CSSJanus_Tokenizer( self::$patterns['noflip_single'], '`NOFLIP_SINGLE`' );
+               $noFlipSingle = new CSSJanusTokenizer( self::$patterns['noflip_single'], '`NOFLIP_SINGLE`' );
                $css = $noFlipSingle->tokenize( $css );
 
                // Tokenize class rules with /* @noflip */
-               $noFlipClass = new CSSJanus_Tokenizer( self::$patterns['noflip_class'], '`NOFLIP_CLASS`' );
+               $noFlipClass = new CSSJanusTokenizer( self::$patterns['noflip_class'], '`NOFLIP_CLASS`' );
                $css = $noFlipClass->tokenize( $css );
 
                // Tokenize comments
-               $comments = new CSSJanus_Tokenizer( self::$patterns['comment'], '`C`' );
+               $comments = new CSSJanusTokenizer( self::$patterns['comment'], '`C`' );
                $css = $comments->tokenize( $css );
 
                // LTR->RTL fixes start here
@@ -308,17 +310,28 @@ class CSSJanus {
                        }
                };
 
-               $css = preg_replace_callback( self::$patterns['box_shadow'], function ( $matches ) use ( $flipSign ) {
-                       return $matches[1] . $flipSign( $matches[2] );
-               }, $css );
-
-               $css = preg_replace_callback( self::$patterns['text_shadow1'], function ( $matches ) use ( $flipSign ) {
-                       return $matches[1] . $matches[2] . $matches[3] . $flipSign( $matches[4] );
-               }, $css );
-
-               $css = preg_replace_callback( self::$patterns['text_shadow2'], function ( $matches ) use ( $flipSign ) {
-                       return $matches[1] . $flipSign( $matches[2] );
-               }, $css );
+               $css = preg_replace_callback(
+                       self::$patterns['box_shadow'], function ( $matches ) use ( $flipSign ) {
+                               return $matches[1] . $flipSign( $matches[2] );
+                       },
+                       $css
+               );
+
+               $css = preg_replace_callback(
+                       self::$patterns['text_shadow1'],
+                       function ( $matches ) use ( $flipSign ) {
+                               return $matches[1] . $matches[2] . $matches[3] . $flipSign( $matches[4] );
+                       },
+                       $css
+               );
+
+               $css = preg_replace_callback(
+                       self::$patterns['text_shadow2'],
+                       function ( $matches ) use ( $flipSign ) {
+                               return $matches[1] . $flipSign( $matches[2] );
+                       },
+                       $css
+               );
 
                return $css;
        }
@@ -359,7 +372,7 @@ class CSSJanus {
  * to protect from being janused.
  * @author Roan Kattouw
  */
-class CSSJanus_Tokenizer {
+class CSSJanusTokenizer {
        private $regex, $token;
        private $originals;
 
index e3a3e2c..10277e6 100644 (file)
@@ -112,7 +112,9 @@ class CSSMin {
         *     instead. If $sizeLimit is false, no limit is enforced.
         * @return string|bool: Image contents encoded as a data URI or false.
         */
-       public static function encodeImageAsDataURI( $file, $type = null, $sizeLimit = self::EMBED_SIZE_LIMIT ) {
+       public static function encodeImageAsDataURI( $file, $type = null,
+               $sizeLimit = self::EMBED_SIZE_LIMIT
+       ) {
                if ( $sizeLimit !== false && filesize( $file ) >= $sizeLimit ) {
                        return false;
                }
@@ -175,13 +177,14 @@ class CSSMin {
        }
 
        /**
-        * Remaps CSS URL paths and automatically embeds data URIs for CSS rules or url() values
-        * preceded by an / * @embed * / comment.
+        * Remaps CSS URL paths and automatically embeds data URIs for CSS rules
+        * or url() values preceded by an / * @embed * / comment.
         *
         * @param string $source CSS data to remap
         * @param string $local File path where the source was read from
         * @param string $remote URL path to the file
-        * @param bool $embedData If false, never do any data URI embedding, even if / * @embed * / is found
+        * @param bool $embedData If false, never do any data URI embedding,
+        *   even if / * @embed * / is found.
         * @return string Remapped CSS data
         */
        public static function remap( $source, $local, $remote, $embedData = true ) {
@@ -200,44 +203,65 @@ class CSSMin {
                        $remote = substr( $remote, 0, -1 );
                }
 
-               // Note: This will not correctly handle cases where ';', '{' or '}' appears in the rule itself,
-               // e.g. in a quoted string. You are advised not to use such characters in file names.
-               // We also match start/end of the string to be consistent in edge-cases ('@import url(…)').
+               // Note: This will not correctly handle cases where ';', '{' or '}'
+               // appears in the rule itself, e.g. in a quoted string. You are advised
+               // not to use such characters in file names. We also match start/end of
+               // the string to be consistent in edge-cases ('@import url(…)').
                $pattern = '/(?:^|[;{])\K[^;{}]*' . CSSMin::URL_REGEX . '[^;}]*(?=[;}]|$)/';
-               return preg_replace_callback( $pattern, function ( $matchOuter ) use ( $local, $remote, $embedData ) {
-                       $rule = $matchOuter[0];
 
-                       // Check for global @embed comment and remove it
-                       $embedAll = false;
-                       $rule = preg_replace( '/^(\s*)' . CSSMin::EMBED_REGEX . '\s*/', '$1', $rule, 1, $embedAll );
+               return preg_replace_callback(
+                       $pattern,
+                       function ( $matchOuter ) use ( $local, $remote, $embedData ) {
+                               $rule = $matchOuter[0];
 
-                       // Build two versions of current rule: with remapped URLs and with embedded data: URIs (where possible)
-                       $pattern = '/(?P<embed>' . CSSMin::EMBED_REGEX . '\s*|)' . CSSMin::URL_REGEX . '/';
+                               // Check for global @embed comment and remove it
+                               $embedAll = false;
+                               $rule = preg_replace( '/^(\s*)' . CSSMin::EMBED_REGEX . '\s*/', '$1', $rule, 1, $embedAll );
 
-                       $ruleWithRemapped = preg_replace_callback( $pattern, function ( $match ) use ( $local, $remote ) {
-                               $remapped = CSSMin::remapOne( $match['file'], $match['query'], $local, $remote, false );
-                               return CSSMin::buildUrlValue( $remapped );
-                       }, $rule );
+                               // Build two versions of current rule: with remapped URLs
+                               // and with embedded data: URIs (where possible).
+                               $pattern = '/(?P<embed>' . CSSMin::EMBED_REGEX . '\s*|)' . CSSMin::URL_REGEX . '/';
 
-                       if ( $embedData ) {
-                               $ruleWithEmbedded = preg_replace_callback( $pattern, function ( $match ) use ( $embedAll, $local, $remote ) {
-                                       $embed = $embedAll || $match['embed'];
-                                       $embedded = CSSMin::remapOne( $match['file'], $match['query'], $local, $remote, $embed );
-                                       return CSSMin::buildUrlValue( $embedded );
-                               }, $rule );
-                       }
+                               $ruleWithRemapped = preg_replace_callback(
+                                       $pattern,
+                                       function ( $match ) use ( $local, $remote ) {
+                                               $remapped = CSSMin::remapOne( $match['file'], $match['query'], $local, $remote, false );
 
-                       if ( $embedData && $ruleWithEmbedded !== $ruleWithRemapped ) {
-                               // Build 2 CSS properties; one which uses a base64 encoded data URI in place
-                               // of the @embed comment to try and retain line-number integrity, and the
-                               // other with a remapped an versioned URL and an Internet Explorer hack
-                               // making it ignored in all browsers that support data URIs
-                               return "$ruleWithEmbedded;$ruleWithRemapped!ie";
-                       } else {
-                               // No reason to repeat twice
-                               return $ruleWithRemapped;
-                       }
-               }, $source );
+                                               return CSSMin::buildUrlValue( $remapped );
+                                       },
+                                       $rule
+                               );
+
+                               if ( $embedData ) {
+                                       $ruleWithEmbedded = preg_replace_callback(
+                                               $pattern,
+                                               function ( $match ) use ( $embedAll, $local, $remote ) {
+                                                       $embed = $embedAll || $match['embed'];
+                                                       $embedded = CSSMin::remapOne(
+                                                               $match['file'],
+                                                               $match['query'],
+                                                               $local,
+                                                               $remote,
+                                                               $embed
+                                                       );
+
+                                                       return CSSMin::buildUrlValue( $embedded );
+                                               },
+                                               $rule
+                                       );
+                               }
+
+                               if ( $embedData && $ruleWithEmbedded !== $ruleWithRemapped ) {
+                                       // Build 2 CSS properties; one which uses a base64 encoded data URI in place
+                                       // of the @embed comment to try and retain line-number integrity, and the
+                                       // other with a remapped an versioned URL and an Internet Explorer hack
+                                       // making it ignored in all browsers that support data URIs
+                                       return "$ruleWithEmbedded;$ruleWithRemapped!ie";
+                               } else {
+                                       // No reason to repeat twice
+                                       return $ruleWithRemapped;
+                               }
+                       }, $source );
        }
 
        /**
index d77d8ad..db8a7ec 100644 (file)
@@ -33,7 +33,6 @@
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 abstract class GenericArrayObject extends ArrayObject {
-
        /**
         * Returns the name of an interface/class that the element should implement/extend.
         *
@@ -144,7 +143,8 @@ abstract class GenericArrayObject extends ArrayObject {
        protected function setElement( $index, $value ) {
                if ( !$this->hasValidType( $value ) ) {
                        throw new InvalidArgumentException(
-                               'Can only add ' . $this->getObjectType() . ' implementing objects to ' . get_called_class() . '.'
+                               'Can only add ' . $this->getObjectType() . ' implementing objects to '
+                               . get_called_class() . '.'
                        );
                }
 
@@ -237,5 +237,4 @@ abstract class GenericArrayObject extends ArrayObject {
        public function isEmpty() {
                return $this->count() === 0;
        }
-
 }
index 7f461a0..a80f6d9 100644 (file)
@@ -712,8 +712,9 @@ class IEContentAnalyzer {
                $xbmMagic2 = '_width';
                $xbmMagic3 = '_bits';
                $binhexMagic = 'converted with BinHex';
+               $chunkLength = strlen( $chunk );
 
-               for ( $offset = 0; $offset < strlen( $chunk ); $offset++ ) {
+               for ( $offset = 0; $offset < $chunkLength; $offset++ ) {
                        $curChar = $chunk[$offset];
                        if ( $curChar == "\x0a" ) {
                                $counters['lf']++;
index c61e8f8..cd9aad8 100644 (file)
@@ -33,7 +33,6 @@
  * @file
  */
 class MWMessagePack {
-
        /** @var boolean|null Whether current system is bigendian. **/
        public static $bigendian = null;
 
@@ -75,7 +74,8 @@ class MWMessagePack {
                        } elseif ( $length <= 0xFFFFFFFF ) {
                                return pack( 'CNa*', 0xDB, $length, $value );
                        }
-                       throw new InvalidArgumentException( __METHOD__ . ": string too long (length: $length; max: 4294967295)" );
+                       throw new InvalidArgumentException( __METHOD__
+                               . ": string too long (length: $length; max: 4294967295)" );
 
                case 'integer':
                        if ( $value >= 0 ) {
@@ -142,7 +142,8 @@ class MWMessagePack {
                        $buffer = '';
                        $length = count( $value );
                        if ( $length > 0xFFFFFFFF ) {
-                               throw new InvalidArgumentException( __METHOD__ . ": array too long (length: $length, max: 4294967295)" );
+                               throw new InvalidArgumentException( __METHOD__
+                                       . ": array too long (length: $length, max: 4294967295)" );
                        }
 
                        $index = 0;
index 340e7f4..671e812 100644 (file)
@@ -86,7 +86,7 @@ class MultiHttpClient {
         *   - err     : Any cURL error string
         * The map also stores integer-indexed copies of these values. This lets callers do:
         *      <code>
-        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $req;
+        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $http->run( $req );
         *  </code>
         * @param array $req HTTP request array
         * @param array $opts
@@ -110,7 +110,7 @@ class MultiHttpClient {
         *   - err     : Any cURL error string
         * The map also stores integer-indexed copies of these values. This lets callers do:
         *      <code>
-        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $req;
+        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $req['response'];
         *  </code>
         * All headers in the 'headers' field are normalized to use lower case names.
         * This is true for the request headers and the response headers. Integer-indexed
diff --git a/includes/libs/virtualrest/SwiftVirtualRESTService.php b/includes/libs/virtualrest/SwiftVirtualRESTService.php
new file mode 100644 (file)
index 0000000..011dabe
--- /dev/null
@@ -0,0 +1,175 @@
+<?php
+/**
+ * Virtual HTTP service client for Swift
+ *
+ * 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
+ */
+
+/**
+ * Example virtual rest service for OpenStack Swift
+ * @TODO: caching support (APC/memcached)
+ * @since 1.23
+ */
+class SwiftVirtualRESTService extends VirtualRESTService {
+       /** @var array */
+       protected $authCreds;
+       /** @var int UNIX timestamp */
+       protected $authSessionTimestamp = 0;
+       /** @var int UNIX timestamp */
+       protected $authErrorTimestamp = null;
+       /** @var int */
+       protected $authCachedStatus = null;
+       /** @var string */
+       protected $authCachedReason = null;
+
+       /**
+        * @param array $params Key/value map
+        *   - swiftAuthUrl       : Swift authentication server URL
+        *   - swiftUser          : Swift user used by MediaWiki (account:username)
+        *   - swiftKey           : Swift authentication key for the above user
+        *   - swiftAuthTTL       : Swift authentication TTL (seconds)
+        */
+       public function __construct( array $params ) {
+               parent::__construct( $params );
+       }
+
+       /**
+        * @return int|bool HTTP status on cached failure
+        */
+       protected function needsAuthRequest() {
+               if ( !$this->authCreds ) {
+                       return true;
+               }
+               if ( $this->authErrorTimestamp !== null ) {
+                       if ( ( time() - $this->authErrorTimestamp ) < 60 ) {
+                               return $this->authCachedStatus; // failed last attempt; don't bother
+                       } else { // actually retry this time
+                               $this->authErrorTimestamp = null;
+                       }
+               }
+               // Session keys expire after a while, so we renew them periodically
+               return ( ( time() - $this->authSessionTimestamp ) > $this->params['swiftAuthTTL'] );
+       }
+
+       protected function applyAuthResponse( array $req ) {
+               $this->authSessionTimestamp = 0;
+               list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $req['response'];
+               if ( $rcode >= 200 && $rcode <= 299 ) { // OK
+                       $this->authCreds = array(
+                               'auth_token'  => $rhdrs['x-auth-token'],
+                               'storage_url' => $rhdrs['x-storage-url']
+                       );
+                       $this->authSessionTimestamp = time();
+                       return true;
+               } elseif ( $rcode === 403 ) {
+                       $this->authCachedStatus = 401;
+                       $this->authCachedReason = 'Authorization Required';
+                       $this->authErrorTimestamp = time();
+                       return false;
+               } else {
+                       $this->authCachedStatus = $rcode;
+                       $this->authCachedReason = $rdesc;
+                       $this->authErrorTimestamp = time();
+                       return null;
+               }
+       }
+
+       public function onRequests( array $reqs, Closure $idGeneratorFunc ) {
+               $result = array();
+               $firstReq = reset( $reqs );
+               if ( $firstReq && count( $reqs ) == 1 && isset( $firstReq['isAuth'] ) ) {
+                       // This was an authentication request for work requests...
+                       $result = $reqs; // no change
+               } else {
+                       // These are actual work requests...
+                       $needsAuth = $this->needsAuthRequest();
+                       if ( $needsAuth === true ) {
+                               // These are work requests and we don't have any token to use.
+                               // Replace the work requests with an authentication request.
+                               $result = array(
+                                       $idGeneratorFunc() => array(
+                                               'method'  => 'GET',
+                                               'url'     => $this->params['swiftAuthUrl'] . "/v1.0",
+                                               'headers' => array(
+                                                       'x-auth-user' => $this->params['swiftUser'],
+                                                       'x-auth-key'  => $this->params['swiftKey'] ),
+                                               'isAuth'  => true,
+                                               'chain'   => $reqs
+                                       )
+                               );
+                       } elseif ( $needsAuth !== false ) {
+                               // These are work requests and authentication has previously failed.
+                               // It is most efficient to just give failed pseudo responses back for
+                               // the original work requests.
+                               foreach ( $reqs as $key => $req ) {
+                                       $req['response'] = array(
+                                               'code'     => $this->authCachedStatus,
+                                               'reason'   => $this->authCachedReason,
+                                               'headers'  => array(),
+                                               'body'     => '',
+                                               'error'    => ''
+                                       );
+                                       $result[$key] = $req;
+                               }
+                       } else {
+                               // These are work requests and we have a token already.
+                               // Go through and mangle each request to include a token.
+                               foreach ( $reqs as $key => $req ) {
+                                       // The default encoding treats the URL as a REST style path that uses
+                                       // forward slash as a hierarchical delimiter (and never otherwise).
+                                       // Subclasses can override this, and should be documented in any case.
+                                       $parts = array_map( 'rawurlencode', explode( '/', $req['url'] ) );
+                                       $req['url'] = $this->authCreds['storage_url'] . '/' . implode( '/', $parts );
+                                       $req['headers']['x-auth-token'] = $this->authCreds['auth_token'];
+                                       $result[$key] = $req;
+                                       // @TODO: add ETag/Content-Length and such as needed
+                               }
+                       }
+               }
+               return $result;
+       }
+
+       public function onResponses( array $reqs, Closure $idGeneratorFunc ) {
+               $firstReq = reset( $reqs );
+               if ( $firstReq && count( $reqs ) == 1 && isset( $firstReq['isAuth'] ) ) {
+                       $result = array();
+                       // This was an authentication request for work requests...
+                       if ( $this->applyAuthResponse( $firstReq ) ) {
+                               // If it succeeded, we can subsitute the work requests back.
+                               // Call this recursively in order to munge and add headers.
+                               $result = $this->onRequests( $firstReq['chain'], $idGeneratorFunc );
+                       } else {
+                               // If it failed, it is most efficient to just give failing
+                               // pseudo-responses back for the actual work requests.
+                               foreach ( $firstReq['chain'] as $key => $req ) {
+                                       $req['response'] = array(
+                                               'code'     => $this->authCachedStatus,
+                                               'reason'   => $this->authCachedReason,
+                                               'headers'  => array(),
+                                               'body'     => '',
+                                               'error'    => ''
+                                       );
+                                       $result[$key] = $req;
+                               }
+                       }
+               } else {
+                       $result = $reqs; // no change
+               }
+               return $result;
+       }
+}
diff --git a/includes/libs/virtualrest/VirtualRESTService.php b/includes/libs/virtualrest/VirtualRESTService.php
new file mode 100644 (file)
index 0000000..05c2afc
--- /dev/null
@@ -0,0 +1,107 @@
+<?php
+/**
+ * Virtual HTTP service client
+ *
+ * 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
+ */
+
+/**
+ * Virtual HTTP service instance that can be mounted on to a VirtualRESTService
+ *
+ * Sub-classes manage the logic of either:
+ *   - a) Munging virtual HTTP request arrays to have qualified URLs and auth headers
+ *   - b) Emulating the execution of virtual HTTP requests (e.g. brokering)
+ *
+ * Authentication information can be cached in instances of the class for performance.
+ * Such information should also be cached locally on the server and auth requests should
+ * have reasonable timeouts.
+ *
+ * @since 1.23
+ */
+abstract class VirtualRESTService {
+       /** @var array Key/value map */
+       protected $params = array();
+
+       /**
+        * @param array $params Key/value map
+        */
+       public function __construct( array $params ) {
+               $this->params = $params;
+       }
+
+       /**
+        * Prepare virtual HTTP(S) requests (for this service) for execution
+        *
+        * This method should mangle any of the $reqs entry fields as needed:
+        *   - url      : munge the URL to have an absolute URL with a protocol
+        *                and encode path components as needed by the backend [required]
+        *   - query    : include any authentication signatures/parameters [as needed]
+        *   - headers  : include any authentication tokens/headers [as needed]
+        *
+        * The incoming URL parameter will be relative to the service mount point.
+        *
+        * This method can also remove some of the requests as well as add new ones
+        * (using $idGenerator to set each of the entries' array keys). For any existing
+        * or added request, the 'response' array can be filled in, which will prevent the
+        * client from executing it. If an original request is removed, at some point it
+        * must be added back (with the same key) in onRequests() or onResponses();
+        * it's reponse may be filled in as with other requests.
+        *
+        * @param array $reqs Map of Virtual HTTP request arrays
+        * @param Closure $idGeneratorFunc Method to generate unique keys for new requests
+        * @return array Modified HTTP request array map
+        */
+       public function onRequests( array $reqs, Closure $idGeneratorFunc ) {
+               $result = array();
+               foreach ( $reqs as $key => $req ) {
+                       // The default encoding treats the URL as a REST style path that uses
+                       // forward slash as a hierarchical delimiter (and never otherwise).
+                       // Subclasses can override this, and should be documented in any case.
+                       $parts = array_map( 'rawurlencode', explode( '/', $req['url'] ) );
+                       $req['url'] = $this->params['baseUrl'] . '/' . implode( '/', $parts );
+                       $result[$key] = $req;
+               }
+               return $result;
+       }
+
+       /**
+        * Mangle or replace virtual HTTP(S) requests which have been responded to
+        *
+        * This method may mangle any of the $reqs entry 'response' fields as needed:
+        *   - code    : perform any code normalization [as needed]
+        *   - reason  : perform any reason normalization [as needed]
+        *   - headers : perform any header normalization [as needed]
+        *
+        * This method can also remove some of the requests as well as add new ones
+        * (using $idGenerator to set each of the entries' array keys). For any existing
+        * or added request, the 'response' array can be filled in, which will prevent the
+        * client from executing it. If an original request is removed, at some point it
+        * must be added back (with the same key) in onRequests() or onResponses();
+        * it's reponse may be filled in as with other requests. All requests added to $reqs
+        * will be passed through onRequests() to handle any munging required as normal.
+        *
+        * The incoming URL parameter will be relative to the service mount point.
+        *
+        * @param array $reqs Map of Virtual HTTP request arrays with 'response' set
+        * @param Closure $idGeneratorFunc Method to generate unique keys for new requests
+        * @return array Modified HTTP request array map
+        */
+       public function onResponses( array $reqs, Closure $idGeneratorFunc ) {
+               return $reqs;
+       }
+}
diff --git a/includes/libs/virtualrest/VirtualRESTServiceClient.php b/includes/libs/virtualrest/VirtualRESTServiceClient.php
new file mode 100644 (file)
index 0000000..2d21d3c
--- /dev/null
@@ -0,0 +1,289 @@
+<?php
+/**
+ * Virtual HTTP service client
+ *
+ * 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
+ */
+
+/**
+ * Virtual HTTP service client loosely styled after a Virtual File System
+ *
+ * Services can be mounted on path prefixes so that virtual HTTP operations
+ * against sub-paths will map to those services. Operations can actually be
+ * done using HTTP messages over the wire or may simple be emulated locally.
+ *
+ * Virtual HTTP request maps are arrays that use the following format:
+ *   - method   : GET/HEAD/PUT/POST/DELETE
+ *   - url      : HTTP/HTTPS URL or virtual service path with a registered prefix
+ *   - query    : <query parameter field/value associative array> (uses RFC 3986)
+ *   - headers  : <header name/value associative array>
+ *   - body     : source to get the HTTP request body from;
+ *                this can simply be a string (always), a resource for
+ *                PUT requests, and a field/value array for POST request;
+ *                array bodies are encoded as multipart/form-data and strings
+ *                use application/x-www-form-urlencoded (headers sent automatically)
+ *   - stream   : resource to stream the HTTP response body to
+ * Request maps can use integer index 0 instead of 'method' and 1 instead of 'url'.
+ *
+ * @author Aaron Schulz
+ * @since 1.23
+ */
+class VirtualRESTServiceClient {
+       /** @var MultiHttpClient */
+       protected $http;
+       /** @var Array Map of (prefix => VirtualRESTService) */
+       protected $instances = array();
+
+       const VALID_MOUNT_REGEX = '#^/[0-9a-z]+/([0-9a-z]+/)*$#';
+
+       /**
+        * @param MultiHttpClient $http
+        */
+       public function __construct( MultiHttpClient $http ) {
+               $this->http = $http;
+       }
+
+       /**
+        * Map a prefix to service handler
+        *
+        * @param string $prefix Virtual path
+        * @param VirtualRESTService $instance
+        */
+       public function mount( $prefix, VirtualRESTService $instance ) {
+               if ( !preg_match( self::VALID_MOUNT_REGEX, $prefix ) ) {
+                       throw new UnexpectedValueException( "Invalid service mount point '$prefix'." );
+               } elseif ( isset( $this->instances[$prefix] ) ) {
+                       throw new UnexpectedValueException( "A service is already mounted on '$prefix'." );
+               }
+               $this->instances[$prefix] = $instance;
+       }
+
+       /**
+        * Unmap a prefix to service handler
+        *
+        * @param string $prefix Virtual path
+        */
+       public function unmount( $prefix ) {
+               if ( !preg_match( self::VALID_MOUNT_REGEX, $prefix ) ) {
+                       throw new UnexpectedValueException( "Invalid service mount point '$prefix'." );
+               } elseif ( !isset( $this->instances[$prefix] ) ) {
+                       throw new UnexpectedValueException( "No service is mounted on '$prefix'." );
+               }
+               unset( $this->instances[$prefix] );
+       }
+
+       /**
+        * Get the prefix and service that a virtual path is serviced by
+        *
+        * @param string $path
+        * @return array (prefix,VirtualRESTService) or (null,null) if none found
+        */
+       public function getMountAndService( $path ) {
+               $cmpFunc = function( $a, $b ) {
+                       $al = substr_count( $a, '/' );
+                       $bl = substr_count( $b, '/' );
+                       if ( $al === $bl ) {
+                               return 0; // should not actually happen
+                       }
+                       return ( $al < $bl ) ? 1 : -1; // largest prefix first
+               };
+
+               $matches = array(); // matching prefixes (mount points)
+               foreach ( $this->instances as $prefix => $service ) {
+                       if ( strpos( $path, $prefix ) === 0 ) {
+                               $matches[] = $prefix;
+                       }
+               }
+               usort( $matches, $cmpFunc );
+
+               // Return the most specific prefix and corresponding service
+               return isset( $matches[0] )
+                       ? array( $matches[0], $this->instances[$matches[0]] )
+                       : array( null, null );
+       }
+
+       /**
+        * Execute a virtual HTTP(S) request
+        *
+        * This method returns a response map of:
+        *   - code    : HTTP response code or 0 if there was a serious cURL error
+        *   - reason  : HTTP response reason (empty if there was a serious cURL error)
+        *   - headers : <header name/value associative array>
+        *   - body    : HTTP response body or resource (if "stream" was set)
+        *   - err     : Any cURL error string
+        * The map also stores integer-indexed copies of these values. This lets callers do:
+        *      <code>
+        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $client->run( $req );
+        *  </code>
+        * @param array $req Virtual HTTP request array
+        * @return array Response array for request
+        */
+       public function run( array $req ) {
+               $req = $this->runMulti( array( $req ) );
+               return $req[0]['response'];
+       }
+
+       /**
+        * Execute a set of virtual HTTP(S) requests concurrently
+        *
+        * A map of requests keys to response maps is returned. Each response map has:
+        *   - code    : HTTP response code or 0 if there was a serious cURL error
+        *   - reason  : HTTP response reason (empty if there was a serious cURL error)
+        *   - headers : <header name/value associative array>
+        *   - body    : HTTP response body or resource (if "stream" was set)
+        *   - err     : Any cURL error string
+        * The map also stores integer-indexed copies of these values. This lets callers do:
+        *      <code>
+        *              list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $responses[0];
+        *  </code>
+        *
+        * @param array $req Map of Virtual HTTP request arrays
+        * @return array $reqs Map of corresponding response values with the same keys/order
+        */
+       public function runMulti( array $reqs ) {
+               foreach ( $reqs as $index => &$req ) {
+                       if ( isset( $req[0] ) ) {
+                               $req['method'] = $req[0]; // short-form
+                               unset( $req[0] );
+                       }
+                       if ( isset( $req[1] ) ) {
+                               $req['url'] = $req[1]; // short-form
+                               unset( $req[1] );
+                       }
+                       $req['chain'] = array(); // chain or list of replaced requests
+               }
+               unset( $req ); // don't assign over this by accident
+
+               $curUniqueId = 0;
+               $armoredIndexMap = array(); // (original index => new index)
+
+               $doneReqs = array(); // (index => request)
+               $executeReqs = array(); // (index => request)
+               $replaceReqsByService = array(); // (prefix => index => request)
+               $origPending = array(); // (index => 1) for original requests
+
+               foreach ( $reqs as $origIndex => $req ) {
+                       // Re-index keys to consecutive integers (they will be swapped back later)
+                       $index = $curUniqueId++;
+                       $armoredIndexMap[$origIndex] = $index;
+                       $origPending[$index] = 1;
+                       if ( preg_match( '#^(http|ftp)s?://#', $req['url'] ) ) {
+                               // Absolute FTP/HTTP(S) URL, run it as normal
+                               $executeReqs[$index] = $req;
+                       } else {
+                               // Must be a virtual HTTP URL; resolve it
+                               list( $prefix, $service ) = $this->getMountAndService( $req['url'] );
+                               if ( !$service ) {
+                                       throw new UnexpectedValueException( "Path '{$req['url']}' has no service." );
+                               }
+                               // Set the URL to the mount-relative portion
+                               $req['url'] = substr( $req['url'], strlen( $prefix ) );
+                               $replaceReqsByService[$prefix][$index] = $req;
+                       }
+               }
+
+               // Function to get IDs that won't collide with keys in $armoredIndexMap
+               $idFunc = function() use ( &$curUniqueId ) {
+                       return $curUniqueId++;
+               };
+
+               $rounds = 0;
+               do {
+                       if ( ++$rounds > 5 ) { // sanity
+                               throw new Exception( "Too many replacement rounds detected. Aborting." );
+                       }
+                       // Resolve the virtual URLs valid and qualified HTTP(S) URLs
+                       // and add any required authentication headers for the backend.
+                       // Services can also replace requests with new ones, either to
+                       // defer the original or to set a proxy response to the original.
+                       $newReplaceReqsByService = array();
+                       foreach ( $replaceReqsByService as $prefix => $servReqs ) {
+                               $service = $this->instances[$prefix];
+                               foreach ( $service->onRequests( $servReqs, $idFunc ) as $index => $req ) {
+                                       // Services use unique IDs for replacement requests
+                                       if ( isset( $servReqs[$index] ) || isset( $origPending[$index] ) ) {
+                                               // A current or original request which was not modified
+                                       } else {
+                                               // Replacement requests with pre-set responses should not execute
+                                               $newReplaceReqsByService[$prefix][$index] = $req;
+                                       }
+                                       if ( isset( $req['response'] ) ) {
+                                               // Replacement requests with pre-set responses should not execute
+                                               unset( $executeReqs[$index] );
+                                               unset( $origPending[$index] );
+                                               $doneReqs[$index] = $req;
+                                       } else {
+                                               // Original or mangled request included
+                                               $executeReqs[$index] = $req;
+                                       }
+                               }
+                       }
+                       // Update index of requests to inspect for replacement
+                       $replaceReqsByService = $newReplaceReqsByService;
+                       // Run the actual work HTTP requests
+                       foreach ( $this->http->runMulti( $executeReqs ) as $index => $ranReq ) {
+                               $doneReqs[$index] = $ranReq;
+                               unset( $origPending[$index] );
+                       }
+                       $executeReqs = array();
+                       // Services can also replace requests with new ones, either to
+                       // defer the original or to set a proxy response to the original.
+                       // Any replacement requests executed above will need to be replaced
+                       // with new requests (eventually the original). The responses can be
+                       // forced instead of having the request sent over the wire.
+                       $newReplaceReqsByService = array();
+                       foreach ( $replaceReqsByService as $prefix => $servReqs ) {
+                               $service = $this->instances[$prefix];
+                               // Only the request copies stored in $doneReqs actually have the response
+                               $servReqs = array_intersect_key( $doneReqs, $servReqs );
+                               foreach ( $service->onResponses( $servReqs, $idFunc ) as $index => $req ) {
+                                       // Services use unique IDs for replacement requests
+                                       if ( isset( $servReqs[$index] ) || isset( $origPending[$index] ) ) {
+                                               // A current or original request which was not modified
+                                       } else {
+                                               // Replacement requests with pre-set responses should not execute
+                                               $newReplaceReqsByService[$prefix][$index] = $req;
+                                       }
+                                       if ( isset( $req['response'] ) ) {
+                                               // Replacement requests with pre-set responses should not execute
+                                               unset( $origPending[$index] );
+                                               $doneReqs[$index] = $req;
+                                       } else {
+                                               // Update the request in case it was mangled
+                                               $executeReqs[$index] = $req;
+                                       }
+                               }
+                       }
+                       // Update index of requests to inspect for replacement
+                       $replaceReqsByService = $newReplaceReqsByService;
+               } while ( count( $origPending ) );
+
+               $responses = array();
+               // Update $reqs to include 'response' and normalized request 'headers'.
+               // This maintains the original order of $reqs.
+               foreach ( $reqs as $origIndex => $req ) {
+                       $index = $armoredIndexMap[$origIndex];
+                       if ( !isset( $doneReqs[$index] ) ) {
+                               throw new UnexpectedValueException( "Response for request '$index' is NULL." );
+                       }
+                       $responses[$origIndex] = $doneReqs[$index]['response'];
+               }
+
+               return $responses;
+       }
+}
index c105c42..b91fb8a 100644 (file)
  *
  * @ingroup Media
  */
+// @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
 class BitmapHandler_ClientOnly extends BitmapHandler {
+       // @codingStandardsIgnoreEnd
+
        /**
         * @param File $image
         * @param array $params
index 5dc9590..0604d7b 100644 (file)
@@ -26,7 +26,7 @@
  * @ingroup UtfNormal
  */
 
-if( PHP_SAPI != 'cli' ) {
+if ( PHP_SAPI != 'cli' ) {
        die( "Run me from the command line please.\n" );
 }
 
@@ -40,8 +40,9 @@ dl( 'php_utfnormal.so' );
 
 function randomString( $length, $nullOk, $ascii = false ) {
        $out = '';
-       for( $i = 0; $i < $length; $i++ )
+       for ( $i = 0; $i < $length; $i++ )
                $out .= chr( mt_rand( $nullOk ? 0 : 1, $ascii ? 127 : 255 ) );
+
        return $out;
 }
 
@@ -66,7 +67,7 @@ function showDiffs( $a, $b ) {
        $funky = $formatter->format( $diffs );
        $matches = array();
        preg_match_all( '/<(?:ins|del) class="diffchange">(.*?)<\/(?:ins|del)>/', $funky, $matches );
-       foreach( $matches[1] as $bit ) {
+       foreach ( $matches[1] as $bit ) {
                $hex = bin2hex( $bit );
                echo "\t$hex\n";
        }
@@ -74,28 +75,27 @@ function showDiffs( $a, $b ) {
 
 $size = 16;
 $n = 0;
-while( true ) {
+while ( true ) {
        $n++;
        echo "$n\n";
 
-       $str = randomString( $size, true);
+       $str = randomString( $size, true );
        $clean = UtfNormal::cleanUp( $str );
        $norm = donorm( $str );
 
        echo strlen( $clean ) . ", " . strlen( $norm );
-       if( $clean == $norm ) {
+       if ( $clean == $norm ) {
                echo " (match)\n";
        } else {
                echo " (FAIL)\n";
                echo "\traw: " . bin2hex( $str ) . "\n" .
-                        "\tphp: " . bin2hex( $clean ) . "\n" .
-                        "\ticu: " . bin2hex( $norm ) . "\n";
+                       "\tphp: " . bin2hex( $clean ) . "\n" .
+                       "\ticu: " . bin2hex( $norm ) . "\n";
                echo "\n\tdiffs:\n";
                showDiffs( $clean, $norm );
                die();
        }
 
-
        $str = '';
        $clean = '';
        $norm = '';
index 61c315f..f4acc1e 100644 (file)
@@ -40,27 +40,27 @@ $verbose = false;
 #$verbose = true;
 
 $in = fopen( "UTF-8-test.txt", "rt" );
-if( !$in ) {
+if ( !$in ) {
        print "Couldn't open UTF-8-test.txt -- can't run tests.\n";
        print "If necessary, manually download this file. It can be obtained at\n";
        print "http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt\n";
-       exit(-1);
+       exit( -1 );
 }
 
 $columns = 0;
-while( false !== ( $line = fgets( $in ) ) ) {
+while ( false !== ( $line = fgets( $in ) ) ) {
        $matches = array();
-       if( preg_match( '/^(Here come the tests:\s*)\|$/', $line, $matches ) ) {
+       if ( preg_match( '/^(Here come the tests:\s*)\|$/', $line, $matches ) ) {
                $columns = strpos( $line, '|' );
                break;
        }
 }
 
-if( !$columns ) {
+if ( !$columns ) {
        print "Something seems to be wrong; couldn't extract line length.\n";
        print "Check that UTF-8-test.txt was downloaded correctly from\n";
        print "http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt\n";
-       exit(-1);
+       exit( -1 );
 }
 
 # print "$columns\n";
@@ -90,22 +90,26 @@ $test = '';
 $failed = 0;
 $success = 0;
 $total = 0;
-while( false !== ( $line = fgets( $in ) ) ) {
+while ( false !== ( $line = fgets( $in ) ) ) {
        $matches = array();
-       if( preg_match( '/^(\d+)\s+(.*?)\s*\|/', $line, $matches ) ) {
+       if ( preg_match( '/^(\d+)\s+(.*?)\s*\|/', $line, $matches ) ) {
                $section = $matches[1];
                print $line;
                continue;
        }
-       if( preg_match( '/^(\d+\.\d+\.\d+)\s*/', $line, $matches ) ) {
+       if ( preg_match( '/^(\d+\.\d+\.\d+)\s*/', $line, $matches ) ) {
                $test = $matches[1];
 
-               if( in_array( $test, $ignore ) ) {
+               if ( in_array( $test, $ignore ) ) {
                        continue;
                }
-               if( in_array( $test, $longTests ) ) {
+               if ( in_array( $test, $longTests ) ) {
                        $line = fgets( $in );
-                       for( $line = fgets( $in ); !preg_match( '/^\s+\|/', $line ); $line = fgets( $in ) ) {
+
+                       // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
+                       for ( $line = fgets( $in ); !preg_match( '/^\s+\|/', $line ); $line = fgets( $in ) ) {
+                               // @codingStandardsIgnoreEnd
+
                                testLine( $test, $line, $total, $success, $failed, $columns, $exceptions, $verbose );
                        }
                } else {
@@ -114,15 +118,14 @@ while( false !== ( $line = fgets( $in ) ) ) {
        }
 }
 
-if( $failed ) {
+if ( $failed ) {
        echo "\nFailed $failed tests.\n";
        echo "UTF-8 DECODER TEST FAILED\n";
-       exit (-1);
+       exit ( -1 );
 }
 
 echo "UTF-8 DECODER TEST SUCCESS!\n";
-exit (0);
-
+exit ( 0 );
 
 function testLine( $test, $line, &$total, &$success, &$failed, $columns, $exceptions, $verbose ) {
        $stripped = $line;
@@ -130,24 +133,24 @@ function testLine( $test, $line, &$total, &$success, &$failed, $columns, $except
 
        $same = ( $line == $stripped );
        $len = mb_strlen( substr( $stripped, 0, strpos( $stripped, '|' ) ) );
-       if( $len == 0 ) {
+       if ( $len == 0 ) {
                $len = strlen( substr( $stripped, 0, strpos( $stripped, '|' ) ) );
        }
 
-       $ok = $same ^ ($test >= 3 );
+       $ok = $same ^ ( $test >= 3 );
 
        $ok ^= in_array( $test, $exceptions );
 
-       $ok &= ($columns == $len);
+       $ok &= ( $columns == $len );
 
        $total++;
-       if( $ok ) {
+       if ( $ok ) {
                $success++;
        } else {
                $failed++;
        }
 
-       if( $verbose || !$ok ) {
+       if ( $verbose || !$ok ) {
                print str_replace( "\n", "$len\n", $stripped );
        }
 }
index f6f7dbb..8204f97 100644 (file)
@@ -50,21 +50,20 @@ class UtfNormal {
         * For using the ICU wrapper
         */
        const UNORM_NONE = 1;
-       const UNORM_NFD  = 2;
+       const UNORM_NFD = 2;
        const UNORM_NFKD = 3;
-       const UNORM_NFC  = 4;
+       const UNORM_NFC = 4;
        const UNORM_NFKC = 5;
-       const UNORM_FCD  = 6;
+       const UNORM_FCD = 6;
        const UNORM_DEFAULT = self::UNORM_NFC;
 
-       static $utfCombiningClass = null;
-       static $utfCanonicalComp = null;
-       static $utfCanonicalDecomp = null;
+       public static $utfCombiningClass = null;
+       public static $utfCanonicalComp = null;
+       public static $utfCanonicalDecomp = null;
 
        # Load compatibility decompositions on demand if they are needed.
-       static $utfCompatibilityDecomp = null;
-
-       static $utfCheckNFC;
+       public static $utfCompatibilityDecomp = null;
+       public static $utfCheckNFC;
 
        /**
         * The ultimate convenience function! Clean up invalid UTF-8 sequences,
@@ -77,21 +76,21 @@ class UtfNormal {
         * @return string a clean, shiny, normalized UTF-8 string
         */
        static function cleanUp( $string ) {
-               if( NORMALIZE_ICU ) {
+               if ( NORMALIZE_ICU ) {
                        $string = self::replaceForNativeNormalize( $string );
 
                        # UnicodeString constructor fails if the string ends with a
                        # head byte. Add a junk char at the end, we'll strip it off.
                        return rtrim( utf8_normalize( $string . "\x01", self::UNORM_NFC ), "\x01" );
-               } elseif( NORMALIZE_INTL ) {
+               } elseif ( NORMALIZE_INTL ) {
                        $string = self::replaceForNativeNormalize( $string );
                        $norm = normalizer_normalize( $string, Normalizer::FORM_C );
-                       if( $norm === null || $norm === false ) {
+                       if ( $norm === null || $norm === false ) {
                                # normalizer_normalize will either return false or null
                                # (depending on which doc you read) if invalid utf8 string.
                                # quickIsNFCVerify cleans up invalid sequences.
 
-                               if( UtfNormal::quickIsNFCVerify( $string ) ) {
+                               if ( UtfNormal::quickIsNFCVerify( $string ) ) {
                                        # if that's true, the string is actually already normal.
                                        return $string;
                                } else {
@@ -101,7 +100,7 @@ class UtfNormal {
                        } else {
                                return $norm;
                        }
-               } elseif( UtfNormal::quickIsNFCVerify( $string ) ) {
+               } elseif ( UtfNormal::quickIsNFCVerify( $string ) ) {
                        # Side effect -- $string has had UTF-8 errors cleaned up.
                        return $string;
                } else {
@@ -118,11 +117,11 @@ class UtfNormal {
         * @return string a UTF-8 string in normal form C
         */
        static function toNFC( $string ) {
-               if( NORMALIZE_INTL )
+               if ( NORMALIZE_INTL )
                        return normalizer_normalize( $string, Normalizer::FORM_C );
-               elseif( NORMALIZE_ICU )
+               elseif ( NORMALIZE_ICU )
                        return utf8_normalize( $string, self::UNORM_NFC );
-               elseif( UtfNormal::quickIsNFC( $string ) )
+               elseif ( UtfNormal::quickIsNFC( $string ) )
                        return $string;
                else
                        return UtfNormal::NFC( $string );
@@ -136,11 +135,11 @@ class UtfNormal {
         * @return string a UTF-8 string in normal form D
         */
        static function toNFD( $string ) {
-               if( NORMALIZE_INTL )
+               if ( NORMALIZE_INTL )
                        return normalizer_normalize( $string, Normalizer::FORM_D );
-               elseif( NORMALIZE_ICU )
+               elseif ( NORMALIZE_ICU )
                        return utf8_normalize( $string, self::UNORM_NFD );
-               elseif( preg_match( '/[\x80-\xff]/', $string ) )
+               elseif ( preg_match( '/[\x80-\xff]/', $string ) )
                        return UtfNormal::NFD( $string );
                else
                        return $string;
@@ -155,11 +154,11 @@ class UtfNormal {
         * @return string a UTF-8 string in normal form KC
         */
        static function toNFKC( $string ) {
-               if( NORMALIZE_INTL )
+               if ( NORMALIZE_INTL )
                        return normalizer_normalize( $string, Normalizer::FORM_KC );
-               elseif( NORMALIZE_ICU )
+               elseif ( NORMALIZE_ICU )
                        return utf8_normalize( $string, self::UNORM_NFKC );
-               elseif( preg_match( '/[\x80-\xff]/', $string ) )
+               elseif ( preg_match( '/[\x80-\xff]/', $string ) )
                        return UtfNormal::NFKC( $string );
                else
                        return $string;
@@ -174,11 +173,11 @@ class UtfNormal {
         * @return string a UTF-8 string in normal form KD
         */
        static function toNFKD( $string ) {
-               if( NORMALIZE_INTL )
+               if ( NORMALIZE_INTL )
                        return normalizer_normalize( $string, Normalizer::FORM_KD );
-               elseif( NORMALIZE_ICU )
+               elseif ( NORMALIZE_ICU )
                        return utf8_normalize( $string, self::UNORM_NFKD );
-               elseif( preg_match( '/[\x80-\xff]/', $string ) )
+               elseif ( preg_match( '/[\x80-\xff]/', $string ) )
                        return UtfNormal::NFKD( $string );
                else
                        return $string;
@@ -189,7 +188,7 @@ class UtfNormal {
         * @private
         */
        static function loadData() {
-               if( !isset( self::$utfCombiningClass ) ) {
+               if ( !isset( self::$utfCombiningClass ) ) {
                        require_once __DIR__ . '/UtfNormalData.inc';
                }
        }
@@ -203,34 +202,35 @@ class UtfNormal {
        static function quickIsNFC( $string ) {
                # ASCII is always valid NFC!
                # If it's pure ASCII, let it through.
-               if( !preg_match( '/[\x80-\xff]/', $string ) ) return true;
+               if ( !preg_match( '/[\x80-\xff]/', $string ) ) return true;
 
                UtfNormal::loadData();
                $len = strlen( $string );
-               for( $i = 0; $i < $len; $i++ ) {
+               for ( $i = 0; $i < $len; $i++ ) {
                        $c = $string[$i];
                        $n = ord( $c );
-                       if( $n < 0x80 ) {
+                       if ( $n < 0x80 ) {
                                continue;
-                       } elseif( $n >= 0xf0 ) {
+                       } elseif ( $n >= 0xf0 ) {
                                $c = substr( $string, $i, 4 );
                                $i += 3;
-                       } elseif( $n >= 0xe0 ) {
+                       } elseif ( $n >= 0xe0 ) {
                                $c = substr( $string, $i, 3 );
                                $i += 2;
-                       } elseif( $n >= 0xc0 ) {
+                       } elseif ( $n >= 0xc0 ) {
                                $c = substr( $string, $i, 2 );
                                $i++;
                        }
-                       if( isset( self::$utfCheckNFC[$c] ) ) {
+                       if ( isset( self::$utfCheckNFC[$c] ) ) {
                                # If it's NO or MAYBE, bail and do the slow check.
                                return false;
                        }
-                       if( isset( self::$utfCombiningClass[$c] ) ) {
+                       if ( isset( self::$utfCombiningClass[$c] ) ) {
                                # Combining character? We might have to do sorting, at least.
                                return false;
                        }
                }
+
                return true;
        }
 
@@ -247,10 +247,10 @@ class UtfNormal {
                # ASCII is always valid NFC!
                # If we're only ever given plain ASCII, we can avoid the overhead
                # of initializing the decomposition tables by skipping out early.
-               if( !preg_match( '/[\x80-\xff]/', $string ) ) return true;
+               if ( !preg_match( '/[\x80-\xff]/', $string ) ) return true;
 
                static $checkit = null, $tailBytes = null, $utfCheckOrCombining = null;
-               if( !isset( $checkit ) ) {
+               if ( !isset( $checkit ) ) {
                        # Load/build some scary lookup tables...
                        UtfNormal::loadData();
 
@@ -258,30 +258,30 @@ class UtfNormal {
 
                        # Head bytes for sequences which we should do further validity checks
                        $checkit = array_flip( array_map( 'chr',
-                                       array( 0xc0, 0xc1, 0xe0, 0xed, 0xef,
-                                                  0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
-                                                  0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff ) ) );
+                               array( 0xc0, 0xc1, 0xe0, 0xed, 0xef,
+                                       0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
+                                       0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff ) ) );
 
                        # Each UTF-8 head byte is followed by a certain
                        # number of tail bytes.
                        $tailBytes = array();
-                       for( $n = 0; $n < 256; $n++ ) {
-                               if( $n < 0xc0 ) {
+                       for ( $n = 0; $n < 256; $n++ ) {
+                               if ( $n < 0xc0 ) {
                                        $remaining = 0;
-                               } elseif( $n < 0xe0 ) {
+                               } elseif ( $n < 0xe0 ) {
                                        $remaining = 1;
-                               } elseif( $n < 0xf0 ) {
+                               } elseif ( $n < 0xf0 ) {
                                        $remaining = 2;
-                               } elseif( $n < 0xf8 ) {
+                               } elseif ( $n < 0xf8 ) {
                                        $remaining = 3;
-                               } elseif( $n < 0xfc ) {
+                               } elseif ( $n < 0xfc ) {
                                        $remaining = 4;
-                               } elseif( $n < 0xfe ) {
+                               } elseif ( $n < 0xfe ) {
                                        $remaining = 5;
                                } else {
                                        $remaining = 0;
                                }
-                               $tailBytes[chr($n)] = $remaining;
+                               $tailBytes[chr( $n )] = $remaining;
                        }
                }
 
@@ -297,10 +297,10 @@ class UtfNormal {
                $looksNormal = true;
                $base = 0;
                $replace = array();
-               foreach( $matches[1] as $str ) {
+               foreach ( $matches[1] as $str ) {
                        $chunk = strlen( $str );
 
-                       if( $str[0] < "\x80" ) {
+                       if ( $str[0] < "\x80" ) {
                                # ASCII chunk: guaranteed to be valid UTF-8
                                # and in normal form C, so skip over it.
                                $base += $chunk;
@@ -317,30 +317,30 @@ class UtfNormal {
                        $head = '';
                        $len = $chunk + 1; # Counting down is faster. I'm *so* sorry.
 
-                       for( $i = -1; --$len; ) {
+                       for ( $i = -1; --$len; ) {
                                $remaining = $tailBytes[$c = $str[++$i]];
-                               if( $remaining ) {
+                               if ( $remaining ) {
                                        # UTF-8 head byte!
                                        $sequence = $head = $c;
                                        do {
                                                # Look for the defined number of tail bytes...
-                                               if( --$len && ( $c = $str[++$i] ) >= "\x80" && $c < "\xc0" ) {
+                                               if ( --$len && ( $c = $str[++$i] ) >= "\x80" && $c < "\xc0" ) {
                                                        # Legal tail bytes are nice.
                                                        $sequence .= $c;
                                                } else {
-                                                       if( 0 == $len ) {
+                                                       if ( 0 == $len ) {
                                                                # Premature end of string!
                                                                # Drop a replacement character into output to
                                                                # represent the invalid UTF-8 sequence.
                                                                $replace[] = array( UTF8_REPLACEMENT,
-                                                                                                       $base + $i + 1 - strlen( $sequence ),
-                                                                                                       strlen( $sequence ) );
+                                                                       $base + $i + 1 - strlen( $sequence ),
+                                                                       strlen( $sequence ) );
                                                                break 2;
                                                        } else {
                                                                # Illegal tail byte; abandon the sequence.
                                                                $replace[] = array( UTF8_REPLACEMENT,
-                                                                                                       $base + $i - strlen( $sequence ),
-                                                                                                       strlen( $sequence ) );
+                                                                       $base + $i - strlen( $sequence ),
+                                                                       strlen( $sequence ) );
                                                                # Back up and reprocess this byte; it may itself
                                                                # be a legal ASCII or UTF-8 sequence head.
                                                                --$i;
@@ -348,59 +348,60 @@ class UtfNormal {
                                                                continue 2;
                                                        }
                                                }
-                                       } while( --$remaining );
+                                       } while ( --$remaining );
 
-                                       if( isset( $checkit[$head] ) ) {
+                                       if ( isset( $checkit[$head] ) ) {
                                                # Do some more detailed validity checks, for
                                                # invalid characters and illegal sequences.
-                                               if( $head == "\xed" ) {
+                                               if ( $head == "\xed" ) {
                                                        # 0xed is relatively frequent in Korean, which
                                                        # abuts the surrogate area, so we're doing
                                                        # this check separately to speed things up.
 
-                                                       if( $sequence >= UTF8_SURROGATE_FIRST ) {
+                                                       if ( $sequence >= UTF8_SURROGATE_FIRST ) {
                                                                # Surrogates are legal only in UTF-16 code.
                                                                # They are totally forbidden here in UTF-8
                                                                # utopia.
                                                                $replace[] = array( UTF8_REPLACEMENT,
-                                                                            $base + $i + 1 - strlen( $sequence ),
-                                                                            strlen( $sequence ) );
+                                                                       $base + $i + 1 - strlen( $sequence ),
+                                                                       strlen( $sequence ) );
                                                                $head = '';
                                                                continue;
                                                        }
                                                } else {
                                                        # Slower, but rarer checks...
                                                        $n = ord( $head );
-                                                       if(
+                                                       if (
                                                                # "Overlong sequences" are those that are syntactically
                                                                # correct but use more UTF-8 bytes than are necessary to
                                                                # encode a character. Naïve string comparisons can be
                                                                # tricked into failing to see a match for an ASCII
                                                                # character, for instance, which can be a security hole
                                                                # if blacklist checks are being used.
-                                                              ($n  < 0xc2 && $sequence <= UTF8_OVERLONG_A)
-                                                               || ($n == 0xe0 && $sequence <= UTF8_OVERLONG_B)
-                                                               || ($n == 0xf0 && $sequence <= UTF8_OVERLONG_C)
+                                                               ( $n < 0xc2 && $sequence <= UTF8_OVERLONG_A )
+                                                               || ( $n == 0xe0 && $sequence <= UTF8_OVERLONG_B )
+                                                               || ( $n == 0xf0 && $sequence <= UTF8_OVERLONG_C )
 
                                                                # U+FFFE and U+FFFF are explicitly forbidden in Unicode.
-                                                               || ($n == 0xef &&
-                                                                          ($sequence == UTF8_FFFE)
-                                                                       || ($sequence == UTF8_FFFF) )
+                                                               || ( $n == 0xef &&
+                                                                       ( $sequence == UTF8_FFFE )
+                                                                       || ( $sequence == UTF8_FFFF ) )
 
                                                                # Unicode has been limited to 21 bits; longer
                                                                # sequences are not allowed.
-                                                               || ($n >= 0xf0 && $sequence > UTF8_MAX) ) {
+                                                               || ( $n >= 0xf0 && $sequence > UTF8_MAX )
+                                                       ) {
 
                                                                $replace[] = array( UTF8_REPLACEMENT,
-                                                                                   $base + $i + 1 - strlen( $sequence ),
-                                                                                   strlen( $sequence ) );
+                                                                       $base + $i + 1 - strlen( $sequence ),
+                                                                       strlen( $sequence ) );
                                                                $head = '';
                                                                continue;
                                                        }
                                                }
                                        }
 
-                                       if( isset( $utfCheckOrCombining[$sequence] ) ) {
+                                       if ( isset( $utfCheckOrCombining[$sequence] ) ) {
                                                # If it's NO or MAYBE, we'll have to rip
                                                # the string apart and put it back together.
                                                # That's going to be mighty slow.
@@ -409,12 +410,12 @@ class UtfNormal {
 
                                        # The sequence is legal!
                                        $head = '';
-                               } elseif( $c < "\x80" ) {
+                               } elseif ( $c < "\x80" ) {
                                        # ASCII byte.
                                        $head = '';
-                               } elseif( $c < "\xc0" ) {
+                               } elseif ( $c < "\xc0" ) {
                                        # Illegal tail bytes
-                                       if( $head == '' ) {
+                                       if ( $head == '' ) {
                                                # Out of the blue!
                                                $replace[] = array( UTF8_REPLACEMENT, $base + $i, 1 );
                                        } else {
@@ -431,23 +432,24 @@ class UtfNormal {
                        }
                        $base += $chunk;
                }
-               if( count( $replace ) ) {
+               if ( count( $replace ) ) {
                        # There were illegal UTF-8 sequences we need to fix up.
                        $out = '';
                        $last = 0;
-                       foreach( $replace as $rep ) {
+                       foreach ( $replace as $rep ) {
                                list( $replacement, $start, $length ) = $rep;
-                               if( $last < $start ) {
+                               if ( $last < $start ) {
                                        $out .= substr( $string, $last, $start - $last );
                                }
                                $out .= $replacement;
                                $last = $start + $length;
                        }
-                       if( $last < strlen( $string ) ) {
+                       if ( $last < strlen( $string ) ) {
                                $out .= substr( $string, $last );
                        }
                        $string = $out;
                }
+
                return $looksNormal;
        }
 
@@ -490,14 +492,14 @@ class UtfNormal {
         * @private
         */
        static function NFKD( $string ) {
-               if( !isset( self::$utfCompatibilityDecomp ) ) {
+               if ( !isset( self::$utfCompatibilityDecomp ) ) {
                        require_once 'UtfNormalDataK.inc';
                }
+
                return self::fastCombiningSort(
                        self::fastDecompose( $string, self::$utfCompatibilityDecomp ) );
        }
 
-
        /**
         * Perform decomposition of a UTF-8 string into either D or KD form
         * (depending on which decomposition map is passed to us).
@@ -511,45 +513,45 @@ class UtfNormal {
                UtfNormal::loadData();
                $len = strlen( $string );
                $out = '';
-               for( $i = 0; $i < $len; $i++ ) {
+               for ( $i = 0; $i < $len; $i++ ) {
                        $c = $string[$i];
                        $n = ord( $c );
-                       if( $n < 0x80 ) {
+                       if ( $n < 0x80 ) {
                                # ASCII chars never decompose
                                # THEY ARE IMMORTAL
                                $out .= $c;
                                continue;
-                       } elseif( $n >= 0xf0 ) {
+                       } elseif ( $n >= 0xf0 ) {
                                $c = substr( $string, $i, 4 );
                                $i += 3;
-                       } elseif( $n >= 0xe0 ) {
+                       } elseif ( $n >= 0xe0 ) {
                                $c = substr( $string, $i, 3 );
                                $i += 2;
-                       } elseif( $n >= 0xc0 ) {
+                       } elseif ( $n >= 0xc0 ) {
                                $c = substr( $string, $i, 2 );
                                $i++;
                        }
-                       if( isset( $map[$c] ) ) {
+                       if ( isset( $map[$c] ) ) {
                                $out .= $map[$c];
                                continue;
                        } else {
-                               if( $c >= UTF8_HANGUL_FIRST && $c <= UTF8_HANGUL_LAST ) {
+                               if ( $c >= UTF8_HANGUL_FIRST && $c <= UTF8_HANGUL_LAST ) {
                                        # Decompose a hangul syllable into jamo;
                                        # hardcoded for three-byte UTF-8 sequence.
                                        # A lookup table would be slightly faster,
                                        # but adds a lot of memory & disk needs.
                                        #
-                                       $index = ( (ord( $c[0] ) & 0x0f) << 12
-                                                | (ord( $c[1] ) & 0x3f) <<  6
-                                                | (ord( $c[2] ) & 0x3f) )
-                                              - UNICODE_HANGUL_FIRST;
+                                       $index = ( ( ord( $c[0] ) & 0x0f ) << 12
+                                                       | ( ord( $c[1] ) & 0x3f ) << 6
+                                                       | ( ord( $c[2] ) & 0x3f ) )
+                                               - UNICODE_HANGUL_FIRST;
                                        $l = intval( $index / UNICODE_HANGUL_NCOUNT );
-                                       $v = intval( ($index % UNICODE_HANGUL_NCOUNT) / UNICODE_HANGUL_TCOUNT);
+                                       $v = intval( ( $index % UNICODE_HANGUL_NCOUNT ) / UNICODE_HANGUL_TCOUNT );
                                        $t = $index % UNICODE_HANGUL_TCOUNT;
                                        $out .= "\xe1\x84" . chr( 0x80 + $l ) . "\xe1\x85" . chr( 0xa1 + $v );
-                                       if( $t >= 25 ) {
+                                       if ( $t >= 25 ) {
                                                $out .= "\xe1\x87" . chr( 0x80 + $t - 25 );
-                                       } elseif( $t ) {
+                                       } elseif ( $t ) {
                                                $out .= "\xe1\x86" . chr( 0xa7 + $t );
                                        }
                                        continue;
@@ -557,6 +559,7 @@ class UtfNormal {
                        }
                        $out .= $c;
                }
+
                return $out;
        }
 
@@ -573,23 +576,23 @@ class UtfNormal {
                $out = '';
                $combiners = array();
                $lastClass = -1;
-               for( $i = 0; $i < $len; $i++ ) {
+               for ( $i = 0; $i < $len; $i++ ) {
                        $c = $string[$i];
                        $n = ord( $c );
-                       if( $n >= 0x80 ) {
-                               if( $n >= 0xf0 ) {
+                       if ( $n >= 0x80 ) {
+                               if ( $n >= 0xf0 ) {
                                        $c = substr( $string, $i, 4 );
                                        $i += 3;
-                               } elseif( $n >= 0xe0 ) {
+                               } elseif ( $n >= 0xe0 ) {
                                        $c = substr( $string, $i, 3 );
                                        $i += 2;
-                               } elseif( $n >= 0xc0 ) {
+                               } elseif ( $n >= 0xc0 ) {
                                        $c = substr( $string, $i, 2 );
                                        $i++;
                                }
-                               if( isset( self::$utfCombiningClass[$c] ) ) {
+                               if ( isset( self::$utfCombiningClass[$c] ) ) {
                                        $lastClass = self::$utfCombiningClass[$c];
-                                       if( isset( $combiners[$lastClass] ) ) {
+                                       if ( isset( $combiners[$lastClass] ) ) {
                                                $combiners[$lastClass] .= $c;
                                        } else {
                                                $combiners[$lastClass] = $c;
@@ -597,7 +600,7 @@ class UtfNormal {
                                        continue;
                                }
                        }
-                       if( $lastClass ) {
+                       if ( $lastClass ) {
                                ksort( $combiners );
                                $out .= implode( '', $combiners );
                                $combiners = array();
@@ -605,10 +608,11 @@ class UtfNormal {
                        $out .= $c;
                        $lastClass = 0;
                }
-               if( $lastClass ) {
+               if ( $lastClass ) {
                        ksort( $combiners );
                        $out .= implode( '', $combiners );
                }
+
                return $out;
        }
 
@@ -616,8 +620,10 @@ class UtfNormal {
         * Produces canonically composed sequences, i.e. normal form C or KC.
         *
         * @private
-        * @param string $string a valid UTF-8 string in sorted normal form D or KD. Input is not validated.
-        * @return string a UTF-8 string with canonical precomposed characters used where possible
+        * @param string $string a valid UTF-8 string in sorted normal form D or KD.
+        *   Input is not validated.
+        * @return string a UTF-8 string with canonical precomposed characters used
+        *   where possible.
         */
        static function fastCompose( $string ) {
                UtfNormal::loadData();
@@ -627,12 +633,12 @@ class UtfNormal {
                $lastHangul = 0;
                $startChar = '';
                $combining = '';
-               $x1 = ord(substr(UTF8_HANGUL_VBASE, 0, 1));
-               $x2 = ord(substr(UTF8_HANGUL_TEND, 0, 1));
-               for( $i = 0; $i < $len; $i++ ) {
+               $x1 = ord( substr( UTF8_HANGUL_VBASE, 0, 1 ) );
+               $x2 = ord( substr( UTF8_HANGUL_TEND, 0, 1 ) );
+               for ( $i = 0; $i < $len; $i++ ) {
                        $c = $string[$i];
                        $n = ord( $c );
-                       if( $n < 0x80 ) {
+                       if ( $n < 0x80 ) {
                                # No combining characters here...
                                $out .= $startChar;
                                $out .= $combining;
@@ -640,25 +646,26 @@ class UtfNormal {
                                $combining = '';
                                $lastClass = 0;
                                continue;
-                       } elseif( $n >= 0xf0 ) {
+                       } elseif ( $n >= 0xf0 ) {
                                $c = substr( $string, $i, 4 );
                                $i += 3;
-                       } elseif( $n >= 0xe0 ) {
+                       } elseif ( $n >= 0xe0 ) {
                                $c = substr( $string, $i, 3 );
                                $i += 2;
-                       } elseif( $n >= 0xc0 ) {
+                       } elseif ( $n >= 0xc0 ) {
                                $c = substr( $string, $i, 2 );
                                $i++;
                        }
                        $pair = $startChar . $c;
-                       if( $n > 0x80 ) {
-                               if( isset( self::$utfCombiningClass[$c] ) ) {
+                       if ( $n > 0x80 ) {
+                               if ( isset( self::$utfCombiningClass[$c] ) ) {
                                        # A combining char; see what we can do with it
                                        $class = self::$utfCombiningClass[$c];
-                                       if( !empty( $startChar ) &&
+                                       if ( !empty( $startChar ) &&
                                                $lastClass < $class &&
                                                $class > 0 &&
-                                               isset( self::$utfCanonicalComp[$pair] ) ) {
+                                               isset( self::$utfCanonicalComp[$pair] )
+                                       ) {
                                                $startChar = self::$utfCanonicalComp[$pair];
                                                $class = 0;
                                        } else {
@@ -670,56 +677,58 @@ class UtfNormal {
                                }
                        }
                        # New start char
-                       if( $lastClass == 0 ) {
-                               if( isset( self::$utfCanonicalComp[$pair] ) ) {
+                       if ( $lastClass == 0 ) {
+                               if ( isset( self::$utfCanonicalComp[$pair] ) ) {
                                        $startChar = self::$utfCanonicalComp[$pair];
                                        $lastHangul = 0;
                                        continue;
                                }
-                               if( $n >= $x1 && $n <= $x2 ) {
+                               if ( $n >= $x1 && $n <= $x2 ) {
                                        # WARNING: Hangul code is painfully slow.
                                        # I apologize for this ugly, ugly code; however
                                        # performance is even more teh suck if we call
                                        # out to nice clean functions. Lookup tables are
                                        # marginally faster, but require a lot of space.
                                        #
-                                       if( $c >= UTF8_HANGUL_VBASE &&
+                                       if ( $c >= UTF8_HANGUL_VBASE &&
                                                $c <= UTF8_HANGUL_VEND &&
                                                $startChar >= UTF8_HANGUL_LBASE &&
-                                               $startChar <= UTF8_HANGUL_LEND ) {
+                                               $startChar <= UTF8_HANGUL_LEND
+                                       ) {
                                                #
                                                #$lIndex = utf8ToCodepoint( $startChar ) - UNICODE_HANGUL_LBASE;
                                                #$vIndex = utf8ToCodepoint( $c ) - UNICODE_HANGUL_VBASE;
                                                $lIndex = ord( $startChar[2] ) - 0x80;
-                                               $vIndex = ord( $c[2]         ) - 0xa1;
+                                               $vIndex = ord( $c[2] ) - 0xa1;
 
                                                $hangulPoint = UNICODE_HANGUL_FIRST +
                                                        UNICODE_HANGUL_TCOUNT *
-                                                       (UNICODE_HANGUL_VCOUNT * $lIndex + $vIndex);
+                                                       ( UNICODE_HANGUL_VCOUNT * $lIndex + $vIndex );
 
                                                # Hardcode the limited-range UTF-8 conversion:
                                                $startChar = chr( $hangulPoint >> 12 & 0x0f | 0xe0 ) .
-                                                                        chr( $hangulPoint >>  6 & 0x3f | 0x80 ) .
-                                                                        chr( $hangulPoint       & 0x3f | 0x80 );
+                                                       chr( $hangulPoint >> 6 & 0x3f | 0x80 ) .
+                                                       chr( $hangulPoint & 0x3f | 0x80 );
                                                $lastHangul = 0;
                                                continue;
-                                       } elseif( $c >= UTF8_HANGUL_TBASE &&
-                                                         $c <= UTF8_HANGUL_TEND &&
-                                                         $startChar >= UTF8_HANGUL_FIRST &&
-                                                         $startChar <= UTF8_HANGUL_LAST &&
-                                                         !$lastHangul ) {
+                                       } elseif ( $c >= UTF8_HANGUL_TBASE &&
+                                               $c <= UTF8_HANGUL_TEND &&
+                                               $startChar >= UTF8_HANGUL_FIRST &&
+                                               $startChar <= UTF8_HANGUL_LAST &&
+                                               !$lastHangul
+                                       ) {
                                                # $tIndex = utf8ToCodepoint( $c ) - UNICODE_HANGUL_TBASE;
                                                $tIndex = ord( $c[2] ) - 0xa7;
-                                               if( $tIndex < 0 ) $tIndex = ord( $c[2] ) - 0x80 + (0x11c0 - 0x11a7);
+                                               if ( $tIndex < 0 ) $tIndex = ord( $c[2] ) - 0x80 + ( 0x11c0 - 0x11a7 );
 
                                                # Increment the code point by $tIndex, without
                                                # the function overhead of decoding and recoding UTF-8
                                                #
                                                $tail = ord( $startChar[2] ) + $tIndex;
-                                               if( $tail > 0xbf ) {
+                                               if ( $tail > 0xbf ) {
                                                        $tail -= 0x40;
                                                        $mid = ord( $startChar[1] ) + 1;
-                                                       if( $mid > 0xbf ) {
+                                                       if ( $mid > 0xbf ) {
                                                                $startChar[0] = chr( ord( $startChar[0] ) + 1 );
                                                                $mid -= 0x40;
                                                        }
@@ -741,6 +750,7 @@ class UtfNormal {
                        $lastHangul = 0;
                }
                $out .= $startChar . $combining;
+
                return $out;
        }
 
@@ -753,11 +763,13 @@ class UtfNormal {
        static function placebo( $string ) {
                $len = strlen( $string );
                $out = '';
-               for( $i = 0; $i < $len; $i++ ) {
+               for ( $i = 0; $i < $len; $i++ ) {
                        $out .= $string[$i];
                }
+
                return $out;
        }
+
        /**
         * Function to replace some characters that we don't want
         * but most of the native normalize functions keep.
@@ -772,6 +784,7 @@ class UtfNormal {
                        $string );
                $string = str_replace( UTF8_FFFE, UTF8_REPLACEMENT, $string );
                $string = str_replace( UTF8_FFFF, UTF8_REPLACEMENT, $string );
+
                return $string;
        }
 }
index 59a64a3..bd4cf05 100644 (file)
  * @ingroup UtfNormal
  */
 
-if( PHP_SAPI != 'cli' ) {
+if ( PHP_SAPI != 'cli' ) {
        die( "Run me from the command line please.\n" );
 }
 
-if( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
+if ( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
        dl( 'php_utfnormal.so' );
 }
 
@@ -47,7 +47,7 @@ $testfiles = array(
 );
 $normalizer = new UtfNormal;
 UtfNormal::loadData();
-foreach( $testfiles as $file => $desc ) {
+foreach ( $testfiles as $file => $desc ) {
        benchmarkTest( $normalizer, $file, $desc );
 }
 
@@ -67,11 +67,12 @@ function benchmarkTest( &$u, $filename, $desc ) {
 #              'NFD', 'NFKD',
                array( 'fastDecompose', 'fastCombiningSort', 'fastCompose' ),
 #              'quickIsNFC', 'quickIsNFCVerify',
-               );
-       foreach( $forms as $form ) {
-               if( is_array( $form ) ) {
+       );
+
+       foreach ( $forms as $form ) {
+               if ( is_array( $form ) ) {
                        $str = $data;
-                       foreach( $form as $step ) {
+                       foreach ( $form as $step ) {
                                $str = benchmarkForm( $u, $str, $step );
                        }
                } else {
@@ -82,27 +83,29 @@ function benchmarkTest( &$u, $filename, $desc ) {
 
 function benchTime() {
        $st = explode( ' ', microtime() );
+
        return (float)$st[0] + (float)$st[1];
 }
 
 function benchmarkForm( &$u, &$data, $form ) {
        #$start = benchTime();
-       for( $i = 0; $i < BENCH_CYCLES; $i++ ) {
+       for ( $i = 0; $i < BENCH_CYCLES; $i++ ) {
                $start = benchTime();
                $out = $u->$form( $data, UtfNormal::$utfCanonicalDecomp );
-               $deltas[] = (benchTime() - $start);
+               $deltas[] = ( benchTime() - $start );
        }
        #$delta = (benchTime() - $start) / BENCH_CYCLES;
        sort( $deltas );
        $delta = $deltas[0]; # Take shortest time
 
        $rate = intval( strlen( $data ) / $delta );
-       $same = (0 == strcmp( $data, $out ) );
+       $same = ( 0 == strcmp( $data, $out ) );
 
        printf( " %20s %6.1fms %12s bytes/s (%s)\n",
                $form,
-               $delta*1000.0,
+               $delta * 1000.0,
                number_format( $rate ),
-               ($same ? 'no change' : 'changed' ) );
+               ( $same ? 'no change' : 'changed' ) );
+
        return $out;
 }
index 68cc1ef..5755f6b 100644 (file)
@@ -5,7 +5,8 @@
  *
  * @file
  */
+// @codingStandardsIgnoreFile
+
 UtfNormal::$utfCombiningClass = unserialize( 'a:606:{s:2:"̀";i:230;s:2:"́";i:230;s:2:"̂";i:230;s:2:"̃";i:230;s:2:"̄";i:230;s:2:"̅";i:230;s:2:"̆";i:230;s:2:"̇";i:230;s:2:"̈";i:230;s:2:"̉";i:230;s:2:"̊";i:230;s:2:"̋";i:230;s:2:"̌";i:230;s:2:"̍";i:230;s:2:"̎";i:230;s:2:"̏";i:230;s:2:"̐";i:230;s:2:"̑";i:230;s:2:"̒";i:230;s:2:"̓";i:230;s:2:"̔";i:230;s:2:"̕";i:232;s:2:"̖";i:220;s:2:"̗";i:220;s:2:"̘";i:220;s:2:"̙";i:220;s:2:"̚";i:232;s:2:"̛";i:216;s:2:"̜";i:220;s:2:"̝";i:220;s:2:"̞";i:220;s:2:"̟";i:220;s:2:"̠";i:220;s:2:"̡";i:202;s:2:"̢";i:202;s:2:"̣";i:220;s:2:"̤";i:220;s:2:"̥";i:220;s:2:"̦";i:220;s:2:"̧";i:202;s:2:"̨";i:202;s:2:"̩";i:220;s:2:"̪";i:220;s:2:"̫";i:220;s:2:"̬";i:220;s:2:"̭";i:220;s:2:"̮";i:220;s:2:"̯";i:220;s:2:"̰";i:220;s:2:"̱";i:220;s:2:"̲";i:220;s:2:"̳";i:220;s:2:"̴";i:1;s:2:"̵";i:1;s:2:"̶";i:1;s:2:"̷";i:1;s:2:"̸";i:1;s:2:"̹";i:220;s:2:"̺";i:220;s:2:"̻";i:220;s:2:"̼";i:220;s:2:"̽";i:230;s:2:"̾";i:230;s:2:"̿";i:230;s:2:"̀";i:230;s:2:"́";i:230;s:2:"͂";i:230;s:2:"̓";i:230;s:2:"̈́";i:230;s:2:"ͅ";i:240;s:2:"͆";i:230;s:2:"͇";i:220;s:2:"͈";i:220;s:2:"͉";i:220;s:2:"͊";i:230;s:2:"͋";i:230;s:2:"͌";i:230;s:2:"͍";i:220;s:2:"͎";i:220;s:2:"͐";i:230;s:2:"͑";i:230;s:2:"͒";i:230;s:2:"͓";i:220;s:2:"͔";i:220;s:2:"͕";i:220;s:2:"͖";i:220;s:2:"͗";i:230;s:2:"͘";i:232;s:2:"͙";i:220;s:2:"͚";i:220;s:2:"͛";i:230;s:2:"͜";i:233;s:2:"͝";i:234;s:2:"͞";i:234;s:2:"͟";i:233;s:2:"͠";i:234;s:2:"͡";i:234;s:2:"͢";i:233;s:2:"ͣ";i:230;s:2:"ͤ";i:230;s:2:"ͥ";i:230;s:2:"ͦ";i:230;s:2:"ͧ";i:230;s:2:"ͨ";i:230;s:2:"ͩ";i:230;s:2:"ͪ";i:230;s:2:"ͫ";i:230;s:2:"ͬ";i:230;s:2:"ͭ";i:230;s:2:"ͮ";i:230;s:2:"ͯ";i:230;s:2:"҃";i:230;s:2:"҄";i:230;s:2:"҅";i:230;s:2:"҆";i:230;s:2:"҇";i:230;s:2:"֑";i:220;s:2:"֒";i:230;s:2:"֓";i:230;s:2:"֔";i:230;s:2:"֕";i:230;s:2:"֖";i:220;s:2:"֗";i:230;s:2:"֘";i:230;s:2:"֙";i:230;s:2:"֚";i:222;s:2:"֛";i:220;s:2:"֜";i:230;s:2:"֝";i:230;s:2:"֞";i:230;s:2:"֟";i:230;s:2:"֠";i:230;s:2:"֡";i:230;s:2:"֢";i:220;s:2:"֣";i:220;s:2:"֤";i:220;s:2:"֥";i:220;s:2:"֦";i:220;s:2:"֧";i:220;s:2:"֨";i:230;s:2:"֩";i:230;s:2:"֪";i:220;s:2:"֫";i:230;s:2:"֬";i:230;s:2:"֭";i:222;s:2:"֮";i:228;s:2:"֯";i:230;s:2:"ְ";i:10;s:2:"ֱ";i:11;s:2:"ֲ";i:12;s:2:"ֳ";i:13;s:2:"ִ";i:14;s:2:"ֵ";i:15;s:2:"ֶ";i:16;s:2:"ַ";i:17;s:2:"ָ";i:18;s:2:"ֹ";i:19;s:2:"ֺ";i:19;s:2:"ֻ";i:20;s:2:"ּ";i:21;s:2:"ֽ";i:22;s:2:"ֿ";i:23;s:2:"ׁ";i:24;s:2:"ׂ";i:25;s:2:"ׄ";i:230;s:2:"ׅ";i:220;s:2:"ׇ";i:18;s:2:"ؐ";i:230;s:2:"ؑ";i:230;s:2:"ؒ";i:230;s:2:"ؓ";i:230;s:2:"ؔ";i:230;s:2:"ؕ";i:230;s:2:"ؖ";i:230;s:2:"ؗ";i:230;s:2:"ؘ";i:30;s:2:"ؙ";i:31;s:2:"ؚ";i:32;s:2:"ً";i:27;s:2:"ٌ";i:28;s:2:"ٍ";i:29;s:2:"َ";i:30;s:2:"ُ";i:31;s:2:"ِ";i:32;s:2:"ّ";i:33;s:2:"ْ";i:34;s:2:"ٓ";i:230;s:2:"ٔ";i:230;s:2:"ٕ";i:220;s:2:"ٖ";i:220;s:2:"ٗ";i:230;s:2:"٘";i:230;s:2:"ٙ";i:230;s:2:"ٚ";i:230;s:2:"ٛ";i:230;s:2:"ٜ";i:220;s:2:"ٝ";i:230;s:2:"ٞ";i:230;s:2:"ٟ";i:220;s:2:"ٰ";i:35;s:2:"ۖ";i:230;s:2:"ۗ";i:230;s:2:"ۘ";i:230;s:2:"ۙ";i:230;s:2:"ۚ";i:230;s:2:"ۛ";i:230;s:2:"ۜ";i:230;s:2:"۟";i:230;s:2:"۠";i:230;s:2:"ۡ";i:230;s:2:"ۢ";i:230;s:2:"ۣ";i:220;s:2:"ۤ";i:230;s:2:"ۧ";i:230;s:2:"ۨ";i:230;s:2:"۪";i:220;s:2:"۫";i:230;s:2:"۬";i:230;s:2:"ۭ";i:220;s:2:"ܑ";i:36;s:2:"ܰ";i:230;s:2:"ܱ";i:220;s:2:"ܲ";i:230;s:2:"ܳ";i:230;s:2:"ܴ";i:220;s:2:"ܵ";i:230;s:2:"ܶ";i:230;s:2:"ܷ";i:220;s:2:"ܸ";i:220;s:2:"ܹ";i:220;s:2:"ܺ";i:230;s:2:"ܻ";i:220;s:2:"ܼ";i:220;s:2:"ܽ";i:230;s:2:"ܾ";i:220;s:2:"ܿ";i:230;s:2:"݀";i:230;s:2:"݁";i:230;s:2:"݂";i:220;s:2:"݃";i:230;s:2:"݄";i:220;s:2:"݅";i:230;s:2:"݆";i:220;s:2:"݇";i:230;s:2:"݈";i:220;s:2:"݉";i:230;s:2:"݊";i:230;s:2:"߫";i:230;s:2:"߬";i:230;s:2:"߭";i:230;s:2:"߮";i:230;s:2:"߯";i:230;s:2:"߰";i:230;s:2:"߱";i:230;s:2:"߲";i:220;s:2:"߳";i:230;s:3:"ࠖ";i:230;s:3:"ࠗ";i:230;s:3:"࠘";i:230;s:3:"࠙";i:230;s:3:"ࠛ";i:230;s:3:"ࠜ";i:230;s:3:"ࠝ";i:230;s:3:"ࠞ";i:230;s:3:"ࠟ";i:230;s:3:"ࠠ";i:230;s:3:"ࠡ";i:230;s:3:"ࠢ";i:230;s:3:"ࠣ";i:230;s:3:"ࠥ";i:230;s:3:"ࠦ";i:230;s:3:"ࠧ";i:230;s:3:"ࠩ";i:230;s:3:"ࠪ";i:230;s:3:"ࠫ";i:230;s:3:"ࠬ";i:230;s:3:"࠭";i:230;s:3:"࡙";i:220;s:3:"࡚";i:220;s:3:"࡛";i:220;s:3:"़";i:7;s:3:"्";i:9;s:3:"॑";i:230;s:3:"॒";i:220;s:3:"॓";i:230;s:3:"॔";i:230;s:3:"়";i:7;s:3:"্";i:9;s:3:"਼";i:7;s:3:"੍";i:9;s:3:"઼";i:7;s:3:"્";i:9;s:3:"଼";i:7;s:3:"୍";i:9;s:3:"்";i:9;s:3:"్";i:9;s:3:"ౕ";i:84;s:3:"ౖ";i:91;s:3:"಼";i:7;s:3:"್";i:9;s:3:"്";i:9;s:3:"්";i:9;s:3:"ุ";i:103;s:3:"ู";i:103;s:3:"ฺ";i:9;s:3:"่";i:107;s:3:"้";i:107;s:3:"๊";i:107;s:3:"๋";i:107;s:3:"ຸ";i:118;s:3:"ູ";i:118;s:3:"່";i:122;s:3:"້";i:122;s:3:"໊";i:122;s:3:"໋";i:122;s:3:"༘";i:220;s:3:"༙";i:220;s:3:"༵";i:220;s:3:"༷";i:220;s:3:"༹";i:216;s:3:"ཱ";i:129;s:3:"ི";i:130;s:3:"ུ";i:132;s:3:"ེ";i:130;s:3:"ཻ";i:130;s:3:"ོ";i:130;s:3:"ཽ";i:130;s:3:"ྀ";i:130;s:3:"ྂ";i:230;s:3:"ྃ";i:230;s:3:"྄";i:9;s:3:"྆";i:230;s:3:"྇";i:230;s:3:"࿆";i:220;s:3:"့";i:7;s:3:"္";i:9;s:3:"်";i:9;s:3:"ႍ";i:220;s:3:"፝";i:230;s:3:"፞";i:230;s:3:"፟";i:230;s:3:"᜔";i:9;s:3:"᜴";i:9;s:3:"្";i:9;s:3:"៝";i:230;s:3:"ᢩ";i:228;s:3:"᤹";i:222;s:3:"᤺";i:230;s:3:"᤻";i:220;s:3:"ᨗ";i:230;s:3:"ᨘ";i:220;s:3:"᩠";i:9;s:3:"᩵";i:230;s:3:"᩶";i:230;s:3:"᩷";i:230;s:3:"᩸";i:230;s:3:"᩹";i:230;s:3:"᩺";i:230;s:3:"᩻";i:230;s:3:"᩼";i:230;s:3:"᩿";i:220;s:3:"᬴";i:7;s:3:"᭄";i:9;s:3:"᭫";i:230;s:3:"᭬";i:220;s:3:"᭭";i:230;s:3:"᭮";i:230;s:3:"᭯";i:230;s:3:"᭰";i:230;s:3:"᭱";i:230;s:3:"᭲";i:230;s:3:"᭳";i:230;s:3:"᮪";i:9;s:3:"᯦";i:7;s:3:"᯲";i:9;s:3:"᯳";i:9;s:3:"᰷";i:7;s:3:"᳐";i:230;s:3:"᳑";i:230;s:3:"᳒";i:230;s:3:"᳔";i:1;s:3:"᳕";i:220;s:3:"᳖";i:220;s:3:"᳗";i:220;s:3:"᳘";i:220;s:3:"᳙";i:220;s:3:"᳚";i:230;s:3:"᳛";i:230;s:3:"᳜";i:220;s:3:"᳝";i:220;s:3:"᳞";i:220;s:3:"᳟";i:220;s:3:"᳠";i:230;s:3:"᳢";i:1;s:3:"᳣";i:1;s:3:"᳤";i:1;s:3:"᳥";i:1;s:3:"᳦";i:1;s:3:"᳧";i:1;s:3:"᳨";i:1;s:3:"᳭";i:220;s:3:"᷀";i:230;s:3:"᷁";i:230;s:3:"᷂";i:220;s:3:"᷃";i:230;s:3:"᷄";i:230;s:3:"᷅";i:230;s:3:"᷆";i:230;s:3:"᷇";i:230;s:3:"᷈";i:230;s:3:"᷉";i:230;s:3:"᷊";i:220;s:3:"᷋";i:230;s:3:"᷌";i:230;s:3:"᷍";i:234;s:3:"᷎";i:214;s:3:"᷏";i:220;s:3:"᷐";i:202;s:3:"᷑";i:230;s:3:"᷒";i:230;s:3:"ᷓ";i:230;s:3:"ᷔ";i:230;s:3:"ᷕ";i:230;s:3:"ᷖ";i:230;s:3:"ᷗ";i:230;s:3:"ᷘ";i:230;s:3:"ᷙ";i:230;s:3:"ᷚ";i:230;s:3:"ᷛ";i:230;s:3:"ᷜ";i:230;s:3:"ᷝ";i:230;s:3:"ᷞ";i:230;s:3:"ᷟ";i:230;s:3:"ᷠ";i:230;s:3:"ᷡ";i:230;s:3:"ᷢ";i:230;s:3:"ᷣ";i:230;s:3:"ᷤ";i:230;s:3:"ᷥ";i:230;s:3:"ᷦ";i:230;s:3:"᷼";i:233;s:3:"᷽";i:220;s:3:"᷾";i:230;s:3:"᷿";i:220;s:3:"⃐";i:230;s:3:"⃑";i:230;s:3:"⃒";i:1;s:3:"⃓";i:1;s:3:"⃔";i:230;s:3:"⃕";i:230;s:3:"⃖";i:230;s:3:"⃗";i:230;s:3:"⃘";i:1;s:3:"⃙";i:1;s:3:"⃚";i:1;s:3:"⃛";i:230;s:3:"⃜";i:230;s:3:"⃡";i:230;s:3:"⃥";i:1;s:3:"⃦";i:1;s:3:"⃧";i:230;s:3:"⃨";i:220;s:3:"⃩";i:230;s:3:"⃪";i:1;s:3:"⃫";i:1;s:3:"⃬";i:220;s:3:"⃭";i:220;s:3:"⃮";i:220;s:3:"⃯";i:220;s:3:"⃰";i:230;s:3:"⳯";i:230;s:3:"⳰";i:230;s:3:"⳱";i:230;s:3:"⵿";i:9;s:3:"ⷠ";i:230;s:3:"ⷡ";i:230;s:3:"ⷢ";i:230;s:3:"ⷣ";i:230;s:3:"ⷤ";i:230;s:3:"ⷥ";i:230;s:3:"ⷦ";i:230;s:3:"ⷧ";i:230;s:3:"ⷨ";i:230;s:3:"ⷩ";i:230;s:3:"ⷪ";i:230;s:3:"ⷫ";i:230;s:3:"ⷬ";i:230;s:3:"ⷭ";i:230;s:3:"ⷮ";i:230;s:3:"ⷯ";i:230;s:3:"ⷰ";i:230;s:3:"ⷱ";i:230;s:3:"ⷲ";i:230;s:3:"ⷳ";i:230;s:3:"ⷴ";i:230;s:3:"ⷵ";i:230;s:3:"ⷶ";i:230;s:3:"ⷷ";i:230;s:3:"ⷸ";i:230;s:3:"ⷹ";i:230;s:3:"ⷺ";i:230;s:3:"ⷻ";i:230;s:3:"ⷼ";i:230;s:3:"ⷽ";i:230;s:3:"ⷾ";i:230;s:3:"ⷿ";i:230;s:3:"〪";i:218;s:3:"〫";i:228;s:3:"〬";i:232;s:3:"〭";i:222;s:3:"〮";i:224;s:3:"〯";i:224;s:3:"゙";i:8;s:3:"゚";i:8;s:3:"꙯";i:230;s:3:"꙼";i:230;s:3:"꙽";i:230;s:3:"꛰";i:230;s:3:"꛱";i:230;s:3:"꠆";i:9;s:3:"꣄";i:9;s:3:"꣠";i:230;s:3:"꣡";i:230;s:3:"꣢";i:230;s:3:"꣣";i:230;s:3:"꣤";i:230;s:3:"꣥";i:230;s:3:"꣦";i:230;s:3:"꣧";i:230;s:3:"꣨";i:230;s:3:"꣩";i:230;s:3:"꣪";i:230;s:3:"꣫";i:230;s:3:"꣬";i:230;s:3:"꣭";i:230;s:3:"꣮";i:230;s:3:"꣯";i:230;s:3:"꣰";i:230;s:3:"꣱";i:230;s:3:"꤫";i:220;s:3:"꤬";i:220;s:3:"꤭";i:220;s:3:"꥓";i:9;s:3:"꦳";i:7;s:3:"꧀";i:9;s:3:"ꪰ";i:230;s:3:"ꪲ";i:230;s:3:"ꪳ";i:230;s:3:"ꪴ";i:220;s:3:"ꪷ";i:230;s:3:"ꪸ";i:230;s:3:"ꪾ";i:230;s:3:"꪿";i:230;s:3:"꫁";i:230;s:3:"꯭";i:9;s:3:"ﬞ";i:26;s:3:"︠";i:230;s:3:"︡";i:230;s:3:"︢";i:230;s:3:"︣";i:230;s:3:"︤";i:230;s:3:"︥";i:230;s:3:"︦";i:230;s:4:"𐇽";i:220;s:4:"𐨍";i:220;s:4:"𐨏";i:230;s:4:"𐨸";i:230;s:4:"𐨹";i:1;s:4:"𐨺";i:220;s:4:"𐨿";i:9;s:4:"𑁆";i:9;s:4:"𑂹";i:9;s:4:"𑂺";i:7;s:4:"𝅥";i:216;s:4:"𝅦";i:216;s:4:"𝅧";i:1;s:4:"𝅨";i:1;s:4:"𝅩";i:1;s:4:"𝅭";i:226;s:4:"𝅮";i:216;s:4:"𝅯";i:216;s:4:"𝅰";i:216;s:4:"𝅱";i:216;s:4:"𝅲";i:216;s:4:"𝅻";i:220;s:4:"𝅼";i:220;s:4:"𝅽";i:220;s:4:"𝅾";i:220;s:4:"𝅿";i:220;s:4:"𝆀";i:220;s:4:"𝆁";i:220;s:4:"𝆂";i:220;s:4:"𝆅";i:230;s:4:"𝆆";i:230;s:4:"𝆇";i:230;s:4:"𝆈";i:230;s:4:"𝆉";i:230;s:4:"𝆊";i:220;s:4:"𝆋";i:220;s:4:"𝆪";i:230;s:4:"𝆫";i:230;s:4:"𝆬";i:230;s:4:"𝆭";i:230;s:4:"𝉂";i:230;s:4:"𝉃";i:230;s:4:"𝉄";i:230;}' );
 UtfNormal::$utfCanonicalComp = unserialize( 'a:1868:{s:3:"À";s:2:"À";s:3:"Á";s:2:"Á";s:3:"Â";s:2:"Â";s:3:"Ã";s:2:"Ã";s:3:"Ä";s:2:"Ä";s:3:"Å";s:2:"Å";s:3:"Ç";s:2:"Ç";s:3:"È";s:2:"È";s:3:"É";s:2:"É";s:3:"Ê";s:2:"Ê";s:3:"Ë";s:2:"Ë";s:3:"Ì";s:2:"Ì";s:3:"Í";s:2:"Í";s:3:"Î";s:2:"Î";s:3:"Ï";s:2:"Ï";s:3:"Ñ";s:2:"Ñ";s:3:"Ò";s:2:"Ò";s:3:"Ó";s:2:"Ó";s:3:"Ô";s:2:"Ô";s:3:"Õ";s:2:"Õ";s:3:"Ö";s:2:"Ö";s:3:"Ù";s:2:"Ù";s:3:"Ú";s:2:"Ú";s:3:"Û";s:2:"Û";s:3:"Ü";s:2:"Ü";s:3:"Ý";s:2:"Ý";s:3:"à";s:2:"à";s:3:"á";s:2:"á";s:3:"â";s:2:"â";s:3:"ã";s:2:"ã";s:3:"ä";s:2:"ä";s:3:"å";s:2:"å";s:3:"ç";s:2:"ç";s:3:"è";s:2:"è";s:3:"é";s:2:"é";s:3:"ê";s:2:"ê";s:3:"ë";s:2:"ë";s:3:"ì";s:2:"ì";s:3:"í";s:2:"í";s:3:"î";s:2:"î";s:3:"ï";s:2:"ï";s:3:"ñ";s:2:"ñ";s:3:"ò";s:2:"ò";s:3:"ó";s:2:"ó";s:3:"ô";s:2:"ô";s:3:"õ";s:2:"õ";s:3:"ö";s:2:"ö";s:3:"ù";s:2:"ù";s:3:"ú";s:2:"ú";s:3:"û";s:2:"û";s:3:"ü";s:2:"ü";s:3:"ý";s:2:"ý";s:3:"ÿ";s:2:"ÿ";s:3:"Ā";s:2:"Ā";s:3:"ā";s:2:"ā";s:3:"Ă";s:2:"Ă";s:3:"ă";s:2:"ă";s:3:"Ą";s:2:"Ą";s:3:"ą";s:2:"ą";s:3:"Ć";s:2:"Ć";s:3:"ć";s:2:"ć";s:3:"Ĉ";s:2:"Ĉ";s:3:"ĉ";s:2:"ĉ";s:3:"Ċ";s:2:"Ċ";s:3:"ċ";s:2:"ċ";s:3:"Č";s:2:"Č";s:3:"č";s:2:"č";s:3:"Ď";s:2:"Ď";s:3:"ď";s:2:"ď";s:3:"Ē";s:2:"Ē";s:3:"ē";s:2:"ē";s:3:"Ĕ";s:2:"Ĕ";s:3:"ĕ";s:2:"ĕ";s:3:"Ė";s:2:"Ė";s:3:"ė";s:2:"ė";s:3:"Ę";s:2:"Ę";s:3:"ę";s:2:"ę";s:3:"Ě";s:2:"Ě";s:3:"ě";s:2:"ě";s:3:"Ĝ";s:2:"Ĝ";s:3:"ĝ";s:2:"ĝ";s:3:"Ğ";s:2:"Ğ";s:3:"ğ";s:2:"ğ";s:3:"Ġ";s:2:"Ġ";s:3:"ġ";s:2:"ġ";s:3:"Ģ";s:2:"Ģ";s:3:"ģ";s:2:"ģ";s:3:"Ĥ";s:2:"Ĥ";s:3:"ĥ";s:2:"ĥ";s:3:"Ĩ";s:2:"Ĩ";s:3:"ĩ";s:2:"ĩ";s:3:"Ī";s:2:"Ī";s:3:"ī";s:2:"ī";s:3:"Ĭ";s:2:"Ĭ";s:3:"ĭ";s:2:"ĭ";s:3:"Į";s:2:"Į";s:3:"į";s:2:"į";s:3:"İ";s:2:"İ";s:3:"Ĵ";s:2:"Ĵ";s:3:"ĵ";s:2:"ĵ";s:3:"Ķ";s:2:"Ķ";s:3:"ķ";s:2:"ķ";s:3:"Ĺ";s:2:"Ĺ";s:3:"ĺ";s:2:"ĺ";s:3:"Ļ";s:2:"Ļ";s:3:"ļ";s:2:"ļ";s:3:"Ľ";s:2:"Ľ";s:3:"ľ";s:2:"ľ";s:3:"Ń";s:2:"Ń";s:3:"ń";s:2:"ń";s:3:"Ņ";s:2:"Ņ";s:3:"ņ";s:2:"ņ";s:3:"Ň";s:2:"Ň";s:3:"ň";s:2:"ň";s:3:"Ō";s:2:"Ō";s:3:"ō";s:2:"ō";s:3:"Ŏ";s:2:"Ŏ";s:3:"ŏ";s:2:"ŏ";s:3:"Ő";s:2:"Ő";s:3:"ő";s:2:"ő";s:3:"Ŕ";s:2:"Ŕ";s:3:"ŕ";s:2:"ŕ";s:3:"Ŗ";s:2:"Ŗ";s:3:"ŗ";s:2:"ŗ";s:3:"Ř";s:2:"Ř";s:3:"ř";s:2:"ř";s:3:"Ś";s:2:"Ś";s:3:"ś";s:2:"ś";s:3:"Ŝ";s:2:"Ŝ";s:3:"ŝ";s:2:"ŝ";s:3:"Ş";s:2:"Ş";s:3:"ş";s:2:"ş";s:3:"Š";s:2:"Š";s:3:"š";s:2:"š";s:3:"Ţ";s:2:"Ţ";s:3:"ţ";s:2:"ţ";s:3:"Ť";s:2:"Ť";s:3:"ť";s:2:"ť";s:3:"Ũ";s:2:"Ũ";s:3:"ũ";s:2:"ũ";s:3:"Ū";s:2:"Ū";s:3:"ū";s:2:"ū";s:3:"Ŭ";s:2:"Ŭ";s:3:"ŭ";s:2:"ŭ";s:3:"Ů";s:2:"Ů";s:3:"ů";s:2:"ů";s:3:"Ű";s:2:"Ű";s:3:"ű";s:2:"ű";s:3:"Ų";s:2:"Ų";s:3:"ų";s:2:"ų";s:3:"Ŵ";s:2:"Ŵ";s:3:"ŵ";s:2:"ŵ";s:3:"Ŷ";s:2:"Ŷ";s:3:"ŷ";s:2:"ŷ";s:3:"Ÿ";s:2:"Ÿ";s:3:"Ź";s:2:"Ź";s:3:"ź";s:2:"ź";s:3:"Ż";s:2:"Ż";s:3:"ż";s:2:"ż";s:3:"Ž";s:2:"Ž";s:3:"ž";s:2:"ž";s:3:"Ơ";s:2:"Ơ";s:3:"ơ";s:2:"ơ";s:3:"Ư";s:2:"Ư";s:3:"ư";s:2:"ư";s:3:"Ǎ";s:2:"Ǎ";s:3:"ǎ";s:2:"ǎ";s:3:"Ǐ";s:2:"Ǐ";s:3:"ǐ";s:2:"ǐ";s:3:"Ǒ";s:2:"Ǒ";s:3:"ǒ";s:2:"ǒ";s:3:"Ǔ";s:2:"Ǔ";s:3:"ǔ";s:2:"ǔ";s:4:"Ǖ";s:2:"Ǖ";s:4:"ǖ";s:2:"ǖ";s:4:"Ǘ";s:2:"Ǘ";s:4:"ǘ";s:2:"ǘ";s:4:"Ǚ";s:2:"Ǚ";s:4:"ǚ";s:2:"ǚ";s:4:"Ǜ";s:2:"Ǜ";s:4:"ǜ";s:2:"ǜ";s:4:"Ǟ";s:2:"Ǟ";s:4:"ǟ";s:2:"ǟ";s:4:"Ǡ";s:2:"Ǡ";s:4:"ǡ";s:2:"ǡ";s:4:"Ǣ";s:2:"Ǣ";s:4:"ǣ";s:2:"ǣ";s:3:"Ǧ";s:2:"Ǧ";s:3:"ǧ";s:2:"ǧ";s:3:"Ǩ";s:2:"Ǩ";s:3:"ǩ";s:2:"ǩ";s:3:"Ǫ";s:2:"Ǫ";s:3:"ǫ";s:2:"ǫ";s:4:"Ǭ";s:2:"Ǭ";s:4:"ǭ";s:2:"ǭ";s:4:"Ǯ";s:2:"Ǯ";s:4:"ǯ";s:2:"ǯ";s:3:"ǰ";s:2:"ǰ";s:3:"Ǵ";s:2:"Ǵ";s:3:"ǵ";s:2:"ǵ";s:3:"Ǹ";s:2:"Ǹ";s:3:"ǹ";s:2:"ǹ";s:4:"Ǻ";s:2:"Ǻ";s:4:"ǻ";s:2:"ǻ";s:4:"Ǽ";s:2:"Ǽ";s:4:"ǽ";s:2:"ǽ";s:4:"Ǿ";s:2:"Ǿ";s:4:"ǿ";s:2:"ǿ";s:3:"Ȁ";s:2:"Ȁ";s:3:"ȁ";s:2:"ȁ";s:3:"Ȃ";s:2:"Ȃ";s:3:"ȃ";s:2:"ȃ";s:3:"Ȅ";s:2:"Ȅ";s:3:"ȅ";s:2:"ȅ";s:3:"Ȇ";s:2:"Ȇ";s:3:"ȇ";s:2:"ȇ";s:3:"Ȉ";s:2:"Ȉ";s:3:"ȉ";s:2:"ȉ";s:3:"Ȋ";s:2:"Ȋ";s:3:"ȋ";s:2:"ȋ";s:3:"Ȍ";s:2:"Ȍ";s:3:"ȍ";s:2:"ȍ";s:3:"Ȏ";s:2:"Ȏ";s:3:"ȏ";s:2:"ȏ";s:3:"Ȑ";s:2:"Ȑ";s:3:"ȑ";s:2:"ȑ";s:3:"Ȓ";s:2:"Ȓ";s:3:"ȓ";s:2:"ȓ";s:3:"Ȕ";s:2:"Ȕ";s:3:"ȕ";s:2:"ȕ";s:3:"Ȗ";s:2:"Ȗ";s:3:"ȗ";s:2:"ȗ";s:3:"Ș";s:2:"Ș";s:3:"ș";s:2:"ș";s:3:"Ț";s:2:"Ț";s:3:"ț";s:2:"ț";s:3:"Ȟ";s:2:"Ȟ";s:3:"ȟ";s:2:"ȟ";s:3:"Ȧ";s:2:"Ȧ";s:3:"ȧ";s:2:"ȧ";s:3:"Ȩ";s:2:"Ȩ";s:3:"ȩ";s:2:"ȩ";s:4:"Ȫ";s:2:"Ȫ";s:4:"ȫ";s:2:"ȫ";s:4:"Ȭ";s:2:"Ȭ";s:4:"ȭ";s:2:"ȭ";s:3:"Ȯ";s:2:"Ȯ";s:3:"ȯ";s:2:"ȯ";s:4:"Ȱ";s:2:"Ȱ";s:4:"ȱ";s:2:"ȱ";s:3:"Ȳ";s:2:"Ȳ";s:3:"ȳ";s:2:"ȳ";s:2:"̀";s:2:"̀";s:2:"́";s:2:"́";s:2:"̓";s:2:"̓";s:4:"̈́";s:2:"̈́";s:2:"ʹ";s:2:"ʹ";s:1:";";s:2:";";s:4:"΅";s:2:"΅";s:4:"Ά";s:2:"Ά";s:2:"·";s:2:"·";s:4:"Έ";s:2:"Έ";s:4:"Ή";s:2:"Ή";s:4:"Ί";s:2:"Ί";s:4:"Ό";s:2:"Ό";s:4:"Ύ";s:2:"Ύ";s:4:"Ώ";s:2:"Ώ";s:4:"ΐ";s:2:"ΐ";s:4:"Ϊ";s:2:"Ϊ";s:4:"Ϋ";s:2:"Ϋ";s:4:"ά";s:2:"ά";s:4:"έ";s:2:"έ";s:4:"ή";s:2:"ή";s:4:"ί";s:2:"ί";s:4:"ΰ";s:2:"ΰ";s:4:"ϊ";s:2:"ϊ";s:4:"ϋ";s:2:"ϋ";s:4:"ό";s:2:"ό";s:4:"ύ";s:2:"ύ";s:4:"ώ";s:2:"ώ";s:4:"ϓ";s:2:"ϓ";s:4:"ϔ";s:2:"ϔ";s:4:"Ѐ";s:2:"Ѐ";s:4:"Ё";s:2:"Ё";s:4:"Ѓ";s:2:"Ѓ";s:4:"Ї";s:2:"Ї";s:4:"Ќ";s:2:"Ќ";s:4:"Ѝ";s:2:"Ѝ";s:4:"Ў";s:2:"Ў";s:4:"Й";s:2:"Й";s:4:"й";s:2:"й";s:4:"ѐ";s:2:"ѐ";s:4:"ё";s:2:"ё";s:4:"ѓ";s:2:"ѓ";s:4:"ї";s:2:"ї";s:4:"ќ";s:2:"ќ";s:4:"ѝ";s:2:"ѝ";s:4:"ў";s:2:"ў";s:4:"Ѷ";s:2:"Ѷ";s:4:"ѷ";s:2:"ѷ";s:4:"Ӂ";s:2:"Ӂ";s:4:"ӂ";s:2:"ӂ";s:4:"Ӑ";s:2:"Ӑ";s:4:"ӑ";s:2:"ӑ";s:4:"Ӓ";s:2:"Ӓ";s:4:"ӓ";s:2:"ӓ";s:4:"Ӗ";s:2:"Ӗ";s:4:"ӗ";s:2:"ӗ";s:4:"Ӛ";s:2:"Ӛ";s:4:"ӛ";s:2:"ӛ";s:4:"Ӝ";s:2:"Ӝ";s:4:"ӝ";s:2:"ӝ";s:4:"Ӟ";s:2:"Ӟ";s:4:"ӟ";s:2:"ӟ";s:4:"Ӣ";s:2:"Ӣ";s:4:"ӣ";s:2:"ӣ";s:4:"Ӥ";s:2:"Ӥ";s:4:"ӥ";s:2:"ӥ";s:4:"Ӧ";s:2:"Ӧ";s:4:"ӧ";s:2:"ӧ";s:4:"Ӫ";s:2:"Ӫ";s:4:"ӫ";s:2:"ӫ";s:4:"Ӭ";s:2:"Ӭ";s:4:"ӭ";s:2:"ӭ";s:4:"Ӯ";s:2:"Ӯ";s:4:"ӯ";s:2:"ӯ";s:4:"Ӱ";s:2:"Ӱ";s:4:"ӱ";s:2:"ӱ";s:4:"Ӳ";s:2:"Ӳ";s:4:"ӳ";s:2:"ӳ";s:4:"Ӵ";s:2:"Ӵ";s:4:"ӵ";s:2:"ӵ";s:4:"Ӹ";s:2:"Ӹ";s:4:"ӹ";s:2:"ӹ";s:4:"آ";s:2:"آ";s:4:"أ";s:2:"أ";s:4:"ؤ";s:2:"ؤ";s:4:"إ";s:2:"إ";s:4:"ئ";s:2:"ئ";s:4:"ۀ";s:2:"ۀ";s:4:"ۂ";s:2:"ۂ";s:4:"ۓ";s:2:"ۓ";s:6:"ऩ";s:3:"ऩ";s:6:"ऱ";s:3:"ऱ";s:6:"ऴ";s:3:"ऴ";s:6:"ো";s:3:"ো";s:6:"ৌ";s:3:"ৌ";s:6:"ୈ";s:3:"ୈ";s:6:"ୋ";s:3:"ୋ";s:6:"ୌ";s:3:"ୌ";s:6:"ஔ";s:3:"ஔ";s:6:"ொ";s:3:"ொ";s:6:"ோ";s:3:"ோ";s:6:"ௌ";s:3:"ௌ";s:6:"ై";s:3:"ై";s:6:"ೀ";s:3:"ೀ";s:6:"ೇ";s:3:"ೇ";s:6:"ೈ";s:3:"ೈ";s:6:"ೊ";s:3:"ೊ";s:6:"ೋ";s:3:"ೋ";s:6:"ൊ";s:3:"ൊ";s:6:"ോ";s:3:"ോ";s:6:"ൌ";s:3:"ൌ";s:6:"ේ";s:3:"ේ";s:6:"ො";s:3:"ො";s:6:"ෝ";s:3:"ෝ";s:6:"ෞ";s:3:"ෞ";s:6:"ཱི";s:3:"ཱི";s:6:"ཱུ";s:3:"ཱུ";s:6:"ཱྀ";s:3:"ཱྀ";s:6:"ဦ";s:3:"ဦ";s:6:"ᬆ";s:3:"ᬆ";s:6:"ᬈ";s:3:"ᬈ";s:6:"ᬊ";s:3:"ᬊ";s:6:"ᬌ";s:3:"ᬌ";s:6:"ᬎ";s:3:"ᬎ";s:6:"ᬒ";s:3:"ᬒ";s:6:"ᬻ";s:3:"ᬻ";s:6:"ᬽ";s:3:"ᬽ";s:6:"ᭀ";s:3:"ᭀ";s:6:"ᭁ";s:3:"ᭁ";s:6:"ᭃ";s:3:"ᭃ";s:3:"Ḁ";s:3:"Ḁ";s:3:"ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"Ḅ";s:3:"ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:4:"Ḉ";s:3:"Ḉ";s:4:"ḉ";s:3:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"Ḍ";s:3:"ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"Ḓ";s:3:"ḓ";s:3:"ḓ";s:4:"Ḕ";s:3:"Ḕ";s:4:"ḕ";s:3:"ḕ";s:4:"Ḗ";s:3:"Ḗ";s:4:"ḗ";s:3:"ḗ";s:3:"Ḙ";s:3:"Ḙ";s:3:"ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:4:"Ḝ";s:3:"Ḝ";s:4:"ḝ";s:3:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"Ḡ";s:3:"ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"Ḥ";s:3:"ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"Ḫ";s:3:"ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:4:"Ḯ";s:3:"Ḯ";s:4:"ḯ";s:3:"ḯ";s:3:"Ḱ";s:3:"Ḱ";s:3:"ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"Ḳ";s:3:"ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"Ḷ";s:3:"ḷ";s:3:"ḷ";s:5:"Ḹ";s:3:"Ḹ";s:5:"ḹ";s:3:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"Ḽ";s:3:"ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"Ḿ";s:3:"ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"Ṁ";s:3:"ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"Ṃ";s:3:"ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"Ṇ";s:3:"ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"Ṋ";s:3:"ṋ";s:3:"ṋ";s:4:"Ṍ";s:3:"Ṍ";s:4:"ṍ";s:3:"ṍ";s:4:"Ṏ";s:3:"Ṏ";s:4:"ṏ";s:3:"ṏ";s:4:"Ṑ";s:3:"Ṑ";s:4:"ṑ";s:3:"ṑ";s:4:"Ṓ";s:3:"Ṓ";s:4:"ṓ";s:3:"ṓ";s:3:"Ṕ";s:3:"Ṕ";s:3:"ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"Ṗ";s:3:"ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"Ṛ";s:3:"ṛ";s:3:"ṛ";s:5:"Ṝ";s:3:"Ṝ";s:5:"ṝ";s:3:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"Ṣ";s:3:"ṣ";s:3:"ṣ";s:4:"Ṥ";s:3:"Ṥ";s:4:"ṥ";s:3:"ṥ";s:4:"Ṧ";s:3:"Ṧ";s:4:"ṧ";s:3:"ṧ";s:5:"Ṩ";s:3:"Ṩ";s:5:"ṩ";s:3:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"Ṭ";s:3:"ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"Ṱ";s:3:"ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"Ṳ";s:3:"ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"Ṵ";s:3:"ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"Ṷ";s:3:"ṷ";s:3:"ṷ";s:4:"Ṹ";s:3:"Ṹ";s:4:"ṹ";s:3:"ṹ";s:4:"Ṻ";s:3:"Ṻ";s:4:"ṻ";s:3:"ṻ";s:3:"Ṽ";s:3:"Ṽ";s:3:"ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"Ṿ";s:3:"ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"Ẁ";s:3:"ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"Ẃ";s:3:"ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"Ẉ";s:3:"ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"Ẑ";s:3:"ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"Ẓ";s:3:"ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"ẘ";s:3:"ẙ";s:3:"ẙ";s:4:"ẛ";s:3:"ẛ";s:3:"Ạ";s:3:"Ạ";s:3:"ạ";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:4:"Ấ";s:3:"Ấ";s:4:"ấ";s:3:"ấ";s:4:"Ầ";s:3:"Ầ";s:4:"ầ";s:3:"ầ";s:4:"Ẩ";s:3:"Ẩ";s:4:"ẩ";s:3:"ẩ";s:4:"Ẫ";s:3:"Ẫ";s:4:"ẫ";s:3:"ẫ";s:5:"Ậ";s:3:"Ậ";s:5:"ậ";s:3:"ậ";s:4:"Ắ";s:3:"Ắ";s:4:"ắ";s:3:"ắ";s:4:"Ằ";s:3:"Ằ";s:4:"ằ";s:3:"ằ";s:4:"Ẳ";s:3:"Ẳ";s:4:"ẳ";s:3:"ẳ";s:4:"Ẵ";s:3:"Ẵ";s:4:"ẵ";s:3:"ẵ";s:5:"Ặ";s:3:"Ặ";s:5:"ặ";s:3:"ặ";s:3:"Ẹ";s:3:"Ẹ";s:3:"ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:4:"Ế";s:3:"Ế";s:4:"ế";s:3:"ế";s:4:"Ề";s:3:"Ề";s:4:"ề";s:3:"ề";s:4:"Ể";s:3:"Ể";s:4:"ể";s:3:"ể";s:4:"Ễ";s:3:"Ễ";s:4:"ễ";s:3:"ễ";s:5:"Ệ";s:3:"Ệ";s:5:"ệ";s:3:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"Ị";s:3:"ị";s:3:"ị";s:3:"Ọ";s:3:"Ọ";s:3:"ọ";s:3:"ọ";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"ỏ";s:4:"Ố";s:3:"Ố";s:4:"ố";s:3:"ố";s:4:"Ồ";s:3:"Ồ";s:4:"ồ";s:3:"ồ";s:4:"Ổ";s:3:"Ổ";s:4:"ổ";s:3:"ổ";s:4:"Ỗ";s:3:"Ỗ";s:4:"ỗ";s:3:"ỗ";s:5:"Ộ";s:3:"Ộ";s:5:"ộ";s:3:"ộ";s:4:"Ớ";s:3:"Ớ";s:4:"ớ";s:3:"ớ";s:4:"Ờ";s:3:"Ờ";s:4:"ờ";s:3:"ờ";s:4:"Ở";s:3:"Ở";s:4:"ở";s:3:"ở";s:4:"Ỡ";s:3:"Ỡ";s:4:"ỡ";s:3:"ỡ";s:4:"Ợ";s:3:"Ợ";s:4:"ợ";s:3:"ợ";s:3:"Ụ";s:3:"Ụ";s:3:"ụ";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:4:"Ứ";s:3:"Ứ";s:4:"ứ";s:3:"ứ";s:4:"Ừ";s:3:"Ừ";s:4:"ừ";s:3:"ừ";s:4:"Ử";s:3:"Ử";s:4:"ử";s:3:"ử";s:4:"Ữ";s:3:"Ữ";s:4:"ữ";s:3:"ữ";s:4:"Ự";s:3:"Ự";s:4:"ự";s:3:"ự";s:3:"Ỳ";s:3:"Ỳ";s:3:"ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"Ỵ";s:3:"ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:4:"ἀ";s:3:"ἀ";s:4:"ἁ";s:3:"ἁ";s:5:"ἂ";s:3:"ἂ";s:5:"ἃ";s:3:"ἃ";s:5:"ἄ";s:3:"ἄ";s:5:"ἅ";s:3:"ἅ";s:5:"ἆ";s:3:"ἆ";s:5:"ἇ";s:3:"ἇ";s:4:"Ἀ";s:3:"Ἀ";s:4:"Ἁ";s:3:"Ἁ";s:5:"Ἂ";s:3:"Ἂ";s:5:"Ἃ";s:3:"Ἃ";s:5:"Ἄ";s:3:"Ἄ";s:5:"Ἅ";s:3:"Ἅ";s:5:"Ἆ";s:3:"Ἆ";s:5:"Ἇ";s:3:"Ἇ";s:4:"ἐ";s:3:"ἐ";s:4:"ἑ";s:3:"ἑ";s:5:"ἒ";s:3:"ἒ";s:5:"ἓ";s:3:"ἓ";s:5:"ἔ";s:3:"ἔ";s:5:"ἕ";s:3:"ἕ";s:4:"Ἐ";s:3:"Ἐ";s:4:"Ἑ";s:3:"Ἑ";s:5:"Ἒ";s:3:"Ἒ";s:5:"Ἓ";s:3:"Ἓ";s:5:"Ἔ";s:3:"Ἔ";s:5:"Ἕ";s:3:"Ἕ";s:4:"ἠ";s:3:"ἠ";s:4:"ἡ";s:3:"ἡ";s:5:"ἢ";s:3:"ἢ";s:5:"ἣ";s:3:"ἣ";s:5:"ἤ";s:3:"ἤ";s:5:"ἥ";s:3:"ἥ";s:5:"ἦ";s:3:"ἦ";s:5:"ἧ";s:3:"ἧ";s:4:"Ἠ";s:3:"Ἠ";s:4:"Ἡ";s:3:"Ἡ";s:5:"Ἢ";s:3:"Ἢ";s:5:"Ἣ";s:3:"Ἣ";s:5:"Ἤ";s:3:"Ἤ";s:5:"Ἥ";s:3:"Ἥ";s:5:"Ἦ";s:3:"Ἦ";s:5:"Ἧ";s:3:"Ἧ";s:4:"ἰ";s:3:"ἰ";s:4:"ἱ";s:3:"ἱ";s:5:"ἲ";s:3:"ἲ";s:5:"ἳ";s:3:"ἳ";s:5:"ἴ";s:3:"ἴ";s:5:"ἵ";s:3:"ἵ";s:5:"ἶ";s:3:"ἶ";s:5:"ἷ";s:3:"ἷ";s:4:"Ἰ";s:3:"Ἰ";s:4:"Ἱ";s:3:"Ἱ";s:5:"Ἲ";s:3:"Ἲ";s:5:"Ἳ";s:3:"Ἳ";s:5:"Ἴ";s:3:"Ἴ";s:5:"Ἵ";s:3:"Ἵ";s:5:"Ἶ";s:3:"Ἶ";s:5:"Ἷ";s:3:"Ἷ";s:4:"ὀ";s:3:"ὀ";s:4:"ὁ";s:3:"ὁ";s:5:"ὂ";s:3:"ὂ";s:5:"ὃ";s:3:"ὃ";s:5:"ὄ";s:3:"ὄ";s:5:"ὅ";s:3:"ὅ";s:4:"Ὀ";s:3:"Ὀ";s:4:"Ὁ";s:3:"Ὁ";s:5:"Ὂ";s:3:"Ὂ";s:5:"Ὃ";s:3:"Ὃ";s:5:"Ὄ";s:3:"Ὄ";s:5:"Ὅ";s:3:"Ὅ";s:4:"ὐ";s:3:"ὐ";s:4:"ὑ";s:3:"ὑ";s:5:"ὒ";s:3:"ὒ";s:5:"ὓ";s:3:"ὓ";s:5:"ὔ";s:3:"ὔ";s:5:"ὕ";s:3:"ὕ";s:5:"ὖ";s:3:"ὖ";s:5:"ὗ";s:3:"ὗ";s:4:"Ὑ";s:3:"Ὑ";s:5:"Ὓ";s:3:"Ὓ";s:5:"Ὕ";s:3:"Ὕ";s:5:"Ὗ";s:3:"Ὗ";s:4:"ὠ";s:3:"ὠ";s:4:"ὡ";s:3:"ὡ";s:5:"ὢ";s:3:"ὢ";s:5:"ὣ";s:3:"ὣ";s:5:"ὤ";s:3:"ὤ";s:5:"ὥ";s:3:"ὥ";s:5:"ὦ";s:3:"ὦ";s:5:"ὧ";s:3:"ὧ";s:4:"Ὠ";s:3:"Ὠ";s:4:"Ὡ";s:3:"Ὡ";s:5:"Ὢ";s:3:"Ὢ";s:5:"Ὣ";s:3:"Ὣ";s:5:"Ὤ";s:3:"Ὤ";s:5:"Ὥ";s:3:"Ὥ";s:5:"Ὦ";s:3:"Ὦ";s:5:"Ὧ";s:3:"Ὧ";s:4:"ὰ";s:3:"ὰ";s:2:"ά";s:3:"ά";s:4:"ὲ";s:3:"ὲ";s:2:"έ";s:3:"έ";s:4:"ὴ";s:3:"ὴ";s:2:"ή";s:3:"ή";s:4:"ὶ";s:3:"ὶ";s:2:"ί";s:3:"ί";s:4:"ὸ";s:3:"ὸ";s:2:"ό";s:3:"ό";s:4:"ὺ";s:3:"ὺ";s:2:"ύ";s:3:"ύ";s:4:"ὼ";s:3:"ὼ";s:2:"ώ";s:3:"ώ";s:5:"ᾀ";s:3:"ᾀ";s:5:"ᾁ";s:3:"ᾁ";s:5:"ᾂ";s:3:"ᾂ";s:5:"ᾃ";s:3:"ᾃ";s:5:"ᾄ";s:3:"ᾄ";s:5:"ᾅ";s:3:"ᾅ";s:5:"ᾆ";s:3:"ᾆ";s:5:"ᾇ";s:3:"ᾇ";s:5:"ᾈ";s:3:"ᾈ";s:5:"ᾉ";s:3:"ᾉ";s:5:"ᾊ";s:3:"ᾊ";s:5:"ᾋ";s:3:"ᾋ";s:5:"ᾌ";s:3:"ᾌ";s:5:"ᾍ";s:3:"ᾍ";s:5:"ᾎ";s:3:"ᾎ";s:5:"ᾏ";s:3:"ᾏ";s:5:"ᾐ";s:3:"ᾐ";s:5:"ᾑ";s:3:"ᾑ";s:5:"ᾒ";s:3:"ᾒ";s:5:"ᾓ";s:3:"ᾓ";s:5:"ᾔ";s:3:"ᾔ";s:5:"ᾕ";s:3:"ᾕ";s:5:"ᾖ";s:3:"ᾖ";s:5:"ᾗ";s:3:"ᾗ";s:5:"ᾘ";s:3:"ᾘ";s:5:"ᾙ";s:3:"ᾙ";s:5:"ᾚ";s:3:"ᾚ";s:5:"ᾛ";s:3:"ᾛ";s:5:"ᾜ";s:3:"ᾜ";s:5:"ᾝ";s:3:"ᾝ";s:5:"ᾞ";s:3:"ᾞ";s:5:"ᾟ";s:3:"ᾟ";s:5:"ᾠ";s:3:"ᾠ";s:5:"ᾡ";s:3:"ᾡ";s:5:"ᾢ";s:3:"ᾢ";s:5:"ᾣ";s:3:"ᾣ";s:5:"ᾤ";s:3:"ᾤ";s:5:"ᾥ";s:3:"ᾥ";s:5:"ᾦ";s:3:"ᾦ";s:5:"ᾧ";s:3:"ᾧ";s:5:"ᾨ";s:3:"ᾨ";s:5:"ᾩ";s:3:"ᾩ";s:5:"ᾪ";s:3:"ᾪ";s:5:"ᾫ";s:3:"ᾫ";s:5:"ᾬ";s:3:"ᾬ";s:5:"ᾭ";s:3:"ᾭ";s:5:"ᾮ";s:3:"ᾮ";s:5:"ᾯ";s:3:"ᾯ";s:4:"ᾰ";s:3:"ᾰ";s:4:"ᾱ";s:3:"ᾱ";s:5:"ᾲ";s:3:"ᾲ";s:4:"ᾳ";s:3:"ᾳ";s:4:"ᾴ";s:3:"ᾴ";s:4:"ᾶ";s:3:"ᾶ";s:5:"ᾷ";s:3:"ᾷ";s:4:"Ᾰ";s:3:"Ᾰ";s:4:"Ᾱ";s:3:"Ᾱ";s:4:"Ὰ";s:3:"Ὰ";s:2:"Ά";s:3:"Ά";s:4:"ᾼ";s:3:"ᾼ";s:2:"ι";s:3:"ι";s:4:"῁";s:3:"῁";s:5:"ῂ";s:3:"ῂ";s:4:"ῃ";s:3:"ῃ";s:4:"ῄ";s:3:"ῄ";s:4:"ῆ";s:3:"ῆ";s:5:"ῇ";s:3:"ῇ";s:4:"Ὲ";s:3:"Ὲ";s:2:"Έ";s:3:"Έ";s:4:"Ὴ";s:3:"Ὴ";s:2:"Ή";s:3:"Ή";s:4:"ῌ";s:3:"ῌ";s:5:"῍";s:3:"῍";s:5:"῎";s:3:"῎";s:5:"῏";s:3:"῏";s:4:"ῐ";s:3:"ῐ";s:4:"ῑ";s:3:"ῑ";s:4:"ῒ";s:3:"ῒ";s:2:"ΐ";s:3:"ΐ";s:4:"ῖ";s:3:"ῖ";s:4:"ῗ";s:3:"ῗ";s:4:"Ῐ";s:3:"Ῐ";s:4:"Ῑ";s:3:"Ῑ";s:4:"Ὶ";s:3:"Ὶ";s:2:"Ί";s:3:"Ί";s:5:"῝";s:3:"῝";s:5:"῞";s:3:"῞";s:5:"῟";s:3:"῟";s:4:"ῠ";s:3:"ῠ";s:4:"ῡ";s:3:"ῡ";s:4:"ῢ";s:3:"ῢ";s:2:"ΰ";s:3:"ΰ";s:4:"ῤ";s:3:"ῤ";s:4:"ῥ";s:3:"ῥ";s:4:"ῦ";s:3:"ῦ";s:4:"ῧ";s:3:"ῧ";s:4:"Ῠ";s:3:"Ῠ";s:4:"Ῡ";s:3:"Ῡ";s:4:"Ὺ";s:3:"Ὺ";s:2:"Ύ";s:3:"Ύ";s:4:"Ῥ";s:3:"Ῥ";s:4:"῭";s:3:"῭";s:2:"΅";s:3:"΅";s:1:"`";s:3:"`";s:5:"ῲ";s:3:"ῲ";s:4:"ῳ";s:3:"ῳ";s:4:"ῴ";s:3:"ῴ";s:4:"ῶ";s:3:"ῶ";s:5:"ῷ";s:3:"ῷ";s:4:"Ὸ";s:3:"Ὸ";s:2:"Ό";s:3:"Ό";s:4:"Ὼ";s:3:"Ὼ";s:2:"Ώ";s:3:"Ώ";s:4:"ῼ";s:3:"ῼ";s:2:"´";s:3:"´";s:3:" ";s:3:" ";s:3:" ";s:3:" ";s:2:"Ω";s:3:"Ω";s:1:"K";s:3:"K";s:2:"Å";s:3:"Å";s:5:"↚";s:3:"↚";s:5:"↛";s:3:"↛";s:5:"↮";s:3:"↮";s:5:"⇍";s:3:"⇍";s:5:"⇎";s:3:"⇎";s:5:"⇏";s:3:"⇏";s:5:"∄";s:3:"∄";s:5:"∉";s:3:"∉";s:5:"∌";s:3:"∌";s:5:"∤";s:3:"∤";s:5:"∦";s:3:"∦";s:5:"≁";s:3:"≁";s:5:"≄";s:3:"≄";s:5:"≇";s:3:"≇";s:5:"≉";s:3:"≉";s:3:"≠";s:3:"≠";s:5:"≢";s:3:"≢";s:5:"≭";s:3:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:5:"≰";s:3:"≰";s:5:"≱";s:3:"≱";s:5:"≴";s:3:"≴";s:5:"≵";s:3:"≵";s:5:"≸";s:3:"≸";s:5:"≹";s:3:"≹";s:5:"⊀";s:3:"⊀";s:5:"⊁";s:3:"⊁";s:5:"⊄";s:3:"⊄";s:5:"⊅";s:3:"⊅";s:5:"⊈";s:3:"⊈";s:5:"⊉";s:3:"⊉";s:5:"⊬";s:3:"⊬";s:5:"⊭";s:3:"⊭";s:5:"⊮";s:3:"⊮";s:5:"⊯";s:3:"⊯";s:5:"⋠";s:3:"⋠";s:5:"⋡";s:3:"⋡";s:5:"⋢";s:3:"⋢";s:5:"⋣";s:3:"⋣";s:5:"⋪";s:3:"⋪";s:5:"⋫";s:3:"⋫";s:5:"⋬";s:3:"⋬";s:5:"⋭";s:3:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:6:"が";s:3:"が";s:6:"ぎ";s:3:"ぎ";s:6:"ぐ";s:3:"ぐ";s:6:"げ";s:3:"げ";s:6:"ご";s:3:"ご";s:6:"ざ";s:3:"ざ";s:6:"じ";s:3:"じ";s:6:"ず";s:3:"ず";s:6:"ぜ";s:3:"ぜ";s:6:"ぞ";s:3:"ぞ";s:6:"だ";s:3:"だ";s:6:"ぢ";s:3:"ぢ";s:6:"づ";s:3:"づ";s:6:"で";s:3:"で";s:6:"ど";s:3:"ど";s:6:"ば";s:3:"ば";s:6:"ぱ";s:3:"ぱ";s:6:"び";s:3:"び";s:6:"ぴ";s:3:"ぴ";s:6:"ぶ";s:3:"ぶ";s:6:"ぷ";s:3:"ぷ";s:6:"べ";s:3:"べ";s:6:"ぺ";s:3:"ぺ";s:6:"ぼ";s:3:"ぼ";s:6:"ぽ";s:3:"ぽ";s:6:"ゔ";s:3:"ゔ";s:6:"ゞ";s:3:"ゞ";s:6:"ガ";s:3:"ガ";s:6:"ギ";s:3:"ギ";s:6:"グ";s:3:"グ";s:6:"ゲ";s:3:"ゲ";s:6:"ゴ";s:3:"ゴ";s:6:"ザ";s:3:"ザ";s:6:"ジ";s:3:"ジ";s:6:"ズ";s:3:"ズ";s:6:"ゼ";s:3:"ゼ";s:6:"ゾ";s:3:"ゾ";s:6:"ダ";s:3:"ダ";s:6:"ヂ";s:3:"ヂ";s:6:"ヅ";s:3:"ヅ";s:6:"デ";s:3:"デ";s:6:"ド";s:3:"ド";s:6:"バ";s:3:"バ";s:6:"パ";s:3:"パ";s:6:"ビ";s:3:"ビ";s:6:"ピ";s:3:"ピ";s:6:"ブ";s:3:"ブ";s:6:"プ";s:3:"プ";s:6:"ベ";s:3:"ベ";s:6:"ペ";s:3:"ペ";s:6:"ボ";s:3:"ボ";s:6:"ポ";s:3:"ポ";s:6:"ヴ";s:3:"ヴ";s:6:"ヷ";s:3:"ヷ";s:6:"ヸ";s:3:"ヸ";s:6:"ヹ";s:3:"ヹ";s:6:"ヺ";s:3:"ヺ";s:6:"ヾ";s:3:"ヾ";s:3:"豈";s:3:"豈";s:3:"更";s:3:"更";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"句";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:4:"懶";s:3:"癩";s:3:"癩";s:3:"羅";s:3:"羅";s:3:"蘿";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"珞";s:3:"落";s:3:"落";s:3:"酪";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"卵";s:3:"欄";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"嵐";s:3:"濫";s:3:"濫";s:3:"藍";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"蠟";s:3:"廊";s:4:"廊";s:3:"朗";s:4:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"擄";s:3:"櫓";s:3:"櫓";s:3:"爐";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"老";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:4:"虜";s:3:"路";s:3:"路";s:3:"露";s:3:"露";s:3:"魯";s:3:"魯";s:3:"鷺";s:3:"鷺";s:3:"碌";s:4:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"論";s:3:"論";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"籠";s:3:"聾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"淚";s:3:"淚";s:3:"漏";s:3:"漏";s:3:"累";s:3:"累";s:3:"縷";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"勒";s:3:"肋";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"拏";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:4:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:4:"異";s:3:"北";s:4:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"索";s:3:"參";s:3:"參";s:3:"塞";s:3:"塞";s:3:"省";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:4:"殺";s:3:"辰";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:4:"若";s:3:"掠";s:3:"掠";s:3:"略";s:3:"略";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"諒";s:3:"量";s:3:"量";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"呂";s:3:"女";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"歷";s:3:"轢";s:3:"轢";s:3:"年";s:3:"年";s:3:"憐";s:3:"憐";s:3:"戀";s:3:"戀";s:3:"撚";s:3:"撚";s:3:"漣";s:3:"漣";s:3:"煉";s:3:"煉";s:3:"璉";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"練";s:3:"練";s:3:"聯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"蓮";s:3:"連";s:3:"連";s:3:"鍊";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"劣";s:3:"咽";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"捻";s:3:"殮";s:3:"殮";s:3:"簾";s:3:"簾";s:3:"獵";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"靈";s:3:"領";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"尿";s:3:"料";s:3:"料";s:3:"燎";s:3:"燎";s:3:"療";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"遼";s:3:"龍";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"流";s:4:"流";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"琉";s:3:"留";s:3:"留";s:3:"硫";s:3:"硫";s:3:"紐";s:3:"紐";s:3:"類";s:3:"類";s:3:"六";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"崙";s:3:"淪";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"慄";s:3:"栗";s:3:"栗";s:3:"隆";s:3:"隆";s:3:"利";s:3:"利";s:3:"吏";s:3:"吏";s:3:"履";s:3:"履";s:3:"易";s:3:"易";s:3:"李";s:3:"李";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"泥";s:3:"理";s:3:"理";s:3:"痢";s:3:"痢";s:3:"罹";s:3:"罹";s:3:"裏";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"吝";s:3:"燐";s:3:"燐";s:3:"璘";s:3:"璘";s:3:"藺";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"林";s:3:"林";s:3:"淋";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"立";s:3:"立";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"粒";s:3:"狀";s:3:"狀";s:3:"炙";s:3:"炙";s:3:"識";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:4:"切";s:3:"度";s:3:"度";s:3:"拓";s:3:"拓";s:3:"糖";s:3:"糖";s:3:"宅";s:3:"宅";s:3:"洞";s:3:"洞";s:3:"暴";s:3:"暴";s:3:"輻";s:3:"輻";s:3:"行";s:3:"行";s:3:"降";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"兀";s:3:"嗀";s:3:"嗀";s:3:"塚";s:3:"塚";s:3:"晴";s:3:"晴";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:4:"福";s:3:"靖";s:3:"靖";s:3:"精";s:3:"精";s:3:"羽";s:3:"羽";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:4:"侮";s:3:"僧";s:4:"僧";s:3:"免";s:4:"免";s:3:"勉";s:4:"勉";s:3:"勤";s:4:"勤";s:3:"卑";s:4:"卑";s:3:"喝";s:3:"喝";s:3:"嘆";s:4:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:4:"屮";s:3:"悔";s:4:"悔";s:3:"慨";s:3:"慨";s:3:"憎";s:4:"憎";s:3:"懲";s:4:"懲";s:3:"敏";s:4:"敏";s:3:"既";s:3:"既";s:3:"暑";s:4:"暑";s:3:"梅";s:4:"梅";s:3:"海";s:4:"海";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"漢";s:3:"煮";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"琢";s:3:"碑";s:3:"碑";s:3:"社";s:3:"社";s:3:"祉";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"祐";s:3:"祐";s:3:"祖";s:4:"祖";s:3:"祝";s:3:"祝";s:3:"禍";s:3:"禍";s:3:"禎";s:3:"禎";s:3:"穀";s:4:"穀";s:3:"突";s:3:"突";s:3:"節";s:3:"節";s:3:"縉";s:3:"縉";s:3:"繁";s:3:"繁";s:3:"署";s:3:"署";s:3:"者";s:4:"者";s:3:"臭";s:3:"臭";s:3:"艹";s:3:"艹";s:3:"著";s:4:"著";s:3:"褐";s:3:"褐";s:3:"視";s:3:"視";s:3:"謁";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"贈";s:3:"贈";s:3:"辶";s:3:"辶";s:3:"難";s:3:"難";s:3:"響";s:3:"響";s:3:"頻";s:3:"頻";s:3:"恵";s:3:"恵";s:4:"𤋮";s:3:"𤋮";s:3:"舘";s:3:"舘";s:3:"並";s:3:"並";s:3:"况";s:4:"况";s:3:"全";s:3:"全";s:3:"侀";s:3:"侀";s:3:"充";s:3:"充";s:3:"冀";s:3:"冀";s:3:"勇";s:4:"勇";s:3:"勺";s:4:"勺";s:3:"啕";s:3:"啕";s:3:"喙";s:4:"喙";s:3:"嗢";s:3:"嗢";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"奔";s:3:"婢";s:3:"婢";s:3:"嬨";s:3:"嬨";s:3:"廒";s:3:"廒";s:3:"廙";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"慎";s:4:"慎";s:3:"愈";s:3:"愈";s:3:"慠";s:3:"慠";s:3:"戴";s:3:"戴";s:3:"揄";s:3:"揄";s:3:"搜";s:3:"搜";s:3:"摒";s:3:"摒";s:3:"敖";s:3:"敖";s:3:"望";s:4:"望";s:3:"杖";s:3:"杖";s:3:"歹";s:3:"歹";s:3:"滛";s:3:"滛";s:3:"滋";s:4:"滋";s:3:"瀞";s:4:"瀞";s:3:"瞧";s:3:"瞧";s:3:"爵";s:4:"爵";s:3:"犯";s:3:"犯";s:3:"瑱";s:4:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"画";s:3:"瘝";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"盛";s:3:"盛";s:3:"直";s:4:"直";s:3:"睊";s:4:"睊";s:3:"着";s:3:"着";s:3:"磌";s:4:"磌";s:3:"窱";s:3:"窱";s:3:"类";s:3:"类";s:3:"絛";s:3:"絛";s:3:"缾";s:3:"缾";s:3:"荒";s:3:"荒";s:3:"華";s:3:"華";s:3:"蝹";s:4:"蝹";s:3:"襁";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"調";s:3:"調";s:3:"請";s:3:"請";s:3:"諭";s:4:"諭";s:3:"變";s:4:"變";s:3:"輸";s:4:"輸";s:3:"遲";s:3:"遲";s:3:"醙";s:3:"醙";s:3:"鉶";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"韛";s:3:"韛";s:3:"頋";s:4:"頋";s:3:"鬒";s:4:"鬒";s:4:"𢡊";s:3:"𢡊";s:4:"𢡄";s:3:"𢡄";s:4:"𣏕";s:3:"𣏕";s:3:"㮝";s:4:"㮝";s:3:"䀘";s:3:"䀘";s:3:"䀹";s:4:"䀹";s:4:"𥉉";s:3:"𥉉";s:4:"𥳐";s:3:"𥳐";s:4:"𧻓";s:3:"𧻓";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"龎";s:8:"𑂚";s:4:"𑂚";s:8:"𑂜";s:4:"𑂜";s:8:"𑂫";s:4:"𑂫";s:3:"丽";s:4:"丽";s:3:"丸";s:4:"丸";s:3:"乁";s:4:"乁";s:4:"𠄢";s:4:"𠄢";s:3:"你";s:4:"你";s:3:"侻";s:4:"侻";s:3:"倂";s:4:"倂";s:3:"偺";s:4:"偺";s:3:"備";s:4:"備";s:3:"像";s:4:"像";s:3:"㒞";s:4:"㒞";s:4:"𠘺";s:4:"𠘺";s:3:"兔";s:4:"兔";s:3:"兤";s:4:"兤";s:3:"具";s:4:"具";s:4:"𠔜";s:4:"𠔜";s:3:"㒹";s:4:"㒹";s:3:"內";s:4:"內";s:3:"再";s:4:"再";s:4:"𠕋";s:4:"𠕋";s:3:"冗";s:4:"冗";s:3:"冤";s:4:"冤";s:3:"仌";s:4:"仌";s:3:"冬";s:4:"冬";s:4:"𩇟";s:4:"𩇟";s:3:"凵";s:4:"凵";s:3:"刃";s:4:"刃";s:3:"㓟";s:4:"㓟";s:3:"刻";s:4:"刻";s:3:"剆";s:4:"剆";s:3:"割";s:4:"割";s:3:"剷";s:4:"剷";s:3:"㔕";s:4:"㔕";s:3:"包";s:4:"包";s:3:"匆";s:4:"匆";s:3:"卉";s:4:"卉";s:3:"博";s:4:"博";s:3:"即";s:4:"即";s:3:"卽";s:4:"卽";s:3:"卿";s:4:"卿";s:4:"𠨬";s:4:"𠨬";s:3:"灰";s:4:"灰";s:3:"及";s:4:"及";s:3:"叟";s:4:"叟";s:4:"𠭣";s:4:"𠭣";s:3:"叫";s:4:"叫";s:3:"叱";s:4:"叱";s:3:"吆";s:4:"吆";s:3:"咞";s:4:"咞";s:3:"吸";s:4:"吸";s:3:"呈";s:4:"呈";s:3:"周";s:4:"周";s:3:"咢";s:4:"咢";s:3:"哶";s:4:"哶";s:3:"唐";s:4:"唐";s:3:"啓";s:4:"啓";s:3:"啣";s:4:"啣";s:3:"善";s:4:"善";s:3:"喫";s:4:"喫";s:3:"喳";s:4:"喳";s:3:"嗂";s:4:"嗂";s:3:"圖";s:4:"圖";s:3:"圗";s:4:"圗";s:3:"噑";s:4:"噑";s:3:"噴";s:4:"噴";s:3:"壮";s:4:"壮";s:3:"城";s:4:"城";s:3:"埴";s:4:"埴";s:3:"堍";s:4:"堍";s:3:"型";s:4:"型";s:3:"堲";s:4:"堲";s:3:"報";s:4:"報";s:3:"墬";s:4:"墬";s:4:"𡓤";s:4:"𡓤";s:3:"売";s:4:"売";s:3:"壷";s:4:"壷";s:3:"夆";s:4:"夆";s:3:"多";s:4:"多";s:3:"夢";s:4:"夢";s:3:"奢";s:4:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:3:"姬";s:4:"姬";s:3:"娛";s:4:"娛";s:3:"娧";s:4:"娧";s:3:"姘";s:4:"姘";s:3:"婦";s:4:"婦";s:3:"㛮";s:4:"㛮";s:3:"㛼";s:4:"㛼";s:3:"嬈";s:4:"嬈";s:3:"嬾";s:4:"嬾";s:4:"𡧈";s:4:"𡧈";s:3:"寃";s:4:"寃";s:3:"寘";s:4:"寘";s:3:"寳";s:4:"寳";s:4:"𡬘";s:4:"𡬘";s:3:"寿";s:4:"寿";s:3:"将";s:4:"将";s:3:"当";s:4:"当";s:3:"尢";s:4:"尢";s:3:"㞁";s:4:"㞁";s:3:"屠";s:4:"屠";s:3:"峀";s:4:"峀";s:3:"岍";s:4:"岍";s:4:"𡷤";s:4:"𡷤";s:3:"嵃";s:4:"嵃";s:4:"𡷦";s:4:"𡷦";s:3:"嵮";s:4:"嵮";s:3:"嵫";s:4:"嵫";s:3:"嵼";s:4:"嵼";s:3:"巡";s:4:"巡";s:3:"巢";s:4:"巢";s:3:"㠯";s:4:"㠯";s:3:"巽";s:4:"巽";s:3:"帨";s:4:"帨";s:3:"帽";s:4:"帽";s:3:"幩";s:4:"幩";s:3:"㡢";s:4:"㡢";s:4:"𢆃";s:4:"𢆃";s:3:"㡼";s:4:"㡼";s:3:"庰";s:4:"庰";s:3:"庳";s:4:"庳";s:3:"庶";s:4:"庶";s:4:"𪎒";s:4:"𪎒";s:3:"廾";s:4:"廾";s:4:"𢌱";s:4:"𢌱";s:3:"舁";s:4:"舁";s:3:"弢";s:4:"弢";s:3:"㣇";s:4:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:3:"形";s:4:"形";s:3:"彫";s:4:"彫";s:3:"㣣";s:4:"㣣";s:3:"徚";s:4:"徚";s:3:"忍";s:4:"忍";s:3:"志";s:4:"志";s:3:"忹";s:4:"忹";s:3:"悁";s:4:"悁";s:3:"㤺";s:4:"㤺";s:3:"㤜";s:4:"㤜";s:4:"𢛔";s:4:"𢛔";s:3:"惇";s:4:"惇";s:3:"慈";s:4:"慈";s:3:"慌";s:4:"慌";s:3:"慺";s:4:"慺";s:3:"憲";s:4:"憲";s:3:"憤";s:4:"憤";s:3:"憯";s:4:"憯";s:3:"懞";s:4:"懞";s:3:"成";s:4:"成";s:3:"戛";s:4:"戛";s:3:"扝";s:4:"扝";s:3:"抱";s:4:"抱";s:3:"拔";s:4:"拔";s:3:"捐";s:4:"捐";s:4:"𢬌";s:4:"𢬌";s:3:"挽";s:4:"挽";s:3:"拼";s:4:"拼";s:3:"捨";s:4:"捨";s:3:"掃";s:4:"掃";s:3:"揤";s:4:"揤";s:4:"𢯱";s:4:"𢯱";s:3:"搢";s:4:"搢";s:3:"揅";s:4:"揅";s:3:"掩";s:4:"掩";s:3:"㨮";s:4:"㨮";s:3:"摩";s:4:"摩";s:3:"摾";s:4:"摾";s:3:"撝";s:4:"撝";s:3:"摷";s:4:"摷";s:3:"㩬";s:4:"㩬";s:3:"敬";s:4:"敬";s:4:"𣀊";s:4:"𣀊";s:3:"旣";s:4:"旣";s:3:"書";s:4:"書";s:3:"晉";s:4:"晉";s:3:"㬙";s:4:"㬙";s:3:"㬈";s:4:"㬈";s:3:"㫤";s:4:"㫤";s:3:"冒";s:4:"冒";s:3:"冕";s:4:"冕";s:3:"最";s:4:"最";s:3:"暜";s:4:"暜";s:3:"肭";s:4:"肭";s:3:"䏙";s:4:"䏙";s:3:"朡";s:4:"朡";s:3:"杞";s:4:"杞";s:3:"杓";s:4:"杓";s:4:"𣏃";s:4:"𣏃";s:3:"㭉";s:4:"㭉";s:3:"柺";s:4:"柺";s:3:"枅";s:4:"枅";s:3:"桒";s:4:"桒";s:4:"𣑭";s:4:"𣑭";s:3:"梎";s:4:"梎";s:3:"栟";s:4:"栟";s:3:"椔";s:4:"椔";s:3:"楂";s:4:"楂";s:3:"榣";s:4:"榣";s:3:"槪";s:4:"槪";s:3:"檨";s:4:"檨";s:4:"𣚣";s:4:"𣚣";s:3:"櫛";s:4:"櫛";s:3:"㰘";s:4:"㰘";s:3:"次";s:4:"次";s:4:"𣢧";s:4:"𣢧";s:3:"歔";s:4:"歔";s:3:"㱎";s:4:"㱎";s:3:"歲";s:4:"歲";s:3:"殟";s:4:"殟";s:3:"殻";s:4:"殻";s:4:"𣪍";s:4:"𣪍";s:4:"𡴋";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:3:"汎";s:4:"汎";s:4:"𣲼";s:4:"𣲼";s:3:"沿";s:4:"沿";s:3:"泍";s:4:"泍";s:3:"汧";s:4:"汧";s:3:"洖";s:4:"洖";s:3:"派";s:4:"派";s:3:"浩";s:4:"浩";s:3:"浸";s:4:"浸";s:3:"涅";s:4:"涅";s:4:"𣴞";s:4:"𣴞";s:3:"洴";s:4:"洴";s:3:"港";s:4:"港";s:3:"湮";s:4:"湮";s:3:"㴳";s:4:"㴳";s:3:"滇";s:4:"滇";s:4:"𣻑";s:4:"𣻑";s:3:"淹";s:4:"淹";s:3:"潮";s:4:"潮";s:4:"𣽞";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:3:"濆";s:4:"濆";s:3:"瀹";s:4:"瀹";s:3:"瀛";s:4:"瀛";s:3:"㶖";s:4:"㶖";s:3:"灊";s:4:"灊";s:3:"災";s:4:"災";s:3:"灷";s:4:"灷";s:3:"炭";s:4:"炭";s:4:"𠔥";s:4:"𠔥";s:3:"煅";s:4:"煅";s:4:"𤉣";s:4:"𤉣";s:3:"熜";s:4:"熜";s:4:"𤎫";s:4:"𤎫";s:3:"爨";s:4:"爨";s:3:"牐";s:4:"牐";s:4:"𤘈";s:4:"𤘈";s:3:"犀";s:4:"犀";s:3:"犕";s:4:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:3:"獺";s:4:"獺";s:3:"王";s:4:"王";s:3:"㺬";s:4:"㺬";s:3:"玥";s:4:"玥";s:3:"㺸";s:4:"㺸";s:3:"瑇";s:4:"瑇";s:3:"瑜";s:4:"瑜";s:3:"璅";s:4:"璅";s:3:"瓊";s:4:"瓊";s:3:"㼛";s:4:"㼛";s:3:"甤";s:4:"甤";s:4:"𤰶";s:4:"𤰶";s:3:"甾";s:4:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"𢆟";s:4:"𢆟";s:3:"瘐";s:4:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"𥁄";s:3:"㿼";s:4:"㿼";s:3:"䀈";s:4:"䀈";s:4:"𥃳";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:3:"眞";s:4:"眞";s:3:"真";s:4:"真";s:3:"瞋";s:4:"瞋";s:3:"䁆";s:4:"䁆";s:3:"䂖";s:4:"䂖";s:4:"𥐝";s:4:"𥐝";s:3:"硎";s:4:"硎";s:3:"䃣";s:4:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:3:"秫";s:4:"秫";s:3:"䄯";s:4:"䄯";s:3:"穊";s:4:"穊";s:3:"穏";s:4:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:3:"竮";s:4:"竮";s:3:"䈂";s:4:"䈂";s:4:"𥮫";s:4:"𥮫";s:3:"篆";s:4:"篆";s:3:"築";s:4:"築";s:3:"䈧";s:4:"䈧";s:4:"𥲀";s:4:"𥲀";s:3:"糒";s:4:"糒";s:3:"䊠";s:4:"䊠";s:3:"糨";s:4:"糨";s:3:"糣";s:4:"糣";s:3:"紀";s:4:"紀";s:4:"𥾆";s:4:"𥾆";s:3:"絣";s:4:"絣";s:3:"䌁";s:4:"䌁";s:3:"緇";s:4:"緇";s:3:"縂";s:4:"縂";s:3:"繅";s:4:"繅";s:3:"䌴";s:4:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:3:"䍙";s:4:"䍙";s:4:"𦋙";s:4:"𦋙";s:3:"罺";s:4:"罺";s:4:"𦌾";s:4:"𦌾";s:3:"羕";s:4:"羕";s:3:"翺";s:4:"翺";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:3:"聠";s:4:"聠";s:4:"𦖨";s:4:"𦖨";s:3:"聰";s:4:"聰";s:4:"𣍟";s:4:"𣍟";s:3:"䏕";s:4:"䏕";s:3:"育";s:4:"育";s:3:"脃";s:4:"脃";s:3:"䐋";s:4:"䐋";s:3:"脾";s:4:"脾";s:3:"媵";s:4:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:3:"舄";s:4:"舄";s:3:"辞";s:4:"辞";s:3:"䑫";s:4:"䑫";s:3:"芑";s:4:"芑";s:3:"芋";s:4:"芋";s:3:"芝";s:4:"芝";s:3:"劳";s:4:"劳";s:3:"花";s:4:"花";s:3:"芳";s:4:"芳";s:3:"芽";s:4:"芽";s:3:"苦";s:4:"苦";s:4:"𦬼";s:4:"𦬼";s:3:"茝";s:4:"茝";s:3:"荣";s:4:"荣";s:3:"莭";s:4:"莭";s:3:"茣";s:4:"茣";s:3:"莽";s:4:"莽";s:3:"菧";s:4:"菧";s:3:"荓";s:4:"荓";s:3:"菊";s:4:"菊";s:3:"菌";s:4:"菌";s:3:"菜";s:4:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:3:"䔫";s:4:"䔫";s:3:"蓱";s:4:"蓱";s:3:"蓳";s:4:"蓳";s:3:"蔖";s:4:"蔖";s:4:"𧏊";s:4:"𧏊";s:3:"蕤";s:4:"蕤";s:4:"𦼬";s:4:"𦼬";s:3:"䕝";s:4:"䕝";s:3:"䕡";s:4:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:3:"䕫";s:4:"䕫";s:3:"虐";s:4:"虐";s:3:"虧";s:4:"虧";s:3:"虩";s:4:"虩";s:3:"蚩";s:4:"蚩";s:3:"蚈";s:4:"蚈";s:3:"蜎";s:4:"蜎";s:3:"蛢";s:4:"蛢";s:3:"蜨";s:4:"蜨";s:3:"蝫";s:4:"蝫";s:3:"螆";s:4:"螆";s:3:"䗗";s:4:"䗗";s:3:"蟡";s:4:"蟡";s:3:"蠁";s:4:"蠁";s:3:"䗹";s:4:"䗹";s:3:"衠";s:4:"衠";s:3:"衣";s:4:"衣";s:4:"𧙧";s:4:"𧙧";s:3:"裗";s:4:"裗";s:3:"裞";s:4:"裞";s:3:"䘵";s:4:"䘵";s:3:"裺";s:4:"裺";s:3:"㒻";s:4:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:3:"䚾";s:4:"䚾";s:3:"䛇";s:4:"䛇";s:3:"誠";s:4:"誠";s:3:"豕";s:4:"豕";s:4:"𧲨";s:4:"𧲨";s:3:"貫";s:4:"貫";s:3:"賁";s:4:"賁";s:3:"贛";s:4:"贛";s:3:"起";s:4:"起";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"𠠄";s:3:"跋";s:4:"跋";s:3:"趼";s:4:"趼";s:3:"跰";s:4:"跰";s:4:"𠣞";s:4:"𠣞";s:3:"軔";s:4:"軔";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:3:"邔";s:4:"邔";s:3:"郱";s:4:"郱";s:3:"鄑";s:4:"鄑";s:4:"𨜮";s:4:"𨜮";s:3:"鄛";s:4:"鄛";s:3:"鈸";s:4:"鈸";s:3:"鋗";s:4:"鋗";s:3:"鋘";s:4:"鋘";s:3:"鉼";s:4:"鉼";s:3:"鏹";s:4:"鏹";s:3:"鐕";s:4:"鐕";s:4:"𨯺";s:4:"𨯺";s:3:"開";s:4:"開";s:3:"䦕";s:4:"䦕";s:3:"閷";s:4:"閷";s:4:"𨵷";s:4:"𨵷";s:3:"䧦";s:4:"䧦";s:3:"雃";s:4:"雃";s:3:"嶲";s:4:"嶲";s:3:"霣";s:4:"霣";s:4:"𩅅";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:3:"䩮";s:4:"䩮";s:3:"䩶";s:4:"䩶";s:3:"韠";s:4:"韠";s:4:"𩐊";s:4:"𩐊";s:3:"䪲";s:4:"䪲";s:4:"𩒖";s:4:"𩒖";s:3:"頩";s:4:"頩";s:4:"𩖶";s:4:"𩖶";s:3:"飢";s:4:"飢";s:3:"䬳";s:4:"䬳";s:3:"餩";s:4:"餩";s:3:"馧";s:4:"馧";s:3:"駂";s:4:"駂";s:3:"駾";s:4:"駾";s:3:"䯎";s:4:"䯎";s:4:"𩬰";s:4:"𩬰";s:3:"鱀";s:4:"鱀";s:3:"鳽";s:4:"鳽";s:3:"䳎";s:4:"䳎";s:3:"䳭";s:4:"䳭";s:3:"鵧";s:4:"鵧";s:4:"𪃎";s:4:"𪃎";s:3:"䳸";s:4:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:3:"麻";s:4:"麻";s:3:"䵖";s:4:"䵖";s:3:"黹";s:4:"黹";s:3:"黾";s:4:"黾";s:3:"鼅";s:4:"鼅";s:3:"鼏";s:4:"鼏";s:3:"鼖";s:4:"鼖";s:3:"鼻";s:4:"鼻";s:4:"𪘀";s:4:"𪘀";}' );
 UtfNormal::$utfCanonicalDecomp = unserialize( 'a:2049:{s:2:"À";s:3:"À";s:2:"Á";s:3:"Á";s:2:"Â";s:3:"Â";s:2:"Ã";s:3:"Ã";s:2:"Ä";s:3:"Ä";s:2:"Å";s:3:"Å";s:2:"Ç";s:3:"Ç";s:2:"È";s:3:"È";s:2:"É";s:3:"É";s:2:"Ê";s:3:"Ê";s:2:"Ë";s:3:"Ë";s:2:"Ì";s:3:"Ì";s:2:"Í";s:3:"Í";s:2:"Î";s:3:"Î";s:2:"Ï";s:3:"Ï";s:2:"Ñ";s:3:"Ñ";s:2:"Ò";s:3:"Ò";s:2:"Ó";s:3:"Ó";s:2:"Ô";s:3:"Ô";s:2:"Õ";s:3:"Õ";s:2:"Ö";s:3:"Ö";s:2:"Ù";s:3:"Ù";s:2:"Ú";s:3:"Ú";s:2:"Û";s:3:"Û";s:2:"Ü";s:3:"Ü";s:2:"Ý";s:3:"Ý";s:2:"à";s:3:"à";s:2:"á";s:3:"á";s:2:"â";s:3:"â";s:2:"ã";s:3:"ã";s:2:"ä";s:3:"ä";s:2:"å";s:3:"å";s:2:"ç";s:3:"ç";s:2:"è";s:3:"è";s:2:"é";s:3:"é";s:2:"ê";s:3:"ê";s:2:"ë";s:3:"ë";s:2:"ì";s:3:"ì";s:2:"í";s:3:"í";s:2:"î";s:3:"î";s:2:"ï";s:3:"ï";s:2:"ñ";s:3:"ñ";s:2:"ò";s:3:"ò";s:2:"ó";s:3:"ó";s:2:"ô";s:3:"ô";s:2:"õ";s:3:"õ";s:2:"ö";s:3:"ö";s:2:"ù";s:3:"ù";s:2:"ú";s:3:"ú";s:2:"û";s:3:"û";s:2:"ü";s:3:"ü";s:2:"ý";s:3:"ý";s:2:"ÿ";s:3:"ÿ";s:2:"Ā";s:3:"Ā";s:2:"ā";s:3:"ā";s:2:"Ă";s:3:"Ă";s:2:"ă";s:3:"ă";s:2:"Ą";s:3:"Ą";s:2:"ą";s:3:"ą";s:2:"Ć";s:3:"Ć";s:2:"ć";s:3:"ć";s:2:"Ĉ";s:3:"Ĉ";s:2:"ĉ";s:3:"ĉ";s:2:"Ċ";s:3:"Ċ";s:2:"ċ";s:3:"ċ";s:2:"Č";s:3:"Č";s:2:"č";s:3:"č";s:2:"Ď";s:3:"Ď";s:2:"ď";s:3:"ď";s:2:"Ē";s:3:"Ē";s:2:"ē";s:3:"ē";s:2:"Ĕ";s:3:"Ĕ";s:2:"ĕ";s:3:"ĕ";s:2:"Ė";s:3:"Ė";s:2:"ė";s:3:"ė";s:2:"Ę";s:3:"Ę";s:2:"ę";s:3:"ę";s:2:"Ě";s:3:"Ě";s:2:"ě";s:3:"ě";s:2:"Ĝ";s:3:"Ĝ";s:2:"ĝ";s:3:"ĝ";s:2:"Ğ";s:3:"Ğ";s:2:"ğ";s:3:"ğ";s:2:"Ġ";s:3:"Ġ";s:2:"ġ";s:3:"ġ";s:2:"Ģ";s:3:"Ģ";s:2:"ģ";s:3:"ģ";s:2:"Ĥ";s:3:"Ĥ";s:2:"ĥ";s:3:"ĥ";s:2:"Ĩ";s:3:"Ĩ";s:2:"ĩ";s:3:"ĩ";s:2:"Ī";s:3:"Ī";s:2:"ī";s:3:"ī";s:2:"Ĭ";s:3:"Ĭ";s:2:"ĭ";s:3:"ĭ";s:2:"Į";s:3:"Į";s:2:"į";s:3:"į";s:2:"İ";s:3:"İ";s:2:"Ĵ";s:3:"Ĵ";s:2:"ĵ";s:3:"ĵ";s:2:"Ķ";s:3:"Ķ";s:2:"ķ";s:3:"ķ";s:2:"Ĺ";s:3:"Ĺ";s:2:"ĺ";s:3:"ĺ";s:2:"Ļ";s:3:"Ļ";s:2:"ļ";s:3:"ļ";s:2:"Ľ";s:3:"Ľ";s:2:"ľ";s:3:"ľ";s:2:"Ń";s:3:"Ń";s:2:"ń";s:3:"ń";s:2:"Ņ";s:3:"Ņ";s:2:"ņ";s:3:"ņ";s:2:"Ň";s:3:"Ň";s:2:"ň";s:3:"ň";s:2:"Ō";s:3:"Ō";s:2:"ō";s:3:"ō";s:2:"Ŏ";s:3:"Ŏ";s:2:"ŏ";s:3:"ŏ";s:2:"Ő";s:3:"Ő";s:2:"ő";s:3:"ő";s:2:"Ŕ";s:3:"Ŕ";s:2:"ŕ";s:3:"ŕ";s:2:"Ŗ";s:3:"Ŗ";s:2:"ŗ";s:3:"ŗ";s:2:"Ř";s:3:"Ř";s:2:"ř";s:3:"ř";s:2:"Ś";s:3:"Ś";s:2:"ś";s:3:"ś";s:2:"Ŝ";s:3:"Ŝ";s:2:"ŝ";s:3:"ŝ";s:2:"Ş";s:3:"Ş";s:2:"ş";s:3:"ş";s:2:"Š";s:3:"Š";s:2:"š";s:3:"š";s:2:"Ţ";s:3:"Ţ";s:2:"ţ";s:3:"ţ";s:2:"Ť";s:3:"Ť";s:2:"ť";s:3:"ť";s:2:"Ũ";s:3:"Ũ";s:2:"ũ";s:3:"ũ";s:2:"Ū";s:3:"Ū";s:2:"ū";s:3:"ū";s:2:"Ŭ";s:3:"Ŭ";s:2:"ŭ";s:3:"ŭ";s:2:"Ů";s:3:"Ů";s:2:"ů";s:3:"ů";s:2:"Ű";s:3:"Ű";s:2:"ű";s:3:"ű";s:2:"Ų";s:3:"Ų";s:2:"ų";s:3:"ų";s:2:"Ŵ";s:3:"Ŵ";s:2:"ŵ";s:3:"ŵ";s:2:"Ŷ";s:3:"Ŷ";s:2:"ŷ";s:3:"ŷ";s:2:"Ÿ";s:3:"Ÿ";s:2:"Ź";s:3:"Ź";s:2:"ź";s:3:"ź";s:2:"Ż";s:3:"Ż";s:2:"ż";s:3:"ż";s:2:"Ž";s:3:"Ž";s:2:"ž";s:3:"ž";s:2:"Ơ";s:3:"Ơ";s:2:"ơ";s:3:"ơ";s:2:"Ư";s:3:"Ư";s:2:"ư";s:3:"ư";s:2:"Ǎ";s:3:"Ǎ";s:2:"ǎ";s:3:"ǎ";s:2:"Ǐ";s:3:"Ǐ";s:2:"ǐ";s:3:"ǐ";s:2:"Ǒ";s:3:"Ǒ";s:2:"ǒ";s:3:"ǒ";s:2:"Ǔ";s:3:"Ǔ";s:2:"ǔ";s:3:"ǔ";s:2:"Ǖ";s:5:"Ǖ";s:2:"ǖ";s:5:"ǖ";s:2:"Ǘ";s:5:"Ǘ";s:2:"ǘ";s:5:"ǘ";s:2:"Ǚ";s:5:"Ǚ";s:2:"ǚ";s:5:"ǚ";s:2:"Ǜ";s:5:"Ǜ";s:2:"ǜ";s:5:"ǜ";s:2:"Ǟ";s:5:"Ǟ";s:2:"ǟ";s:5:"ǟ";s:2:"Ǡ";s:5:"Ǡ";s:2:"ǡ";s:5:"ǡ";s:2:"Ǣ";s:4:"Ǣ";s:2:"ǣ";s:4:"ǣ";s:2:"Ǧ";s:3:"Ǧ";s:2:"ǧ";s:3:"ǧ";s:2:"Ǩ";s:3:"Ǩ";s:2:"ǩ";s:3:"ǩ";s:2:"Ǫ";s:3:"Ǫ";s:2:"ǫ";s:3:"ǫ";s:2:"Ǭ";s:5:"Ǭ";s:2:"ǭ";s:5:"ǭ";s:2:"Ǯ";s:4:"Ǯ";s:2:"ǯ";s:4:"ǯ";s:2:"ǰ";s:3:"ǰ";s:2:"Ǵ";s:3:"Ǵ";s:2:"ǵ";s:3:"ǵ";s:2:"Ǹ";s:3:"Ǹ";s:2:"ǹ";s:3:"ǹ";s:2:"Ǻ";s:5:"Ǻ";s:2:"ǻ";s:5:"ǻ";s:2:"Ǽ";s:4:"Ǽ";s:2:"ǽ";s:4:"ǽ";s:2:"Ǿ";s:4:"Ǿ";s:2:"ǿ";s:4:"ǿ";s:2:"Ȁ";s:3:"Ȁ";s:2:"ȁ";s:3:"ȁ";s:2:"Ȃ";s:3:"Ȃ";s:2:"ȃ";s:3:"ȃ";s:2:"Ȅ";s:3:"Ȅ";s:2:"ȅ";s:3:"ȅ";s:2:"Ȇ";s:3:"Ȇ";s:2:"ȇ";s:3:"ȇ";s:2:"Ȉ";s:3:"Ȉ";s:2:"ȉ";s:3:"ȉ";s:2:"Ȋ";s:3:"Ȋ";s:2:"ȋ";s:3:"ȋ";s:2:"Ȍ";s:3:"Ȍ";s:2:"ȍ";s:3:"ȍ";s:2:"Ȏ";s:3:"Ȏ";s:2:"ȏ";s:3:"ȏ";s:2:"Ȑ";s:3:"Ȑ";s:2:"ȑ";s:3:"ȑ";s:2:"Ȓ";s:3:"Ȓ";s:2:"ȓ";s:3:"ȓ";s:2:"Ȕ";s:3:"Ȕ";s:2:"ȕ";s:3:"ȕ";s:2:"Ȗ";s:3:"Ȗ";s:2:"ȗ";s:3:"ȗ";s:2:"Ș";s:3:"Ș";s:2:"ș";s:3:"ș";s:2:"Ț";s:3:"Ț";s:2:"ț";s:3:"ț";s:2:"Ȟ";s:3:"Ȟ";s:2:"ȟ";s:3:"ȟ";s:2:"Ȧ";s:3:"Ȧ";s:2:"ȧ";s:3:"ȧ";s:2:"Ȩ";s:3:"Ȩ";s:2:"ȩ";s:3:"ȩ";s:2:"Ȫ";s:5:"Ȫ";s:2:"ȫ";s:5:"ȫ";s:2:"Ȭ";s:5:"Ȭ";s:2:"ȭ";s:5:"ȭ";s:2:"Ȯ";s:3:"Ȯ";s:2:"ȯ";s:3:"ȯ";s:2:"Ȱ";s:5:"Ȱ";s:2:"ȱ";s:5:"ȱ";s:2:"Ȳ";s:3:"Ȳ";s:2:"ȳ";s:3:"ȳ";s:2:"̀";s:2:"̀";s:2:"́";s:2:"́";s:2:"̓";s:2:"̓";s:2:"̈́";s:4:"̈́";s:2:"ʹ";s:2:"ʹ";s:2:";";s:1:";";s:2:"΅";s:4:"΅";s:2:"Ά";s:4:"Ά";s:2:"·";s:2:"·";s:2:"Έ";s:4:"Έ";s:2:"Ή";s:4:"Ή";s:2:"Ί";s:4:"Ί";s:2:"Ό";s:4:"Ό";s:2:"Ύ";s:4:"Ύ";s:2:"Ώ";s:4:"Ώ";s:2:"ΐ";s:6:"ΐ";s:2:"Ϊ";s:4:"Ϊ";s:2:"Ϋ";s:4:"Ϋ";s:2:"ά";s:4:"ά";s:2:"έ";s:4:"έ";s:2:"ή";s:4:"ή";s:2:"ί";s:4:"ί";s:2:"ΰ";s:6:"ΰ";s:2:"ϊ";s:4:"ϊ";s:2:"ϋ";s:4:"ϋ";s:2:"ό";s:4:"ό";s:2:"ύ";s:4:"ύ";s:2:"ώ";s:4:"ώ";s:2:"ϓ";s:4:"ϓ";s:2:"ϔ";s:4:"ϔ";s:2:"Ѐ";s:4:"Ѐ";s:2:"Ё";s:4:"Ё";s:2:"Ѓ";s:4:"Ѓ";s:2:"Ї";s:4:"Ї";s:2:"Ќ";s:4:"Ќ";s:2:"Ѝ";s:4:"Ѝ";s:2:"Ў";s:4:"Ў";s:2:"Й";s:4:"Й";s:2:"й";s:4:"й";s:2:"ѐ";s:4:"ѐ";s:2:"ё";s:4:"ё";s:2:"ѓ";s:4:"ѓ";s:2:"ї";s:4:"ї";s:2:"ќ";s:4:"ќ";s:2:"ѝ";s:4:"ѝ";s:2:"ў";s:4:"ў";s:2:"Ѷ";s:4:"Ѷ";s:2:"ѷ";s:4:"ѷ";s:2:"Ӂ";s:4:"Ӂ";s:2:"ӂ";s:4:"ӂ";s:2:"Ӑ";s:4:"Ӑ";s:2:"ӑ";s:4:"ӑ";s:2:"Ӓ";s:4:"Ӓ";s:2:"ӓ";s:4:"ӓ";s:2:"Ӗ";s:4:"Ӗ";s:2:"ӗ";s:4:"ӗ";s:2:"Ӛ";s:4:"Ӛ";s:2:"ӛ";s:4:"ӛ";s:2:"Ӝ";s:4:"Ӝ";s:2:"ӝ";s:4:"ӝ";s:2:"Ӟ";s:4:"Ӟ";s:2:"ӟ";s:4:"ӟ";s:2:"Ӣ";s:4:"Ӣ";s:2:"ӣ";s:4:"ӣ";s:2:"Ӥ";s:4:"Ӥ";s:2:"ӥ";s:4:"ӥ";s:2:"Ӧ";s:4:"Ӧ";s:2:"ӧ";s:4:"ӧ";s:2:"Ӫ";s:4:"Ӫ";s:2:"ӫ";s:4:"ӫ";s:2:"Ӭ";s:4:"Ӭ";s:2:"ӭ";s:4:"ӭ";s:2:"Ӯ";s:4:"Ӯ";s:2:"ӯ";s:4:"ӯ";s:2:"Ӱ";s:4:"Ӱ";s:2:"ӱ";s:4:"ӱ";s:2:"Ӳ";s:4:"Ӳ";s:2:"ӳ";s:4:"ӳ";s:2:"Ӵ";s:4:"Ӵ";s:2:"ӵ";s:4:"ӵ";s:2:"Ӹ";s:4:"Ӹ";s:2:"ӹ";s:4:"ӹ";s:2:"آ";s:4:"آ";s:2:"أ";s:4:"أ";s:2:"ؤ";s:4:"ؤ";s:2:"إ";s:4:"إ";s:2:"ئ";s:4:"ئ";s:2:"ۀ";s:4:"ۀ";s:2:"ۂ";s:4:"ۂ";s:2:"ۓ";s:4:"ۓ";s:3:"ऩ";s:6:"ऩ";s:3:"ऱ";s:6:"ऱ";s:3:"ऴ";s:6:"ऴ";s:3:"क़";s:6:"क़";s:3:"ख़";s:6:"ख़";s:3:"ग़";s:6:"ग़";s:3:"ज़";s:6:"ज़";s:3:"ड़";s:6:"ड़";s:3:"ढ़";s:6:"ढ़";s:3:"फ़";s:6:"फ़";s:3:"य़";s:6:"य़";s:3:"ো";s:6:"ো";s:3:"ৌ";s:6:"ৌ";s:3:"ড়";s:6:"ড়";s:3:"ঢ়";s:6:"ঢ়";s:3:"য়";s:6:"য়";s:3:"ਲ਼";s:6:"ਲ਼";s:3:"ਸ਼";s:6:"ਸ਼";s:3:"ਖ਼";s:6:"ਖ਼";s:3:"ਗ਼";s:6:"ਗ਼";s:3:"ਜ਼";s:6:"ਜ਼";s:3:"ਫ਼";s:6:"ਫ਼";s:3:"ୈ";s:6:"ୈ";s:3:"ୋ";s:6:"ୋ";s:3:"ୌ";s:6:"ୌ";s:3:"ଡ଼";s:6:"ଡ଼";s:3:"ଢ଼";s:6:"ଢ଼";s:3:"ஔ";s:6:"ஔ";s:3:"ொ";s:6:"ொ";s:3:"ோ";s:6:"ோ";s:3:"ௌ";s:6:"ௌ";s:3:"ై";s:6:"ై";s:3:"ೀ";s:6:"ೀ";s:3:"ೇ";s:6:"ೇ";s:3:"ೈ";s:6:"ೈ";s:3:"ೊ";s:6:"ೊ";s:3:"ೋ";s:9:"ೋ";s:3:"ൊ";s:6:"ൊ";s:3:"ോ";s:6:"ോ";s:3:"ൌ";s:6:"ൌ";s:3:"ේ";s:6:"ේ";s:3:"ො";s:6:"ො";s:3:"ෝ";s:9:"ෝ";s:3:"ෞ";s:6:"ෞ";s:3:"གྷ";s:6:"གྷ";s:3:"ཌྷ";s:6:"ཌྷ";s:3:"དྷ";s:6:"དྷ";s:3:"བྷ";s:6:"བྷ";s:3:"ཛྷ";s:6:"ཛྷ";s:3:"ཀྵ";s:6:"ཀྵ";s:3:"ཱི";s:6:"ཱི";s:3:"ཱུ";s:6:"ཱུ";s:3:"ྲྀ";s:6:"ྲྀ";s:3:"ླྀ";s:6:"ླྀ";s:3:"ཱྀ";s:6:"ཱྀ";s:3:"ྒྷ";s:6:"ྒྷ";s:3:"ྜྷ";s:6:"ྜྷ";s:3:"ྡྷ";s:6:"ྡྷ";s:3:"ྦྷ";s:6:"ྦྷ";s:3:"ྫྷ";s:6:"ྫྷ";s:3:"ྐྵ";s:6:"ྐྵ";s:3:"ဦ";s:6:"ဦ";s:3:"ᬆ";s:6:"ᬆ";s:3:"ᬈ";s:6:"ᬈ";s:3:"ᬊ";s:6:"ᬊ";s:3:"ᬌ";s:6:"ᬌ";s:3:"ᬎ";s:6:"ᬎ";s:3:"ᬒ";s:6:"ᬒ";s:3:"ᬻ";s:6:"ᬻ";s:3:"ᬽ";s:6:"ᬽ";s:3:"ᭀ";s:6:"ᭀ";s:3:"ᭁ";s:6:"ᭁ";s:3:"ᭃ";s:6:"ᭃ";s:3:"Ḁ";s:3:"Ḁ";s:3:"ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"Ḅ";s:3:"ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:3:"Ḉ";s:5:"Ḉ";s:3:"ḉ";s:5:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"Ḍ";s:3:"ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"Ḓ";s:3:"ḓ";s:3:"ḓ";s:3:"Ḕ";s:5:"Ḕ";s:3:"ḕ";s:5:"ḕ";s:3:"Ḗ";s:5:"Ḗ";s:3:"ḗ";s:5:"ḗ";s:3:"Ḙ";s:3:"Ḙ";s:3:"ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:3:"Ḝ";s:5:"Ḝ";s:3:"ḝ";s:5:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"Ḡ";s:3:"ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"Ḥ";s:3:"ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"Ḫ";s:3:"ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:3:"Ḯ";s:5:"Ḯ";s:3:"ḯ";s:5:"ḯ";s:3:"Ḱ";s:3:"Ḱ";s:3:"ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"Ḳ";s:3:"ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"Ḷ";s:3:"ḷ";s:3:"ḷ";s:3:"Ḹ";s:5:"Ḹ";s:3:"ḹ";s:5:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"Ḽ";s:3:"ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"Ḿ";s:3:"ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"Ṁ";s:3:"ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"Ṃ";s:3:"ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"Ṇ";s:3:"ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"Ṋ";s:3:"ṋ";s:3:"ṋ";s:3:"Ṍ";s:5:"Ṍ";s:3:"ṍ";s:5:"ṍ";s:3:"Ṏ";s:5:"Ṏ";s:3:"ṏ";s:5:"ṏ";s:3:"Ṑ";s:5:"Ṑ";s:3:"ṑ";s:5:"ṑ";s:3:"Ṓ";s:5:"Ṓ";s:3:"ṓ";s:5:"ṓ";s:3:"Ṕ";s:3:"Ṕ";s:3:"ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"Ṗ";s:3:"ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"Ṛ";s:3:"ṛ";s:3:"ṛ";s:3:"Ṝ";s:5:"Ṝ";s:3:"ṝ";s:5:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"Ṣ";s:3:"ṣ";s:3:"ṣ";s:3:"Ṥ";s:5:"Ṥ";s:3:"ṥ";s:5:"ṥ";s:3:"Ṧ";s:5:"Ṧ";s:3:"ṧ";s:5:"ṧ";s:3:"Ṩ";s:5:"Ṩ";s:3:"ṩ";s:5:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"Ṭ";s:3:"ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"Ṱ";s:3:"ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"Ṳ";s:3:"ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"Ṵ";s:3:"ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"Ṷ";s:3:"ṷ";s:3:"ṷ";s:3:"Ṹ";s:5:"Ṹ";s:3:"ṹ";s:5:"ṹ";s:3:"Ṻ";s:5:"Ṻ";s:3:"ṻ";s:5:"ṻ";s:3:"Ṽ";s:3:"Ṽ";s:3:"ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"Ṿ";s:3:"ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"Ẁ";s:3:"ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"Ẃ";s:3:"ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"Ẉ";s:3:"ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"Ẑ";s:3:"ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"Ẓ";s:3:"ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"ẘ";s:3:"ẙ";s:3:"ẙ";s:3:"ẛ";s:4:"ẛ";s:3:"Ạ";s:3:"Ạ";s:3:"ạ";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:3:"Ấ";s:5:"Ấ";s:3:"ấ";s:5:"ấ";s:3:"Ầ";s:5:"Ầ";s:3:"ầ";s:5:"ầ";s:3:"Ẩ";s:5:"Ẩ";s:3:"ẩ";s:5:"ẩ";s:3:"Ẫ";s:5:"Ẫ";s:3:"ẫ";s:5:"ẫ";s:3:"Ậ";s:5:"Ậ";s:3:"ậ";s:5:"ậ";s:3:"Ắ";s:5:"Ắ";s:3:"ắ";s:5:"ắ";s:3:"Ằ";s:5:"Ằ";s:3:"ằ";s:5:"ằ";s:3:"Ẳ";s:5:"Ẳ";s:3:"ẳ";s:5:"ẳ";s:3:"Ẵ";s:5:"Ẵ";s:3:"ẵ";s:5:"ẵ";s:3:"Ặ";s:5:"Ặ";s:3:"ặ";s:5:"ặ";s:3:"Ẹ";s:3:"Ẹ";s:3:"ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:3:"Ế";s:5:"Ế";s:3:"ế";s:5:"ế";s:3:"Ề";s:5:"Ề";s:3:"ề";s:5:"ề";s:3:"Ể";s:5:"Ể";s:3:"ể";s:5:"ể";s:3:"Ễ";s:5:"Ễ";s:3:"ễ";s:5:"ễ";s:3:"Ệ";s:5:"Ệ";s:3:"ệ";s:5:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"Ị";s:3:"ị";s:3:"ị";s:3:"Ọ";s:3:"Ọ";s:3:"ọ";s:3:"ọ";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"ỏ";s:3:"Ố";s:5:"Ố";s:3:"ố";s:5:"ố";s:3:"Ồ";s:5:"Ồ";s:3:"ồ";s:5:"ồ";s:3:"Ổ";s:5:"Ổ";s:3:"ổ";s:5:"ổ";s:3:"Ỗ";s:5:"Ỗ";s:3:"ỗ";s:5:"ỗ";s:3:"Ộ";s:5:"Ộ";s:3:"ộ";s:5:"ộ";s:3:"Ớ";s:5:"Ớ";s:3:"ớ";s:5:"ớ";s:3:"Ờ";s:5:"Ờ";s:3:"ờ";s:5:"ờ";s:3:"Ở";s:5:"Ở";s:3:"ở";s:5:"ở";s:3:"Ỡ";s:5:"Ỡ";s:3:"ỡ";s:5:"ỡ";s:3:"Ợ";s:5:"Ợ";s:3:"ợ";s:5:"ợ";s:3:"Ụ";s:3:"Ụ";s:3:"ụ";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:3:"Ứ";s:5:"Ứ";s:3:"ứ";s:5:"ứ";s:3:"Ừ";s:5:"Ừ";s:3:"ừ";s:5:"ừ";s:3:"Ử";s:5:"Ử";s:3:"ử";s:5:"ử";s:3:"Ữ";s:5:"Ữ";s:3:"ữ";s:5:"ữ";s:3:"Ự";s:5:"Ự";s:3:"ự";s:5:"ự";s:3:"Ỳ";s:3:"Ỳ";s:3:"ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"Ỵ";s:3:"ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:3:"ἀ";s:4:"ἀ";s:3:"ἁ";s:4:"ἁ";s:3:"ἂ";s:6:"ἂ";s:3:"ἃ";s:6:"ἃ";s:3:"ἄ";s:6:"ἄ";s:3:"ἅ";s:6:"ἅ";s:3:"ἆ";s:6:"ἆ";s:3:"ἇ";s:6:"ἇ";s:3:"Ἀ";s:4:"Ἀ";s:3:"Ἁ";s:4:"Ἁ";s:3:"Ἂ";s:6:"Ἂ";s:3:"Ἃ";s:6:"Ἃ";s:3:"Ἄ";s:6:"Ἄ";s:3:"Ἅ";s:6:"Ἅ";s:3:"Ἆ";s:6:"Ἆ";s:3:"Ἇ";s:6:"Ἇ";s:3:"ἐ";s:4:"ἐ";s:3:"ἑ";s:4:"ἑ";s:3:"ἒ";s:6:"ἒ";s:3:"ἓ";s:6:"ἓ";s:3:"ἔ";s:6:"ἔ";s:3:"ἕ";s:6:"ἕ";s:3:"Ἐ";s:4:"Ἐ";s:3:"Ἑ";s:4:"Ἑ";s:3:"Ἒ";s:6:"Ἒ";s:3:"Ἓ";s:6:"Ἓ";s:3:"Ἔ";s:6:"Ἔ";s:3:"Ἕ";s:6:"Ἕ";s:3:"ἠ";s:4:"ἠ";s:3:"ἡ";s:4:"ἡ";s:3:"ἢ";s:6:"ἢ";s:3:"ἣ";s:6:"ἣ";s:3:"ἤ";s:6:"ἤ";s:3:"ἥ";s:6:"ἥ";s:3:"ἦ";s:6:"ἦ";s:3:"ἧ";s:6:"ἧ";s:3:"Ἠ";s:4:"Ἠ";s:3:"Ἡ";s:4:"Ἡ";s:3:"Ἢ";s:6:"Ἢ";s:3:"Ἣ";s:6:"Ἣ";s:3:"Ἤ";s:6:"Ἤ";s:3:"Ἥ";s:6:"Ἥ";s:3:"Ἦ";s:6:"Ἦ";s:3:"Ἧ";s:6:"Ἧ";s:3:"ἰ";s:4:"ἰ";s:3:"ἱ";s:4:"ἱ";s:3:"ἲ";s:6:"ἲ";s:3:"ἳ";s:6:"ἳ";s:3:"ἴ";s:6:"ἴ";s:3:"ἵ";s:6:"ἵ";s:3:"ἶ";s:6:"ἶ";s:3:"ἷ";s:6:"ἷ";s:3:"Ἰ";s:4:"Ἰ";s:3:"Ἱ";s:4:"Ἱ";s:3:"Ἲ";s:6:"Ἲ";s:3:"Ἳ";s:6:"Ἳ";s:3:"Ἴ";s:6:"Ἴ";s:3:"Ἵ";s:6:"Ἵ";s:3:"Ἶ";s:6:"Ἶ";s:3:"Ἷ";s:6:"Ἷ";s:3:"ὀ";s:4:"ὀ";s:3:"ὁ";s:4:"ὁ";s:3:"ὂ";s:6:"ὂ";s:3:"ὃ";s:6:"ὃ";s:3:"ὄ";s:6:"ὄ";s:3:"ὅ";s:6:"ὅ";s:3:"Ὀ";s:4:"Ὀ";s:3:"Ὁ";s:4:"Ὁ";s:3:"Ὂ";s:6:"Ὂ";s:3:"Ὃ";s:6:"Ὃ";s:3:"Ὄ";s:6:"Ὄ";s:3:"Ὅ";s:6:"Ὅ";s:3:"ὐ";s:4:"ὐ";s:3:"ὑ";s:4:"ὑ";s:3:"ὒ";s:6:"ὒ";s:3:"ὓ";s:6:"ὓ";s:3:"ὔ";s:6:"ὔ";s:3:"ὕ";s:6:"ὕ";s:3:"ὖ";s:6:"ὖ";s:3:"ὗ";s:6:"ὗ";s:3:"Ὑ";s:4:"Ὑ";s:3:"Ὓ";s:6:"Ὓ";s:3:"Ὕ";s:6:"Ὕ";s:3:"Ὗ";s:6:"Ὗ";s:3:"ὠ";s:4:"ὠ";s:3:"ὡ";s:4:"ὡ";s:3:"ὢ";s:6:"ὢ";s:3:"ὣ";s:6:"ὣ";s:3:"ὤ";s:6:"ὤ";s:3:"ὥ";s:6:"ὥ";s:3:"ὦ";s:6:"ὦ";s:3:"ὧ";s:6:"ὧ";s:3:"Ὠ";s:4:"Ὠ";s:3:"Ὡ";s:4:"Ὡ";s:3:"Ὢ";s:6:"Ὢ";s:3:"Ὣ";s:6:"Ὣ";s:3:"Ὤ";s:6:"Ὤ";s:3:"Ὥ";s:6:"Ὥ";s:3:"Ὦ";s:6:"Ὦ";s:3:"Ὧ";s:6:"Ὧ";s:3:"ὰ";s:4:"ὰ";s:3:"ά";s:4:"ά";s:3:"ὲ";s:4:"ὲ";s:3:"έ";s:4:"έ";s:3:"ὴ";s:4:"ὴ";s:3:"ή";s:4:"ή";s:3:"ὶ";s:4:"ὶ";s:3:"ί";s:4:"ί";s:3:"ὸ";s:4:"ὸ";s:3:"ό";s:4:"ό";s:3:"ὺ";s:4:"ὺ";s:3:"ύ";s:4:"ύ";s:3:"ὼ";s:4:"ὼ";s:3:"ώ";s:4:"ώ";s:3:"ᾀ";s:6:"ᾀ";s:3:"ᾁ";s:6:"ᾁ";s:3:"ᾂ";s:8:"ᾂ";s:3:"ᾃ";s:8:"ᾃ";s:3:"ᾄ";s:8:"ᾄ";s:3:"ᾅ";s:8:"ᾅ";s:3:"ᾆ";s:8:"ᾆ";s:3:"ᾇ";s:8:"ᾇ";s:3:"ᾈ";s:6:"ᾈ";s:3:"ᾉ";s:6:"ᾉ";s:3:"ᾊ";s:8:"ᾊ";s:3:"ᾋ";s:8:"ᾋ";s:3:"ᾌ";s:8:"ᾌ";s:3:"ᾍ";s:8:"ᾍ";s:3:"ᾎ";s:8:"ᾎ";s:3:"ᾏ";s:8:"ᾏ";s:3:"ᾐ";s:6:"ᾐ";s:3:"ᾑ";s:6:"ᾑ";s:3:"ᾒ";s:8:"ᾒ";s:3:"ᾓ";s:8:"ᾓ";s:3:"ᾔ";s:8:"ᾔ";s:3:"ᾕ";s:8:"ᾕ";s:3:"ᾖ";s:8:"ᾖ";s:3:"ᾗ";s:8:"ᾗ";s:3:"ᾘ";s:6:"ᾘ";s:3:"ᾙ";s:6:"ᾙ";s:3:"ᾚ";s:8:"ᾚ";s:3:"ᾛ";s:8:"ᾛ";s:3:"ᾜ";s:8:"ᾜ";s:3:"ᾝ";s:8:"ᾝ";s:3:"ᾞ";s:8:"ᾞ";s:3:"ᾟ";s:8:"ᾟ";s:3:"ᾠ";s:6:"ᾠ";s:3:"ᾡ";s:6:"ᾡ";s:3:"ᾢ";s:8:"ᾢ";s:3:"ᾣ";s:8:"ᾣ";s:3:"ᾤ";s:8:"ᾤ";s:3:"ᾥ";s:8:"ᾥ";s:3:"ᾦ";s:8:"ᾦ";s:3:"ᾧ";s:8:"ᾧ";s:3:"ᾨ";s:6:"ᾨ";s:3:"ᾩ";s:6:"ᾩ";s:3:"ᾪ";s:8:"ᾪ";s:3:"ᾫ";s:8:"ᾫ";s:3:"ᾬ";s:8:"ᾬ";s:3:"ᾭ";s:8:"ᾭ";s:3:"ᾮ";s:8:"ᾮ";s:3:"ᾯ";s:8:"ᾯ";s:3:"ᾰ";s:4:"ᾰ";s:3:"ᾱ";s:4:"ᾱ";s:3:"ᾲ";s:6:"ᾲ";s:3:"ᾳ";s:4:"ᾳ";s:3:"ᾴ";s:6:"ᾴ";s:3:"ᾶ";s:4:"ᾶ";s:3:"ᾷ";s:6:"ᾷ";s:3:"Ᾰ";s:4:"Ᾰ";s:3:"Ᾱ";s:4:"Ᾱ";s:3:"Ὰ";s:4:"Ὰ";s:3:"Ά";s:4:"Ά";s:3:"ᾼ";s:4:"ᾼ";s:3:"ι";s:2:"ι";s:3:"῁";s:4:"῁";s:3:"ῂ";s:6:"ῂ";s:3:"ῃ";s:4:"ῃ";s:3:"ῄ";s:6:"ῄ";s:3:"ῆ";s:4:"ῆ";s:3:"ῇ";s:6:"ῇ";s:3:"Ὲ";s:4:"Ὲ";s:3:"Έ";s:4:"Έ";s:3:"Ὴ";s:4:"Ὴ";s:3:"Ή";s:4:"Ή";s:3:"ῌ";s:4:"ῌ";s:3:"῍";s:5:"῍";s:3:"῎";s:5:"῎";s:3:"῏";s:5:"῏";s:3:"ῐ";s:4:"ῐ";s:3:"ῑ";s:4:"ῑ";s:3:"ῒ";s:6:"ῒ";s:3:"ΐ";s:6:"ΐ";s:3:"ῖ";s:4:"ῖ";s:3:"ῗ";s:6:"ῗ";s:3:"Ῐ";s:4:"Ῐ";s:3:"Ῑ";s:4:"Ῑ";s:3:"Ὶ";s:4:"Ὶ";s:3:"Ί";s:4:"Ί";s:3:"῝";s:5:"῝";s:3:"῞";s:5:"῞";s:3:"῟";s:5:"῟";s:3:"ῠ";s:4:"ῠ";s:3:"ῡ";s:4:"ῡ";s:3:"ῢ";s:6:"ῢ";s:3:"ΰ";s:6:"ΰ";s:3:"ῤ";s:4:"ῤ";s:3:"ῥ";s:4:"ῥ";s:3:"ῦ";s:4:"ῦ";s:3:"ῧ";s:6:"ῧ";s:3:"Ῠ";s:4:"Ῠ";s:3:"Ῡ";s:4:"Ῡ";s:3:"Ὺ";s:4:"Ὺ";s:3:"Ύ";s:4:"Ύ";s:3:"Ῥ";s:4:"Ῥ";s:3:"῭";s:4:"῭";s:3:"΅";s:4:"΅";s:3:"`";s:1:"`";s:3:"ῲ";s:6:"ῲ";s:3:"ῳ";s:4:"ῳ";s:3:"ῴ";s:6:"ῴ";s:3:"ῶ";s:4:"ῶ";s:3:"ῷ";s:6:"ῷ";s:3:"Ὸ";s:4:"Ὸ";s:3:"Ό";s:4:"Ό";s:3:"Ὼ";s:4:"Ὼ";s:3:"Ώ";s:4:"Ώ";s:3:"ῼ";s:4:"ῼ";s:3:"´";s:2:"´";s:3:" ";s:3:" ";s:3:" ";s:3:" ";s:3:"Ω";s:2:"Ω";s:3:"K";s:1:"K";s:3:"Å";s:3:"Å";s:3:"↚";s:5:"↚";s:3:"↛";s:5:"↛";s:3:"↮";s:5:"↮";s:3:"⇍";s:5:"⇍";s:3:"⇎";s:5:"⇎";s:3:"⇏";s:5:"⇏";s:3:"∄";s:5:"∄";s:3:"∉";s:5:"∉";s:3:"∌";s:5:"∌";s:3:"∤";s:5:"∤";s:3:"∦";s:5:"∦";s:3:"≁";s:5:"≁";s:3:"≄";s:5:"≄";s:3:"≇";s:5:"≇";s:3:"≉";s:5:"≉";s:3:"≠";s:3:"≠";s:3:"≢";s:5:"≢";s:3:"≭";s:5:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:3:"≰";s:5:"≰";s:3:"≱";s:5:"≱";s:3:"≴";s:5:"≴";s:3:"≵";s:5:"≵";s:3:"≸";s:5:"≸";s:3:"≹";s:5:"≹";s:3:"⊀";s:5:"⊀";s:3:"⊁";s:5:"⊁";s:3:"⊄";s:5:"⊄";s:3:"⊅";s:5:"⊅";s:3:"⊈";s:5:"⊈";s:3:"⊉";s:5:"⊉";s:3:"⊬";s:5:"⊬";s:3:"⊭";s:5:"⊭";s:3:"⊮";s:5:"⊮";s:3:"⊯";s:5:"⊯";s:3:"⋠";s:5:"⋠";s:3:"⋡";s:5:"⋡";s:3:"⋢";s:5:"⋢";s:3:"⋣";s:5:"⋣";s:3:"⋪";s:5:"⋪";s:3:"⋫";s:5:"⋫";s:3:"⋬";s:5:"⋬";s:3:"⋭";s:5:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:3:"⫝̸";s:5:"⫝̸";s:3:"が";s:6:"が";s:3:"ぎ";s:6:"ぎ";s:3:"ぐ";s:6:"ぐ";s:3:"げ";s:6:"げ";s:3:"ご";s:6:"ご";s:3:"ざ";s:6:"ざ";s:3:"じ";s:6:"じ";s:3:"ず";s:6:"ず";s:3:"ぜ";s:6:"ぜ";s:3:"ぞ";s:6:"ぞ";s:3:"だ";s:6:"だ";s:3:"ぢ";s:6:"ぢ";s:3:"づ";s:6:"づ";s:3:"で";s:6:"で";s:3:"ど";s:6:"ど";s:3:"ば";s:6:"ば";s:3:"ぱ";s:6:"ぱ";s:3:"び";s:6:"び";s:3:"ぴ";s:6:"ぴ";s:3:"ぶ";s:6:"ぶ";s:3:"ぷ";s:6:"ぷ";s:3:"べ";s:6:"べ";s:3:"ぺ";s:6:"ぺ";s:3:"ぼ";s:6:"ぼ";s:3:"ぽ";s:6:"ぽ";s:3:"ゔ";s:6:"ゔ";s:3:"ゞ";s:6:"ゞ";s:3:"ガ";s:6:"ガ";s:3:"ギ";s:6:"ギ";s:3:"グ";s:6:"グ";s:3:"ゲ";s:6:"ゲ";s:3:"ゴ";s:6:"ゴ";s:3:"ザ";s:6:"ザ";s:3:"ジ";s:6:"ジ";s:3:"ズ";s:6:"ズ";s:3:"ゼ";s:6:"ゼ";s:3:"ゾ";s:6:"ゾ";s:3:"ダ";s:6:"ダ";s:3:"ヂ";s:6:"ヂ";s:3:"ヅ";s:6:"ヅ";s:3:"デ";s:6:"デ";s:3:"ド";s:6:"ド";s:3:"バ";s:6:"バ";s:3:"パ";s:6:"パ";s:3:"ビ";s:6:"ビ";s:3:"ピ";s:6:"ピ";s:3:"ブ";s:6:"ブ";s:3:"プ";s:6:"プ";s:3:"ベ";s:6:"ベ";s:3:"ペ";s:6:"ペ";s:3:"ボ";s:6:"ボ";s:3:"ポ";s:6:"ポ";s:3:"ヴ";s:6:"ヴ";s:3:"ヷ";s:6:"ヷ";s:3:"ヸ";s:6:"ヸ";s:3:"ヹ";s:6:"ヹ";s:3:"ヺ";s:6:"ヺ";s:3:"ヾ";s:6:"ヾ";s:3:"豈";s:3:"豈";s:3:"更";s:3:"更";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"句";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"羅";s:3:"羅";s:3:"蘿";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"珞";s:3:"落";s:3:"落";s:3:"酪";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"卵";s:3:"欄";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"嵐";s:3:"濫";s:3:"濫";s:3:"藍";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"蠟";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"擄";s:3:"櫓";s:3:"櫓";s:3:"爐";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"老";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"路";s:3:"露";s:3:"露";s:3:"魯";s:3:"魯";s:3:"鷺";s:3:"鷺";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"論";s:3:"論";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"籠";s:3:"聾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"淚";s:3:"淚";s:3:"漏";s:3:"漏";s:3:"累";s:3:"累";s:3:"縷";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"勒";s:3:"肋";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"拏";s:3:"樂";s:3:"樂";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"異";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"索";s:3:"參";s:3:"參";s:3:"塞";s:3:"塞";s:3:"省";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"若";s:3:"掠";s:3:"掠";s:3:"略";s:3:"略";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"諒";s:3:"量";s:3:"量";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"呂";s:3:"女";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"歷";s:3:"轢";s:3:"轢";s:3:"年";s:3:"年";s:3:"憐";s:3:"憐";s:3:"戀";s:3:"戀";s:3:"撚";s:3:"撚";s:3:"漣";s:3:"漣";s:3:"煉";s:3:"煉";s:3:"璉";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"練";s:3:"練";s:3:"聯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"蓮";s:3:"連";s:3:"連";s:3:"鍊";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"劣";s:3:"咽";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"捻";s:3:"殮";s:3:"殮";s:3:"簾";s:3:"簾";s:3:"獵";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"靈";s:3:"領";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"尿";s:3:"料";s:3:"料";s:3:"樂";s:3:"樂";s:3:"燎";s:3:"燎";s:3:"療";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"遼";s:3:"龍";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"流";s:3:"流";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"琉";s:3:"留";s:3:"留";s:3:"硫";s:3:"硫";s:3:"紐";s:3:"紐";s:3:"類";s:3:"類";s:3:"六";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"崙";s:3:"淪";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"慄";s:3:"栗";s:3:"栗";s:3:"率";s:3:"率";s:3:"隆";s:3:"隆";s:3:"利";s:3:"利";s:3:"吏";s:3:"吏";s:3:"履";s:3:"履";s:3:"易";s:3:"易";s:3:"李";s:3:"李";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"泥";s:3:"理";s:3:"理";s:3:"痢";s:3:"痢";s:3:"罹";s:3:"罹";s:3:"裏";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"吝";s:3:"燐";s:3:"燐";s:3:"璘";s:3:"璘";s:3:"藺";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"林";s:3:"林";s:3:"淋";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"立";s:3:"立";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"粒";s:3:"狀";s:3:"狀";s:3:"炙";s:3:"炙";s:3:"識";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:3:"切";s:3:"度";s:3:"度";s:3:"拓";s:3:"拓";s:3:"糖";s:3:"糖";s:3:"宅";s:3:"宅";s:3:"洞";s:3:"洞";s:3:"暴";s:3:"暴";s:3:"輻";s:3:"輻";s:3:"行";s:3:"行";s:3:"降";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"兀";s:3:"嗀";s:3:"嗀";s:3:"塚";s:3:"塚";s:3:"晴";s:3:"晴";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"福";s:3:"靖";s:3:"靖";s:3:"精";s:3:"精";s:3:"羽";s:3:"羽";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:3:"侮";s:3:"僧";s:3:"僧";s:3:"免";s:3:"免";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"卑";s:3:"喝";s:3:"喝";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"屮";s:3:"悔";s:3:"悔";s:3:"慨";s:3:"慨";s:3:"憎";s:3:"憎";s:3:"懲";s:3:"懲";s:3:"敏";s:3:"敏";s:3:"既";s:3:"既";s:3:"暑";s:3:"暑";s:3:"梅";s:3:"梅";s:3:"海";s:3:"海";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"漢";s:3:"煮";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"琢";s:3:"碑";s:3:"碑";s:3:"社";s:3:"社";s:3:"祉";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"祐";s:3:"祐";s:3:"祖";s:3:"祖";s:3:"祝";s:3:"祝";s:3:"禍";s:3:"禍";s:3:"禎";s:3:"禎";s:3:"穀";s:3:"穀";s:3:"突";s:3:"突";s:3:"節";s:3:"節";s:3:"練";s:3:"練";s:3:"縉";s:3:"縉";s:3:"繁";s:3:"繁";s:3:"署";s:3:"署";s:3:"者";s:3:"者";s:3:"臭";s:3:"臭";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"著";s:3:"著";s:3:"褐";s:3:"褐";s:3:"視";s:3:"視";s:3:"謁";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"贈";s:3:"贈";s:3:"辶";s:3:"辶";s:3:"逸";s:3:"逸";s:3:"難";s:3:"難";s:3:"響";s:3:"響";s:3:"頻";s:3:"頻";s:3:"恵";s:3:"恵";s:3:"𤋮";s:4:"𤋮";s:3:"舘";s:3:"舘";s:3:"並";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"全";s:3:"侀";s:3:"侀";s:3:"充";s:3:"充";s:3:"冀";s:3:"冀";s:3:"勇";s:3:"勇";s:3:"勺";s:3:"勺";s:3:"喝";s:3:"喝";s:3:"啕";s:3:"啕";s:3:"喙";s:3:"喙";s:3:"嗢";s:3:"嗢";s:3:"塚";s:3:"塚";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"奔";s:3:"婢";s:3:"婢";s:3:"嬨";s:3:"嬨";s:3:"廒";s:3:"廒";s:3:"廙";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"慎";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"慠";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"揄";s:3:"揄";s:3:"搜";s:3:"搜";s:3:"摒";s:3:"摒";s:3:"敖";s:3:"敖";s:3:"晴";s:3:"晴";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"杖";s:3:"歹";s:3:"歹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"流";s:3:"滛";s:3:"滛";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"漢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"煮";s:3:"瞧";s:3:"瞧";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"画";s:3:"瘝";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"盛";s:3:"直";s:3:"直";s:3:"睊";s:3:"睊";s:3:"着";s:3:"着";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"类";s:3:"絛";s:3:"絛";s:3:"練";s:3:"練";s:3:"缾";s:3:"缾";s:3:"者";s:3:"者";s:3:"荒";s:3:"荒";s:3:"華";s:3:"華";s:3:"蝹";s:3:"蝹";s:3:"襁";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"請";s:3:"謁";s:3:"謁";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"諭";s:3:"謹";s:3:"謹";s:3:"變";s:3:"變";s:3:"贈";s:3:"贈";s:3:"輸";s:3:"輸";s:3:"遲";s:3:"遲";s:3:"醙";s:3:"醙";s:3:"鉶";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"靖";s:3:"韛";s:3:"韛";s:3:"響";s:3:"響";s:3:"頋";s:3:"頋";s:3:"頻";s:3:"頻";s:3:"鬒";s:3:"鬒";s:3:"龜";s:3:"龜";s:3:"𢡊";s:4:"𢡊";s:3:"𢡄";s:4:"𢡄";s:3:"𣏕";s:4:"𣏕";s:3:"㮝";s:3:"㮝";s:3:"䀘";s:3:"䀘";s:3:"䀹";s:3:"䀹";s:3:"𥉉";s:4:"𥉉";s:3:"𥳐";s:4:"𥳐";s:3:"𧻓";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"龎";s:3:"יִ";s:4:"יִ";s:3:"ײַ";s:4:"ײַ";s:3:"שׁ";s:4:"שׁ";s:3:"שׂ";s:4:"שׂ";s:3:"שּׁ";s:6:"שּׁ";s:3:"שּׂ";s:6:"שּׂ";s:3:"אַ";s:4:"אַ";s:3:"אָ";s:4:"אָ";s:3:"אּ";s:4:"אּ";s:3:"בּ";s:4:"בּ";s:3:"גּ";s:4:"גּ";s:3:"דּ";s:4:"דּ";s:3:"הּ";s:4:"הּ";s:3:"וּ";s:4:"וּ";s:3:"זּ";s:4:"זּ";s:3:"טּ";s:4:"טּ";s:3:"יּ";s:4:"יּ";s:3:"ךּ";s:4:"ךּ";s:3:"כּ";s:4:"כּ";s:3:"לּ";s:4:"לּ";s:3:"מּ";s:4:"מּ";s:3:"נּ";s:4:"נּ";s:3:"סּ";s:4:"סּ";s:3:"ףּ";s:4:"ףּ";s:3:"פּ";s:4:"פּ";s:3:"צּ";s:4:"צּ";s:3:"קּ";s:4:"קּ";s:3:"רּ";s:4:"רּ";s:3:"שּ";s:4:"שּ";s:3:"תּ";s:4:"תּ";s:3:"וֹ";s:4:"וֹ";s:3:"בֿ";s:4:"בֿ";s:3:"כֿ";s:4:"כֿ";s:3:"פֿ";s:4:"פֿ";s:4:"𑂚";s:8:"𑂚";s:4:"𑂜";s:8:"𑂜";s:4:"𑂫";s:8:"𑂫";s:4:"𝅗𝅥";s:8:"𝅗𝅥";s:4:"𝅘𝅥";s:8:"𝅘𝅥";s:4:"𝅘𝅥𝅮";s:12:"𝅘𝅥𝅮";s:4:"𝅘𝅥𝅯";s:12:"𝅘𝅥𝅯";s:4:"𝅘𝅥𝅰";s:12:"𝅘𝅥𝅰";s:4:"𝅘𝅥𝅱";s:12:"𝅘𝅥𝅱";s:4:"𝅘𝅥𝅲";s:12:"𝅘𝅥𝅲";s:4:"𝆹𝅥";s:8:"𝆹𝅥";s:4:"𝆺𝅥";s:8:"𝆺𝅥";s:4:"𝆹𝅥𝅮";s:12:"𝆹𝅥𝅮";s:4:"𝆺𝅥𝅮";s:12:"𝆺𝅥𝅮";s:4:"𝆹𝅥𝅯";s:12:"𝆹𝅥𝅯";s:4:"𝆺𝅥𝅯";s:12:"𝆺𝅥𝅯";s:4:"丽";s:3:"丽";s:4:"丸";s:3:"丸";s:4:"乁";s:3:"乁";s:4:"𠄢";s:4:"𠄢";s:4:"你";s:3:"你";s:4:"侮";s:3:"侮";s:4:"侻";s:3:"侻";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"偺";s:4:"備";s:3:"備";s:4:"僧";s:3:"僧";s:4:"像";s:3:"像";s:4:"㒞";s:3:"㒞";s:4:"𠘺";s:4:"𠘺";s:4:"免";s:3:"免";s:4:"兔";s:3:"兔";s:4:"兤";s:3:"兤";s:4:"具";s:3:"具";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"㒹";s:4:"內";s:3:"內";s:4:"再";s:3:"再";s:4:"𠕋";s:4:"𠕋";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"凵";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"㓟";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"卉";s:4:"卑";s:3:"卑";s:4:"博";s:3:"博";s:4:"即";s:3:"即";s:4:"卽";s:3:"卽";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"灰";s:4:"及";s:3:"及";s:4:"叟";s:3:"叟";s:4:"𠭣";s:4:"𠭣";s:4:"叫";s:3:"叫";s:4:"叱";s:3:"叱";s:4:"吆";s:3:"吆";s:4:"咞";s:3:"咞";s:4:"吸";s:3:"吸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"咢";s:4:"哶";s:3:"哶";s:4:"唐";s:3:"唐";s:4:"啓";s:3:"啓";s:4:"啣";s:3:"啣";s:4:"善";s:3:"善";s:4:"善";s:3:"善";s:4:"喙";s:3:"喙";s:4:"喫";s:3:"喫";s:4:"喳";s:3:"喳";s:4:"嗂";s:3:"嗂";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"圗";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"噴";s:3:"噴";s:4:"切";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"堍";s:4:"型";s:3:"型";s:4:"堲";s:3:"堲";s:4:"報";s:3:"報";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"多";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"㛮";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"将";s:4:"当";s:3:"当";s:4:"尢";s:3:"尢";s:4:"㞁";s:3:"㞁";s:4:"屠";s:3:"屠";s:4:"屮";s:3:"屮";s:4:"峀";s:3:"峀";s:4:"岍";s:3:"岍";s:4:"𡷤";s:4:"𡷤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"𡷦";s:4:"嵮";s:3:"嵮";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"嵼";s:4:"巡";s:3:"巡";s:4:"巢";s:3:"巢";s:4:"㠯";s:3:"㠯";s:4:"巽";s:3:"巽";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"㡢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"庶";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"𪎒";s:4:"𪎒";s:4:"廾";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"舁";s:4:"弢";s:3:"弢";s:4:"弢";s:3:"弢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"形";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"忍";s:3:"忍";s:4:"志";s:3:"志";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"悁";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"悔";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"慈";s:4:"慌";s:3:"慌";s:4:"慎";s:3:"慎";s:4:"慌";s:3:"慌";s:4:"慺";s:3:"慺";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"成";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"扝";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"拔";s:4:"捐";s:3:"捐";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"捨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"揤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"搢";s:4:"揅";s:3:"揅";s:4:"掩";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"摩";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"撝";s:4:"摷";s:3:"摷";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"敏";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"旣";s:4:"書";s:3:"書";s:4:"晉";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"暑";s:3:"暑";s:4:"㬈";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"暜";s:4:"肭";s:3:"肭";s:4:"䏙";s:3:"䏙";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"杞";s:4:"杓";s:3:"杓";s:4:"𣏃";s:4:"𣏃";s:4:"㭉";s:3:"㭉";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"枅";s:4:"桒";s:3:"桒";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"栟";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"㮝";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"櫛";s:4:"㰘";s:3:"㰘";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"歔";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"歲";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"殻";s:4:"𣪍";s:4:"𣪍";s:4:"𡴋";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"泍";s:4:"汧";s:3:"汧";s:4:"洖";s:3:"洖";s:4:"派";s:3:"派";s:4:"海";s:3:"海";s:4:"流";s:3:"流";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"涅";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"洴";s:4:"港";s:3:"港";s:4:"湮";s:3:"湮";s:4:"㴳";s:3:"㴳";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"𣻑";s:4:"𣻑";s:4:"淹";s:3:"淹";s:4:"潮";s:3:"潮";s:4:"𣽞";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"㶖";s:4:"灊";s:3:"灊";s:4:"災";s:3:"災";s:4:"灷";s:3:"灷";s:4:"炭";s:3:"炭";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"煅";s:4:"𤉣";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"牐";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"獺";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"瑜";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"璅";s:4:"瓊";s:3:"瓊";s:4:"㼛";s:3:"㼛";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"異";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"𥁄";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"直";s:4:"𥃳";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"睊";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"瞋";s:4:"䁆";s:3:"䁆";s:4:"䂖";s:3:"䂖";s:4:"𥐝";s:4:"𥐝";s:4:"硎";s:3:"硎";s:4:"碌";s:3:"碌";s:4:"磌";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"福";s:4:"秫";s:3:"秫";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"穀";s:4:"穊";s:3:"穊";s:4:"穏";s:3:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"竮";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"糒";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"糣";s:4:"紀";s:3:"紀";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"絣";s:4:"䌁";s:3:"䌁";s:4:"緇";s:3:"緇";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"繅";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"䍙";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"聠";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"聰";s:4:"𣍟";s:4:"𣍟";s:4:"䏕";s:3:"䏕";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"䐋";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"舁";s:4:"舄";s:3:"舄";s:4:"辞";s:3:"辞";s:4:"䑫";s:3:"䑫";s:4:"芑";s:3:"芑";s:4:"芋";s:3:"芋";s:4:"芝";s:3:"芝";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"若";s:4:"茝";s:3:"茝";s:4:"荣";s:3:"荣";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"莽";s:3:"莽";s:4:"菧";s:3:"菧";s:4:"著";s:3:"著";s:4:"荓";s:3:"荓";s:4:"菊";s:3:"菊";s:4:"菌";s:3:"菌";s:4:"菜";s:3:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"蔖";s:4:"𧏊";s:4:"𧏊";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"䕝";s:4:"䕡";s:3:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"䕫";s:4:"虐";s:3:"虐";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"虧";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"蚩";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"蝹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"蝫";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"䗗";s:4:"蟡";s:3:"蟡";s:4:"蠁";s:3:"蠁";s:4:"䗹";s:3:"䗹";s:4:"衠";s:3:"衠";s:4:"衣";s:3:"衣";s:4:"𧙧";s:4:"𧙧";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:4:"䚾";s:3:"䚾";s:4:"䛇";s:3:"䛇";s:4:"誠";s:3:"誠";s:4:"諭";s:3:"諭";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"賁";s:4:"贛";s:3:"贛";s:4:"起";s:3:"起";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"𠠄";s:4:"跋";s:3:"跋";s:4:"趼";s:3:"趼";s:4:"跰";s:3:"跰";s:4:"𠣞";s:4:"𠣞";s:4:"軔";s:3:"軔";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"邔";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"鄑";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"鄛";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"鋗";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"鏹";s:4:"鐕";s:3:"鐕";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"開";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"閷";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"嶲";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"䩮";s:4:"䩶";s:3:"䩶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"𩐊";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"𩒖";s:4:"頋";s:3:"頋";s:4:"頋";s:3:"頋";s:4:"頩";s:3:"頩";s:4:"𩖶";s:4:"𩖶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"駂";s:4:"駾";s:3:"駾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"鱀";s:4:"鳽";s:3:"鳽";s:4:"䳎";s:3:"䳎";s:4:"䳭";s:3:"䳭";s:4:"鵧";s:3:"鵧";s:4:"𪃎";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"䵖";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"鼅";s:4:"鼏";s:3:"鼏";s:4:"鼖";s:3:"鼖";s:4:"鼻";s:3:"鼻";s:4:"𪘀";s:4:"𪘀";}' );
index 661d2cd..dde3eff 100644 (file)
@@ -5,6 +5,7 @@
  *
  * @file
  */
+// @codingStandardsIgnoreFile
 
 UtfNormal::$utfCompatibilityDecomp = unserialize( 'a:5559:{s:2:" ";s:1:" ";s:2:"¨";s:3:" ̈";s:2:"ª";s:1:"a";s:2:"¯";s:3:" ̄";s:2:"²";s:1:"2";s:2:"³";s:1:"3";s:2:"´";s:3:" ́";s:2:"µ";s:2:"μ";s:2:"¸";s:3:" ̧";s:2:"¹";s:1:"1";s:2:"º";s:1:"o";s:2:"¼";s:5:"1⁄4";s:2:"½";s:5:"1⁄2";s:2:"¾";s:5:"3⁄4";s:2:"À";s:3:"À";s:2:"Á";s:3:"Á";s:2:"Â";s:3:"Â";s:2:"Ã";s:3:"Ã";s:2:"Ä";s:3:"Ä";s:2:"Å";s:3:"Å";s:2:"Ç";s:3:"Ç";s:2:"È";s:3:"È";s:2:"É";s:3:"É";s:2:"Ê";s:3:"Ê";s:2:"Ë";s:3:"Ë";s:2:"Ì";s:3:"Ì";s:2:"Í";s:3:"Í";s:2:"Î";s:3:"Î";s:2:"Ï";s:3:"Ï";s:2:"Ñ";s:3:"Ñ";s:2:"Ò";s:3:"Ò";s:2:"Ó";s:3:"Ó";s:2:"Ô";s:3:"Ô";s:2:"Õ";s:3:"Õ";s:2:"Ö";s:3:"Ö";s:2:"Ù";s:3:"Ù";s:2:"Ú";s:3:"Ú";s:2:"Û";s:3:"Û";s:2:"Ü";s:3:"Ü";s:2:"Ý";s:3:"Ý";s:2:"à";s:3:"à";s:2:"á";s:3:"á";s:2:"â";s:3:"â";s:2:"ã";s:3:"ã";s:2:"ä";s:3:"ä";s:2:"å";s:3:"å";s:2:"ç";s:3:"ç";s:2:"è";s:3:"è";s:2:"é";s:3:"é";s:2:"ê";s:3:"ê";s:2:"ë";s:3:"ë";s:2:"ì";s:3:"ì";s:2:"í";s:3:"í";s:2:"î";s:3:"î";s:2:"ï";s:3:"ï";s:2:"ñ";s:3:"ñ";s:2:"ò";s:3:"ò";s:2:"ó";s:3:"ó";s:2:"ô";s:3:"ô";s:2:"õ";s:3:"õ";s:2:"ö";s:3:"ö";s:2:"ù";s:3:"ù";s:2:"ú";s:3:"ú";s:2:"û";s:3:"û";s:2:"ü";s:3:"ü";s:2:"ý";s:3:"ý";s:2:"ÿ";s:3:"ÿ";s:2:"Ā";s:3:"Ā";s:2:"ā";s:3:"ā";s:2:"Ă";s:3:"Ă";s:2:"ă";s:3:"ă";s:2:"Ą";s:3:"Ą";s:2:"ą";s:3:"ą";s:2:"Ć";s:3:"Ć";s:2:"ć";s:3:"ć";s:2:"Ĉ";s:3:"Ĉ";s:2:"ĉ";s:3:"ĉ";s:2:"Ċ";s:3:"Ċ";s:2:"ċ";s:3:"ċ";s:2:"Č";s:3:"Č";s:2:"č";s:3:"č";s:2:"Ď";s:3:"Ď";s:2:"ď";s:3:"ď";s:2:"Ē";s:3:"Ē";s:2:"ē";s:3:"ē";s:2:"Ĕ";s:3:"Ĕ";s:2:"ĕ";s:3:"ĕ";s:2:"Ė";s:3:"Ė";s:2:"ė";s:3:"ė";s:2:"Ę";s:3:"Ę";s:2:"ę";s:3:"ę";s:2:"Ě";s:3:"Ě";s:2:"ě";s:3:"ě";s:2:"Ĝ";s:3:"Ĝ";s:2:"ĝ";s:3:"ĝ";s:2:"Ğ";s:3:"Ğ";s:2:"ğ";s:3:"ğ";s:2:"Ġ";s:3:"Ġ";s:2:"ġ";s:3:"ġ";s:2:"Ģ";s:3:"Ģ";s:2:"ģ";s:3:"ģ";s:2:"Ĥ";s:3:"Ĥ";s:2:"ĥ";s:3:"ĥ";s:2:"Ĩ";s:3:"Ĩ";s:2:"ĩ";s:3:"ĩ";s:2:"Ī";s:3:"Ī";s:2:"ī";s:3:"ī";s:2:"Ĭ";s:3:"Ĭ";s:2:"ĭ";s:3:"ĭ";s:2:"Į";s:3:"Į";s:2:"į";s:3:"į";s:2:"İ";s:3:"İ";s:2:"IJ";s:2:"IJ";s:2:"ij";s:2:"ij";s:2:"Ĵ";s:3:"Ĵ";s:2:"ĵ";s:3:"ĵ";s:2:"Ķ";s:3:"Ķ";s:2:"ķ";s:3:"ķ";s:2:"Ĺ";s:3:"Ĺ";s:2:"ĺ";s:3:"ĺ";s:2:"Ļ";s:3:"Ļ";s:2:"ļ";s:3:"ļ";s:2:"Ľ";s:3:"Ľ";s:2:"ľ";s:3:"ľ";s:2:"Ŀ";s:3:"L·";s:2:"ŀ";s:3:"l·";s:2:"Ń";s:3:"Ń";s:2:"ń";s:3:"ń";s:2:"Ņ";s:3:"Ņ";s:2:"ņ";s:3:"ņ";s:2:"Ň";s:3:"Ň";s:2:"ň";s:3:"ň";s:2:"ʼn";s:3:"ʼn";s:2:"Ō";s:3:"Ō";s:2:"ō";s:3:"ō";s:2:"Ŏ";s:3:"Ŏ";s:2:"ŏ";s:3:"ŏ";s:2:"Ő";s:3:"Ő";s:2:"ő";s:3:"ő";s:2:"Ŕ";s:3:"Ŕ";s:2:"ŕ";s:3:"ŕ";s:2:"Ŗ";s:3:"Ŗ";s:2:"ŗ";s:3:"ŗ";s:2:"Ř";s:3:"Ř";s:2:"ř";s:3:"ř";s:2:"Ś";s:3:"Ś";s:2:"ś";s:3:"ś";s:2:"Ŝ";s:3:"Ŝ";s:2:"ŝ";s:3:"ŝ";s:2:"Ş";s:3:"Ş";s:2:"ş";s:3:"ş";s:2:"Š";s:3:"Š";s:2:"š";s:3:"š";s:2:"Ţ";s:3:"Ţ";s:2:"ţ";s:3:"ţ";s:2:"Ť";s:3:"Ť";s:2:"ť";s:3:"ť";s:2:"Ũ";s:3:"Ũ";s:2:"ũ";s:3:"ũ";s:2:"Ū";s:3:"Ū";s:2:"ū";s:3:"ū";s:2:"Ŭ";s:3:"Ŭ";s:2:"ŭ";s:3:"ŭ";s:2:"Ů";s:3:"Ů";s:2:"ů";s:3:"ů";s:2:"Ű";s:3:"Ű";s:2:"ű";s:3:"ű";s:2:"Ų";s:3:"Ų";s:2:"ų";s:3:"ų";s:2:"Ŵ";s:3:"Ŵ";s:2:"ŵ";s:3:"ŵ";s:2:"Ŷ";s:3:"Ŷ";s:2:"ŷ";s:3:"ŷ";s:2:"Ÿ";s:3:"Ÿ";s:2:"Ź";s:3:"Ź";s:2:"ź";s:3:"ź";s:2:"Ż";s:3:"Ż";s:2:"ż";s:3:"ż";s:2:"Ž";s:3:"Ž";s:2:"ž";s:3:"ž";s:2:"ſ";s:1:"s";s:2:"Ơ";s:3:"Ơ";s:2:"ơ";s:3:"ơ";s:2:"Ư";s:3:"Ư";s:2:"ư";s:3:"ư";s:2:"DŽ";s:4:"DŽ";s:2:"Dž";s:4:"Dž";s:2:"dž";s:4:"dž";s:2:"LJ";s:2:"LJ";s:2:"Lj";s:2:"Lj";s:2:"lj";s:2:"lj";s:2:"NJ";s:2:"NJ";s:2:"Nj";s:2:"Nj";s:2:"nj";s:2:"nj";s:2:"Ǎ";s:3:"Ǎ";s:2:"ǎ";s:3:"ǎ";s:2:"Ǐ";s:3:"Ǐ";s:2:"ǐ";s:3:"ǐ";s:2:"Ǒ";s:3:"Ǒ";s:2:"ǒ";s:3:"ǒ";s:2:"Ǔ";s:3:"Ǔ";s:2:"ǔ";s:3:"ǔ";s:2:"Ǖ";s:5:"Ǖ";s:2:"ǖ";s:5:"ǖ";s:2:"Ǘ";s:5:"Ǘ";s:2:"ǘ";s:5:"ǘ";s:2:"Ǚ";s:5:"Ǚ";s:2:"ǚ";s:5:"ǚ";s:2:"Ǜ";s:5:"Ǜ";s:2:"ǜ";s:5:"ǜ";s:2:"Ǟ";s:5:"Ǟ";s:2:"ǟ";s:5:"ǟ";s:2:"Ǡ";s:5:"Ǡ";s:2:"ǡ";s:5:"ǡ";s:2:"Ǣ";s:4:"Ǣ";s:2:"ǣ";s:4:"ǣ";s:2:"Ǧ";s:3:"Ǧ";s:2:"ǧ";s:3:"ǧ";s:2:"Ǩ";s:3:"Ǩ";s:2:"ǩ";s:3:"ǩ";s:2:"Ǫ";s:3:"Ǫ";s:2:"ǫ";s:3:"ǫ";s:2:"Ǭ";s:5:"Ǭ";s:2:"ǭ";s:5:"ǭ";s:2:"Ǯ";s:4:"Ǯ";s:2:"ǯ";s:4:"ǯ";s:2:"ǰ";s:3:"ǰ";s:2:"DZ";s:2:"DZ";s:2:"Dz";s:2:"Dz";s:2:"dz";s:2:"dz";s:2:"Ǵ";s:3:"Ǵ";s:2:"ǵ";s:3:"ǵ";s:2:"Ǹ";s:3:"Ǹ";s:2:"ǹ";s:3:"ǹ";s:2:"Ǻ";s:5:"Ǻ";s:2:"ǻ";s:5:"ǻ";s:2:"Ǽ";s:4:"Ǽ";s:2:"ǽ";s:4:"ǽ";s:2:"Ǿ";s:4:"Ǿ";s:2:"ǿ";s:4:"ǿ";s:2:"Ȁ";s:3:"Ȁ";s:2:"ȁ";s:3:"ȁ";s:2:"Ȃ";s:3:"Ȃ";s:2:"ȃ";s:3:"ȃ";s:2:"Ȅ";s:3:"Ȅ";s:2:"ȅ";s:3:"ȅ";s:2:"Ȇ";s:3:"Ȇ";s:2:"ȇ";s:3:"ȇ";s:2:"Ȉ";s:3:"Ȉ";s:2:"ȉ";s:3:"ȉ";s:2:"Ȋ";s:3:"Ȋ";s:2:"ȋ";s:3:"ȋ";s:2:"Ȍ";s:3:"Ȍ";s:2:"ȍ";s:3:"ȍ";s:2:"Ȏ";s:3:"Ȏ";s:2:"ȏ";s:3:"ȏ";s:2:"Ȑ";s:3:"Ȑ";s:2:"ȑ";s:3:"ȑ";s:2:"Ȓ";s:3:"Ȓ";s:2:"ȓ";s:3:"ȓ";s:2:"Ȕ";s:3:"Ȕ";s:2:"ȕ";s:3:"ȕ";s:2:"Ȗ";s:3:"Ȗ";s:2:"ȗ";s:3:"ȗ";s:2:"Ș";s:3:"Ș";s:2:"ș";s:3:"ș";s:2:"Ț";s:3:"Ț";s:2:"ț";s:3:"ț";s:2:"Ȟ";s:3:"Ȟ";s:2:"ȟ";s:3:"ȟ";s:2:"Ȧ";s:3:"Ȧ";s:2:"ȧ";s:3:"ȧ";s:2:"Ȩ";s:3:"Ȩ";s:2:"ȩ";s:3:"ȩ";s:2:"Ȫ";s:5:"Ȫ";s:2:"ȫ";s:5:"ȫ";s:2:"Ȭ";s:5:"Ȭ";s:2:"ȭ";s:5:"ȭ";s:2:"Ȯ";s:3:"Ȯ";s:2:"ȯ";s:3:"ȯ";s:2:"Ȱ";s:5:"Ȱ";s:2:"ȱ";s:5:"ȱ";s:2:"Ȳ";s:3:"Ȳ";s:2:"ȳ";s:3:"ȳ";s:2:"ʰ";s:1:"h";s:2:"ʱ";s:2:"ɦ";s:2:"ʲ";s:1:"j";s:2:"ʳ";s:1:"r";s:2:"ʴ";s:2:"ɹ";s:2:"ʵ";s:2:"ɻ";s:2:"ʶ";s:2:"ʁ";s:2:"ʷ";s:1:"w";s:2:"ʸ";s:1:"y";s:2:"˘";s:3:" ̆";s:2:"˙";s:3:" ̇";s:2:"˚";s:3:" ̊";s:2:"˛";s:3:" ̨";s:2:"˜";s:3:" ̃";s:2:"˝";s:3:" ̋";s:2:"ˠ";s:2:"ɣ";s:2:"ˡ";s:1:"l";s:2:"ˢ";s:1:"s";s:2:"ˣ";s:1:"x";s:2:"ˤ";s:2:"ʕ";s:2:"̀";s:2:"̀";s:2:"́";s:2:"́";s:2:"̓";s:2:"̓";s:2:"̈́";s:4:"̈́";s:2:"ʹ";s:2:"ʹ";s:2:"ͺ";s:3:" ͅ";s:2:";";s:1:";";s:2:"΄";s:3:" ́";s:2:"΅";s:5:" ̈́";s:2:"Ά";s:4:"Ά";s:2:"·";s:2:"·";s:2:"Έ";s:4:"Έ";s:2:"Ή";s:4:"Ή";s:2:"Ί";s:4:"Ί";s:2:"Ό";s:4:"Ό";s:2:"Ύ";s:4:"Ύ";s:2:"Ώ";s:4:"Ώ";s:2:"ΐ";s:6:"ΐ";s:2:"Ϊ";s:4:"Ϊ";s:2:"Ϋ";s:4:"Ϋ";s:2:"ά";s:4:"ά";s:2:"έ";s:4:"έ";s:2:"ή";s:4:"ή";s:2:"ί";s:4:"ί";s:2:"ΰ";s:6:"ΰ";s:2:"ϊ";s:4:"ϊ";s:2:"ϋ";s:4:"ϋ";s:2:"ό";s:4:"ό";s:2:"ύ";s:4:"ύ";s:2:"ώ";s:4:"ώ";s:2:"ϐ";s:2:"β";s:2:"ϑ";s:2:"θ";s:2:"ϒ";s:2:"Υ";s:2:"ϓ";s:4:"Ύ";s:2:"ϔ";s:4:"Ϋ";s:2:"ϕ";s:2:"φ";s:2:"ϖ";s:2:"π";s:2:"ϰ";s:2:"κ";s:2:"ϱ";s:2:"ρ";s:2:"ϲ";s:2:"ς";s:2:"ϴ";s:2:"Θ";s:2:"ϵ";s:2:"ε";s:2:"Ϲ";s:2:"Σ";s:2:"Ѐ";s:4:"Ѐ";s:2:"Ё";s:4:"Ё";s:2:"Ѓ";s:4:"Ѓ";s:2:"Ї";s:4:"Ї";s:2:"Ќ";s:4:"Ќ";s:2:"Ѝ";s:4:"Ѝ";s:2:"Ў";s:4:"Ў";s:2:"Й";s:4:"Й";s:2:"й";s:4:"й";s:2:"ѐ";s:4:"ѐ";s:2:"ё";s:4:"ё";s:2:"ѓ";s:4:"ѓ";s:2:"ї";s:4:"ї";s:2:"ќ";s:4:"ќ";s:2:"ѝ";s:4:"ѝ";s:2:"ў";s:4:"ў";s:2:"Ѷ";s:4:"Ѷ";s:2:"ѷ";s:4:"ѷ";s:2:"Ӂ";s:4:"Ӂ";s:2:"ӂ";s:4:"ӂ";s:2:"Ӑ";s:4:"Ӑ";s:2:"ӑ";s:4:"ӑ";s:2:"Ӓ";s:4:"Ӓ";s:2:"ӓ";s:4:"ӓ";s:2:"Ӗ";s:4:"Ӗ";s:2:"ӗ";s:4:"ӗ";s:2:"Ӛ";s:4:"Ӛ";s:2:"ӛ";s:4:"ӛ";s:2:"Ӝ";s:4:"Ӝ";s:2:"ӝ";s:4:"ӝ";s:2:"Ӟ";s:4:"Ӟ";s:2:"ӟ";s:4:"ӟ";s:2:"Ӣ";s:4:"Ӣ";s:2:"ӣ";s:4:"ӣ";s:2:"Ӥ";s:4:"Ӥ";s:2:"ӥ";s:4:"ӥ";s:2:"Ӧ";s:4:"Ӧ";s:2:"ӧ";s:4:"ӧ";s:2:"Ӫ";s:4:"Ӫ";s:2:"ӫ";s:4:"ӫ";s:2:"Ӭ";s:4:"Ӭ";s:2:"ӭ";s:4:"ӭ";s:2:"Ӯ";s:4:"Ӯ";s:2:"ӯ";s:4:"ӯ";s:2:"Ӱ";s:4:"Ӱ";s:2:"ӱ";s:4:"ӱ";s:2:"Ӳ";s:4:"Ӳ";s:2:"ӳ";s:4:"ӳ";s:2:"Ӵ";s:4:"Ӵ";s:2:"ӵ";s:4:"ӵ";s:2:"Ӹ";s:4:"Ӹ";s:2:"ӹ";s:4:"ӹ";s:2:"և";s:4:"եւ";s:2:"آ";s:4:"آ";s:2:"أ";s:4:"أ";s:2:"ؤ";s:4:"ؤ";s:2:"إ";s:4:"إ";s:2:"ئ";s:4:"ئ";s:2:"ٵ";s:4:"اٴ";s:2:"ٶ";s:4:"وٴ";s:2:"ٷ";s:4:"ۇٴ";s:2:"ٸ";s:4:"يٴ";s:2:"ۀ";s:4:"ۀ";s:2:"ۂ";s:4:"ۂ";s:2:"ۓ";s:4:"ۓ";s:3:"ऩ";s:6:"ऩ";s:3:"ऱ";s:6:"ऱ";s:3:"ऴ";s:6:"ऴ";s:3:"क़";s:6:"क़";s:3:"ख़";s:6:"ख़";s:3:"ग़";s:6:"ग़";s:3:"ज़";s:6:"ज़";s:3:"ड़";s:6:"ड़";s:3:"ढ़";s:6:"ढ़";s:3:"फ़";s:6:"फ़";s:3:"य़";s:6:"य़";s:3:"ো";s:6:"ো";s:3:"ৌ";s:6:"ৌ";s:3:"ড়";s:6:"ড়";s:3:"ঢ়";s:6:"ঢ়";s:3:"য়";s:6:"য়";s:3:"ਲ਼";s:6:"ਲ਼";s:3:"ਸ਼";s:6:"ਸ਼";s:3:"ਖ਼";s:6:"ਖ਼";s:3:"ਗ਼";s:6:"ਗ਼";s:3:"ਜ਼";s:6:"ਜ਼";s:3:"ਫ਼";s:6:"ਫ਼";s:3:"ୈ";s:6:"ୈ";s:3:"ୋ";s:6:"ୋ";s:3:"ୌ";s:6:"ୌ";s:3:"ଡ଼";s:6:"ଡ଼";s:3:"ଢ଼";s:6:"ଢ଼";s:3:"ஔ";s:6:"ஔ";s:3:"ொ";s:6:"ொ";s:3:"ோ";s:6:"ோ";s:3:"ௌ";s:6:"ௌ";s:3:"ై";s:6:"ై";s:3:"ೀ";s:6:"ೀ";s:3:"ೇ";s:6:"ೇ";s:3:"ೈ";s:6:"ೈ";s:3:"ೊ";s:6:"ೊ";s:3:"ೋ";s:9:"ೋ";s:3:"ൊ";s:6:"ൊ";s:3:"ോ";s:6:"ോ";s:3:"ൌ";s:6:"ൌ";s:3:"ේ";s:6:"ේ";s:3:"ො";s:6:"ො";s:3:"ෝ";s:9:"ෝ";s:3:"ෞ";s:6:"ෞ";s:3:"ำ";s:6:"ํา";s:3:"ຳ";s:6:"ໍາ";s:3:"ໜ";s:6:"ຫນ";s:3:"ໝ";s:6:"ຫມ";s:3:"༌";s:3:"་";s:3:"གྷ";s:6:"གྷ";s:3:"ཌྷ";s:6:"ཌྷ";s:3:"དྷ";s:6:"དྷ";s:3:"བྷ";s:6:"བྷ";s:3:"ཛྷ";s:6:"ཛྷ";s:3:"ཀྵ";s:6:"ཀྵ";s:3:"ཱི";s:6:"ཱི";s:3:"ཱུ";s:6:"ཱུ";s:3:"ྲྀ";s:6:"ྲྀ";s:3:"ཷ";s:9:"ྲཱྀ";s:3:"ླྀ";s:6:"ླྀ";s:3:"ཹ";s:9:"ླཱྀ";s:3:"ཱྀ";s:6:"ཱྀ";s:3:"ྒྷ";s:6:"ྒྷ";s:3:"ྜྷ";s:6:"ྜྷ";s:3:"ྡྷ";s:6:"ྡྷ";s:3:"ྦྷ";s:6:"ྦྷ";s:3:"ྫྷ";s:6:"ྫྷ";s:3:"ྐྵ";s:6:"ྐྵ";s:3:"ဦ";s:6:"ဦ";s:3:"ჼ";s:3:"ნ";s:3:"ᬆ";s:6:"ᬆ";s:3:"ᬈ";s:6:"ᬈ";s:3:"ᬊ";s:6:"ᬊ";s:3:"ᬌ";s:6:"ᬌ";s:3:"ᬎ";s:6:"ᬎ";s:3:"ᬒ";s:6:"ᬒ";s:3:"ᬻ";s:6:"ᬻ";s:3:"ᬽ";s:6:"ᬽ";s:3:"ᭀ";s:6:"ᭀ";s:3:"ᭁ";s:6:"ᭁ";s:3:"ᭃ";s:6:"ᭃ";s:3:"ᴬ";s:1:"A";s:3:"ᴭ";s:2:"Æ";s:3:"ᴮ";s:1:"B";s:3:"ᴰ";s:1:"D";s:3:"ᴱ";s:1:"E";s:3:"ᴲ";s:2:"Ǝ";s:3:"ᴳ";s:1:"G";s:3:"ᴴ";s:1:"H";s:3:"ᴵ";s:1:"I";s:3:"ᴶ";s:1:"J";s:3:"ᴷ";s:1:"K";s:3:"ᴸ";s:1:"L";s:3:"ᴹ";s:1:"M";s:3:"ᴺ";s:1:"N";s:3:"ᴼ";s:1:"O";s:3:"ᴽ";s:2:"Ȣ";s:3:"ᴾ";s:1:"P";s:3:"ᴿ";s:1:"R";s:3:"ᵀ";s:1:"T";s:3:"ᵁ";s:1:"U";s:3:"ᵂ";s:1:"W";s:3:"ᵃ";s:1:"a";s:3:"ᵄ";s:2:"ɐ";s:3:"ᵅ";s:2:"ɑ";s:3:"ᵆ";s:3:"ᴂ";s:3:"ᵇ";s:1:"b";s:3:"ᵈ";s:1:"d";s:3:"ᵉ";s:1:"e";s:3:"ᵊ";s:2:"ə";s:3:"ᵋ";s:2:"ɛ";s:3:"ᵌ";s:2:"ɜ";s:3:"ᵍ";s:1:"g";s:3:"ᵏ";s:1:"k";s:3:"ᵐ";s:1:"m";s:3:"ᵑ";s:2:"ŋ";s:3:"ᵒ";s:1:"o";s:3:"ᵓ";s:2:"ɔ";s:3:"ᵔ";s:3:"ᴖ";s:3:"ᵕ";s:3:"ᴗ";s:3:"ᵖ";s:1:"p";s:3:"ᵗ";s:1:"t";s:3:"ᵘ";s:1:"u";s:3:"ᵙ";s:3:"ᴝ";s:3:"ᵚ";s:2:"ɯ";s:3:"ᵛ";s:1:"v";s:3:"ᵜ";s:3:"ᴥ";s:3:"ᵝ";s:2:"β";s:3:"ᵞ";s:2:"γ";s:3:"ᵟ";s:2:"δ";s:3:"ᵠ";s:2:"φ";s:3:"ᵡ";s:2:"χ";s:3:"ᵢ";s:1:"i";s:3:"ᵣ";s:1:"r";s:3:"ᵤ";s:1:"u";s:3:"ᵥ";s:1:"v";s:3:"ᵦ";s:2:"β";s:3:"ᵧ";s:2:"γ";s:3:"ᵨ";s:2:"ρ";s:3:"ᵩ";s:2:"φ";s:3:"ᵪ";s:2:"χ";s:3:"ᵸ";s:2:"н";s:3:"ᶛ";s:2:"ɒ";s:3:"ᶜ";s:1:"c";s:3:"ᶝ";s:2:"ɕ";s:3:"ᶞ";s:2:"ð";s:3:"ᶟ";s:2:"ɜ";s:3:"ᶠ";s:1:"f";s:3:"ᶡ";s:2:"ɟ";s:3:"ᶢ";s:2:"ɡ";s:3:"ᶣ";s:2:"ɥ";s:3:"ᶤ";s:2:"ɨ";s:3:"ᶥ";s:2:"ɩ";s:3:"ᶦ";s:2:"ɪ";s:3:"ᶧ";s:3:"ᵻ";s:3:"ᶨ";s:2:"ʝ";s:3:"ᶩ";s:2:"ɭ";s:3:"ᶪ";s:3:"ᶅ";s:3:"ᶫ";s:2:"ʟ";s:3:"ᶬ";s:2:"ɱ";s:3:"ᶭ";s:2:"ɰ";s:3:"ᶮ";s:2:"ɲ";s:3:"ᶯ";s:2:"ɳ";s:3:"ᶰ";s:2:"ɴ";s:3:"ᶱ";s:2:"ɵ";s:3:"ᶲ";s:2:"ɸ";s:3:"ᶳ";s:2:"ʂ";s:3:"ᶴ";s:2:"ʃ";s:3:"ᶵ";s:2:"ƫ";s:3:"ᶶ";s:2:"ʉ";s:3:"ᶷ";s:2:"ʊ";s:3:"ᶸ";s:3:"ᴜ";s:3:"ᶹ";s:2:"ʋ";s:3:"ᶺ";s:2:"ʌ";s:3:"ᶻ";s:1:"z";s:3:"ᶼ";s:2:"ʐ";s:3:"ᶽ";s:2:"ʑ";s:3:"ᶾ";s:2:"ʒ";s:3:"ᶿ";s:2:"θ";s:3:"Ḁ";s:3:"Ḁ";s:3:"ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"Ḃ";s:3:"ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"Ḅ";s:3:"ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"Ḇ";s:3:"ḇ";s:3:"ḇ";s:3:"Ḉ";s:5:"Ḉ";s:3:"ḉ";s:5:"ḉ";s:3:"Ḋ";s:3:"Ḋ";s:3:"ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"Ḍ";s:3:"ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"Ḏ";s:3:"ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"Ḑ";s:3:"ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"Ḓ";s:3:"ḓ";s:3:"ḓ";s:3:"Ḕ";s:5:"Ḕ";s:3:"ḕ";s:5:"ḕ";s:3:"Ḗ";s:5:"Ḗ";s:3:"ḗ";s:5:"ḗ";s:3:"Ḙ";s:3:"Ḙ";s:3:"ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"Ḛ";s:3:"ḛ";s:3:"ḛ";s:3:"Ḝ";s:5:"Ḝ";s:3:"ḝ";s:5:"ḝ";s:3:"Ḟ";s:3:"Ḟ";s:3:"ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"Ḡ";s:3:"ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"Ḣ";s:3:"ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"Ḥ";s:3:"ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"Ḧ";s:3:"ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"Ḩ";s:3:"ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"Ḫ";s:3:"ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"Ḭ";s:3:"ḭ";s:3:"ḭ";s:3:"Ḯ";s:5:"Ḯ";s:3:"ḯ";s:5:"ḯ";s:3:"Ḱ";s:3:"Ḱ";s:3:"ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"Ḳ";s:3:"ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"Ḵ";s:3:"ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"Ḷ";s:3:"ḷ";s:3:"ḷ";s:3:"Ḹ";s:5:"Ḹ";s:3:"ḹ";s:5:"ḹ";s:3:"Ḻ";s:3:"Ḻ";s:3:"ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"Ḽ";s:3:"ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"Ḿ";s:3:"ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"Ṁ";s:3:"ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"Ṃ";s:3:"ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"Ṅ";s:3:"ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"Ṇ";s:3:"ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"Ṉ";s:3:"ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"Ṋ";s:3:"ṋ";s:3:"ṋ";s:3:"Ṍ";s:5:"Ṍ";s:3:"ṍ";s:5:"ṍ";s:3:"Ṏ";s:5:"Ṏ";s:3:"ṏ";s:5:"ṏ";s:3:"Ṑ";s:5:"Ṑ";s:3:"ṑ";s:5:"ṑ";s:3:"Ṓ";s:5:"Ṓ";s:3:"ṓ";s:5:"ṓ";s:3:"Ṕ";s:3:"Ṕ";s:3:"ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"Ṗ";s:3:"ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"Ṙ";s:3:"ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"Ṛ";s:3:"ṛ";s:3:"ṛ";s:3:"Ṝ";s:5:"Ṝ";s:3:"ṝ";s:5:"ṝ";s:3:"Ṟ";s:3:"Ṟ";s:3:"ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"Ṡ";s:3:"ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"Ṣ";s:3:"ṣ";s:3:"ṣ";s:3:"Ṥ";s:5:"Ṥ";s:3:"ṥ";s:5:"ṥ";s:3:"Ṧ";s:5:"Ṧ";s:3:"ṧ";s:5:"ṧ";s:3:"Ṩ";s:5:"Ṩ";s:3:"ṩ";s:5:"ṩ";s:3:"Ṫ";s:3:"Ṫ";s:3:"ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"Ṭ";s:3:"ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"Ṯ";s:3:"ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"Ṱ";s:3:"ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"Ṳ";s:3:"ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"Ṵ";s:3:"ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"Ṷ";s:3:"ṷ";s:3:"ṷ";s:3:"Ṹ";s:5:"Ṹ";s:3:"ṹ";s:5:"ṹ";s:3:"Ṻ";s:5:"Ṻ";s:3:"ṻ";s:5:"ṻ";s:3:"Ṽ";s:3:"Ṽ";s:3:"ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"Ṿ";s:3:"ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"Ẁ";s:3:"ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"Ẃ";s:3:"ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"Ẅ";s:3:"ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"Ẇ";s:3:"ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"Ẉ";s:3:"ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"Ẋ";s:3:"ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"Ẍ";s:3:"ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"Ẏ";s:3:"ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"Ẑ";s:3:"ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"Ẓ";s:3:"ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẕ";s:3:"ẖ";s:3:"ẖ";s:3:"ẗ";s:3:"ẗ";s:3:"ẘ";s:3:"ẘ";s:3:"ẙ";s:3:"ẙ";s:3:"ẚ";s:3:"aʾ";s:3:"ẛ";s:3:"ṡ";s:3:"Ạ";s:3:"Ạ";s:3:"ạ";s:3:"ạ";s:3:"Ả";s:3:"Ả";s:3:"ả";s:3:"ả";s:3:"Ấ";s:5:"Ấ";s:3:"ấ";s:5:"ấ";s:3:"Ầ";s:5:"Ầ";s:3:"ầ";s:5:"ầ";s:3:"Ẩ";s:5:"Ẩ";s:3:"ẩ";s:5:"ẩ";s:3:"Ẫ";s:5:"Ẫ";s:3:"ẫ";s:5:"ẫ";s:3:"Ậ";s:5:"Ậ";s:3:"ậ";s:5:"ậ";s:3:"Ắ";s:5:"Ắ";s:3:"ắ";s:5:"ắ";s:3:"Ằ";s:5:"Ằ";s:3:"ằ";s:5:"ằ";s:3:"Ẳ";s:5:"Ẳ";s:3:"ẳ";s:5:"ẳ";s:3:"Ẵ";s:5:"Ẵ";s:3:"ẵ";s:5:"ẵ";s:3:"Ặ";s:5:"Ặ";s:3:"ặ";s:5:"ặ";s:3:"Ẹ";s:3:"Ẹ";s:3:"ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"Ẻ";s:3:"ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"Ẽ";s:3:"ẽ";s:3:"ẽ";s:3:"Ế";s:5:"Ế";s:3:"ế";s:5:"ế";s:3:"Ề";s:5:"Ề";s:3:"ề";s:5:"ề";s:3:"Ể";s:5:"Ể";s:3:"ể";s:5:"ể";s:3:"Ễ";s:5:"Ễ";s:3:"ễ";s:5:"ễ";s:3:"Ệ";s:5:"Ệ";s:3:"ệ";s:5:"ệ";s:3:"Ỉ";s:3:"Ỉ";s:3:"ỉ";s:3:"ỉ";s:3:"Ị";s:3:"Ị";s:3:"ị";s:3:"ị";s:3:"Ọ";s:3:"Ọ";s:3:"ọ";s:3:"ọ";s:3:"Ỏ";s:3:"Ỏ";s:3:"ỏ";s:3:"ỏ";s:3:"Ố";s:5:"Ố";s:3:"ố";s:5:"ố";s:3:"Ồ";s:5:"Ồ";s:3:"ồ";s:5:"ồ";s:3:"Ổ";s:5:"Ổ";s:3:"ổ";s:5:"ổ";s:3:"Ỗ";s:5:"Ỗ";s:3:"ỗ";s:5:"ỗ";s:3:"Ộ";s:5:"Ộ";s:3:"ộ";s:5:"ộ";s:3:"Ớ";s:5:"Ớ";s:3:"ớ";s:5:"ớ";s:3:"Ờ";s:5:"Ờ";s:3:"ờ";s:5:"ờ";s:3:"Ở";s:5:"Ở";s:3:"ở";s:5:"ở";s:3:"Ỡ";s:5:"Ỡ";s:3:"ỡ";s:5:"ỡ";s:3:"Ợ";s:5:"Ợ";s:3:"ợ";s:5:"ợ";s:3:"Ụ";s:3:"Ụ";s:3:"ụ";s:3:"ụ";s:3:"Ủ";s:3:"Ủ";s:3:"ủ";s:3:"ủ";s:3:"Ứ";s:5:"Ứ";s:3:"ứ";s:5:"ứ";s:3:"Ừ";s:5:"Ừ";s:3:"ừ";s:5:"ừ";s:3:"Ử";s:5:"Ử";s:3:"ử";s:5:"ử";s:3:"Ữ";s:5:"Ữ";s:3:"ữ";s:5:"ữ";s:3:"Ự";s:5:"Ự";s:3:"ự";s:5:"ự";s:3:"Ỳ";s:3:"Ỳ";s:3:"ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"Ỵ";s:3:"ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"Ỷ";s:3:"ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"Ỹ";s:3:"ỹ";s:3:"ỹ";s:3:"ἀ";s:4:"ἀ";s:3:"ἁ";s:4:"ἁ";s:3:"ἂ";s:6:"ἂ";s:3:"ἃ";s:6:"ἃ";s:3:"ἄ";s:6:"ἄ";s:3:"ἅ";s:6:"ἅ";s:3:"ἆ";s:6:"ἆ";s:3:"ἇ";s:6:"ἇ";s:3:"Ἀ";s:4:"Ἀ";s:3:"Ἁ";s:4:"Ἁ";s:3:"Ἂ";s:6:"Ἂ";s:3:"Ἃ";s:6:"Ἃ";s:3:"Ἄ";s:6:"Ἄ";s:3:"Ἅ";s:6:"Ἅ";s:3:"Ἆ";s:6:"Ἆ";s:3:"Ἇ";s:6:"Ἇ";s:3:"ἐ";s:4:"ἐ";s:3:"ἑ";s:4:"ἑ";s:3:"ἒ";s:6:"ἒ";s:3:"ἓ";s:6:"ἓ";s:3:"ἔ";s:6:"ἔ";s:3:"ἕ";s:6:"ἕ";s:3:"Ἐ";s:4:"Ἐ";s:3:"Ἑ";s:4:"Ἑ";s:3:"Ἒ";s:6:"Ἒ";s:3:"Ἓ";s:6:"Ἓ";s:3:"Ἔ";s:6:"Ἔ";s:3:"Ἕ";s:6:"Ἕ";s:3:"ἠ";s:4:"ἠ";s:3:"ἡ";s:4:"ἡ";s:3:"ἢ";s:6:"ἢ";s:3:"ἣ";s:6:"ἣ";s:3:"ἤ";s:6:"ἤ";s:3:"ἥ";s:6:"ἥ";s:3:"ἦ";s:6:"ἦ";s:3:"ἧ";s:6:"ἧ";s:3:"Ἠ";s:4:"Ἠ";s:3:"Ἡ";s:4:"Ἡ";s:3:"Ἢ";s:6:"Ἢ";s:3:"Ἣ";s:6:"Ἣ";s:3:"Ἤ";s:6:"Ἤ";s:3:"Ἥ";s:6:"Ἥ";s:3:"Ἦ";s:6:"Ἦ";s:3:"Ἧ";s:6:"Ἧ";s:3:"ἰ";s:4:"ἰ";s:3:"ἱ";s:4:"ἱ";s:3:"ἲ";s:6:"ἲ";s:3:"ἳ";s:6:"ἳ";s:3:"ἴ";s:6:"ἴ";s:3:"ἵ";s:6:"ἵ";s:3:"ἶ";s:6:"ἶ";s:3:"ἷ";s:6:"ἷ";s:3:"Ἰ";s:4:"Ἰ";s:3:"Ἱ";s:4:"Ἱ";s:3:"Ἲ";s:6:"Ἲ";s:3:"Ἳ";s:6:"Ἳ";s:3:"Ἴ";s:6:"Ἴ";s:3:"Ἵ";s:6:"Ἵ";s:3:"Ἶ";s:6:"Ἶ";s:3:"Ἷ";s:6:"Ἷ";s:3:"ὀ";s:4:"ὀ";s:3:"ὁ";s:4:"ὁ";s:3:"ὂ";s:6:"ὂ";s:3:"ὃ";s:6:"ὃ";s:3:"ὄ";s:6:"ὄ";s:3:"ὅ";s:6:"ὅ";s:3:"Ὀ";s:4:"Ὀ";s:3:"Ὁ";s:4:"Ὁ";s:3:"Ὂ";s:6:"Ὂ";s:3:"Ὃ";s:6:"Ὃ";s:3:"Ὄ";s:6:"Ὄ";s:3:"Ὅ";s:6:"Ὅ";s:3:"ὐ";s:4:"ὐ";s:3:"ὑ";s:4:"ὑ";s:3:"ὒ";s:6:"ὒ";s:3:"ὓ";s:6:"ὓ";s:3:"ὔ";s:6:"ὔ";s:3:"ὕ";s:6:"ὕ";s:3:"ὖ";s:6:"ὖ";s:3:"ὗ";s:6:"ὗ";s:3:"Ὑ";s:4:"Ὑ";s:3:"Ὓ";s:6:"Ὓ";s:3:"Ὕ";s:6:"Ὕ";s:3:"Ὗ";s:6:"Ὗ";s:3:"ὠ";s:4:"ὠ";s:3:"ὡ";s:4:"ὡ";s:3:"ὢ";s:6:"ὢ";s:3:"ὣ";s:6:"ὣ";s:3:"ὤ";s:6:"ὤ";s:3:"ὥ";s:6:"ὥ";s:3:"ὦ";s:6:"ὦ";s:3:"ὧ";s:6:"ὧ";s:3:"Ὠ";s:4:"Ὠ";s:3:"Ὡ";s:4:"Ὡ";s:3:"Ὢ";s:6:"Ὢ";s:3:"Ὣ";s:6:"Ὣ";s:3:"Ὤ";s:6:"Ὤ";s:3:"Ὥ";s:6:"Ὥ";s:3:"Ὦ";s:6:"Ὦ";s:3:"Ὧ";s:6:"Ὧ";s:3:"ὰ";s:4:"ὰ";s:3:"ά";s:4:"ά";s:3:"ὲ";s:4:"ὲ";s:3:"έ";s:4:"έ";s:3:"ὴ";s:4:"ὴ";s:3:"ή";s:4:"ή";s:3:"ὶ";s:4:"ὶ";s:3:"ί";s:4:"ί";s:3:"ὸ";s:4:"ὸ";s:3:"ό";s:4:"ό";s:3:"ὺ";s:4:"ὺ";s:3:"ύ";s:4:"ύ";s:3:"ὼ";s:4:"ὼ";s:3:"ώ";s:4:"ώ";s:3:"ᾀ";s:6:"ᾀ";s:3:"ᾁ";s:6:"ᾁ";s:3:"ᾂ";s:8:"ᾂ";s:3:"ᾃ";s:8:"ᾃ";s:3:"ᾄ";s:8:"ᾄ";s:3:"ᾅ";s:8:"ᾅ";s:3:"ᾆ";s:8:"ᾆ";s:3:"ᾇ";s:8:"ᾇ";s:3:"ᾈ";s:6:"ᾈ";s:3:"ᾉ";s:6:"ᾉ";s:3:"ᾊ";s:8:"ᾊ";s:3:"ᾋ";s:8:"ᾋ";s:3:"ᾌ";s:8:"ᾌ";s:3:"ᾍ";s:8:"ᾍ";s:3:"ᾎ";s:8:"ᾎ";s:3:"ᾏ";s:8:"ᾏ";s:3:"ᾐ";s:6:"ᾐ";s:3:"ᾑ";s:6:"ᾑ";s:3:"ᾒ";s:8:"ᾒ";s:3:"ᾓ";s:8:"ᾓ";s:3:"ᾔ";s:8:"ᾔ";s:3:"ᾕ";s:8:"ᾕ";s:3:"ᾖ";s:8:"ᾖ";s:3:"ᾗ";s:8:"ᾗ";s:3:"ᾘ";s:6:"ᾘ";s:3:"ᾙ";s:6:"ᾙ";s:3:"ᾚ";s:8:"ᾚ";s:3:"ᾛ";s:8:"ᾛ";s:3:"ᾜ";s:8:"ᾜ";s:3:"ᾝ";s:8:"ᾝ";s:3:"ᾞ";s:8:"ᾞ";s:3:"ᾟ";s:8:"ᾟ";s:3:"ᾠ";s:6:"ᾠ";s:3:"ᾡ";s:6:"ᾡ";s:3:"ᾢ";s:8:"ᾢ";s:3:"ᾣ";s:8:"ᾣ";s:3:"ᾤ";s:8:"ᾤ";s:3:"ᾥ";s:8:"ᾥ";s:3:"ᾦ";s:8:"ᾦ";s:3:"ᾧ";s:8:"ᾧ";s:3:"ᾨ";s:6:"ᾨ";s:3:"ᾩ";s:6:"ᾩ";s:3:"ᾪ";s:8:"ᾪ";s:3:"ᾫ";s:8:"ᾫ";s:3:"ᾬ";s:8:"ᾬ";s:3:"ᾭ";s:8:"ᾭ";s:3:"ᾮ";s:8:"ᾮ";s:3:"ᾯ";s:8:"ᾯ";s:3:"ᾰ";s:4:"ᾰ";s:3:"ᾱ";s:4:"ᾱ";s:3:"ᾲ";s:6:"ᾲ";s:3:"ᾳ";s:4:"ᾳ";s:3:"ᾴ";s:6:"ᾴ";s:3:"ᾶ";s:4:"ᾶ";s:3:"ᾷ";s:6:"ᾷ";s:3:"Ᾰ";s:4:"Ᾰ";s:3:"Ᾱ";s:4:"Ᾱ";s:3:"Ὰ";s:4:"Ὰ";s:3:"Ά";s:4:"Ά";s:3:"ᾼ";s:4:"ᾼ";s:3:"᾽";s:3:" ̓";s:3:"ι";s:2:"ι";s:3:"᾿";s:3:" ̓";s:3:"῀";s:3:" ͂";s:3:"῁";s:5:" ̈͂";s:3:"ῂ";s:6:"ῂ";s:3:"ῃ";s:4:"ῃ";s:3:"ῄ";s:6:"ῄ";s:3:"ῆ";s:4:"ῆ";s:3:"ῇ";s:6:"ῇ";s:3:"Ὲ";s:4:"Ὲ";s:3:"Έ";s:4:"Έ";s:3:"Ὴ";s:4:"Ὴ";s:3:"Ή";s:4:"Ή";s:3:"ῌ";s:4:"ῌ";s:3:"῍";s:5:" ̓̀";s:3:"῎";s:5:" ̓́";s:3:"῏";s:5:" ̓͂";s:3:"ῐ";s:4:"ῐ";s:3:"ῑ";s:4:"ῑ";s:3:"ῒ";s:6:"ῒ";s:3:"ΐ";s:6:"ΐ";s:3:"ῖ";s:4:"ῖ";s:3:"ῗ";s:6:"ῗ";s:3:"Ῐ";s:4:"Ῐ";s:3:"Ῑ";s:4:"Ῑ";s:3:"Ὶ";s:4:"Ὶ";s:3:"Ί";s:4:"Ί";s:3:"῝";s:5:" ̔̀";s:3:"῞";s:5:" ̔́";s:3:"῟";s:5:" ̔͂";s:3:"ῠ";s:4:"ῠ";s:3:"ῡ";s:4:"ῡ";s:3:"ῢ";s:6:"ῢ";s:3:"ΰ";s:6:"ΰ";s:3:"ῤ";s:4:"ῤ";s:3:"ῥ";s:4:"ῥ";s:3:"ῦ";s:4:"ῦ";s:3:"ῧ";s:6:"ῧ";s:3:"Ῠ";s:4:"Ῠ";s:3:"Ῡ";s:4:"Ῡ";s:3:"Ὺ";s:4:"Ὺ";s:3:"Ύ";s:4:"Ύ";s:3:"Ῥ";s:4:"Ῥ";s:3:"῭";s:5:" ̈̀";s:3:"΅";s:5:" ̈́";s:3:"`";s:1:"`";s:3:"ῲ";s:6:"ῲ";s:3:"ῳ";s:4:"ῳ";s:3:"ῴ";s:6:"ῴ";s:3:"ῶ";s:4:"ῶ";s:3:"ῷ";s:6:"ῷ";s:3:"Ὸ";s:4:"Ὸ";s:3:"Ό";s:4:"Ό";s:3:"Ὼ";s:4:"Ὼ";s:3:"Ώ";s:4:"Ώ";s:3:"ῼ";s:4:"ῼ";s:3:"´";s:3:" ́";s:3:"῾";s:3:" ̔";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:" ";s:1:" ";s:3:"‑";s:3:"‐";s:3:"‗";s:3:" ̳";s:3:"․";s:1:".";s:3:"‥";s:2:"..";s:3:"…";s:3:"...";s:3:" ";s:1:" ";s:3:"″";s:6:"′′";s:3:"‴";s:9:"′′′";s:3:"‶";s:6:"‵‵";s:3:"‷";s:9:"‵‵‵";s:3:"‼";s:2:"!!";s:3:"‾";s:3:" ̅";s:3:"⁇";s:2:"??";s:3:"⁈";s:2:"?!";s:3:"⁉";s:2:"!?";s:3:"⁗";s:12:"′′′′";s:3:" ";s:1:" ";s:3:"⁰";s:1:"0";s:3:"ⁱ";s:1:"i";s:3:"⁴";s:1:"4";s:3:"⁵";s:1:"5";s:3:"⁶";s:1:"6";s:3:"⁷";s:1:"7";s:3:"⁸";s:1:"8";s:3:"⁹";s:1:"9";s:3:"⁺";s:1:"+";s:3:"⁻";s:3:"−";s:3:"⁼";s:1:"=";s:3:"⁽";s:1:"(";s:3:"⁾";s:1:")";s:3:"ⁿ";s:1:"n";s:3:"₀";s:1:"0";s:3:"₁";s:1:"1";s:3:"₂";s:1:"2";s:3:"₃";s:1:"3";s:3:"₄";s:1:"4";s:3:"₅";s:1:"5";s:3:"₆";s:1:"6";s:3:"₇";s:1:"7";s:3:"₈";s:1:"8";s:3:"₉";s:1:"9";s:3:"₊";s:1:"+";s:3:"₋";s:3:"−";s:3:"₌";s:1:"=";s:3:"₍";s:1:"(";s:3:"₎";s:1:")";s:3:"ₐ";s:1:"a";s:3:"ₑ";s:1:"e";s:3:"ₒ";s:1:"o";s:3:"ₓ";s:1:"x";s:3:"ₔ";s:2:"ə";s:3:"ₕ";s:1:"h";s:3:"ₖ";s:1:"k";s:3:"ₗ";s:1:"l";s:3:"ₘ";s:1:"m";s:3:"ₙ";s:1:"n";s:3:"ₚ";s:1:"p";s:3:"ₛ";s:1:"s";s:3:"ₜ";s:1:"t";s:3:"₨";s:2:"Rs";s:3:"℀";s:3:"a/c";s:3:"℁";s:3:"a/s";s:3:"ℂ";s:1:"C";s:3:"℃";s:3:"°C";s:3:"℅";s:3:"c/o";s:3:"℆";s:3:"c/u";s:3:"ℇ";s:2:"Ɛ";s:3:"℉";s:3:"°F";s:3:"ℊ";s:1:"g";s:3:"ℋ";s:1:"H";s:3:"ℌ";s:1:"H";s:3:"ℍ";s:1:"H";s:3:"ℎ";s:1:"h";s:3:"ℏ";s:2:"ħ";s:3:"ℐ";s:1:"I";s:3:"ℑ";s:1:"I";s:3:"ℒ";s:1:"L";s:3:"ℓ";s:1:"l";s:3:"ℕ";s:1:"N";s:3:"№";s:2:"No";s:3:"ℙ";s:1:"P";s:3:"ℚ";s:1:"Q";s:3:"ℛ";s:1:"R";s:3:"ℜ";s:1:"R";s:3:"ℝ";s:1:"R";s:3:"℠";s:2:"SM";s:3:"℡";s:3:"TEL";s:3:"™";s:2:"TM";s:3:"ℤ";s:1:"Z";s:3:"Ω";s:2:"Ω";s:3:"ℨ";s:1:"Z";s:3:"K";s:1:"K";s:3:"Å";s:3:"Å";s:3:"ℬ";s:1:"B";s:3:"ℭ";s:1:"C";s:3:"ℯ";s:1:"e";s:3:"ℰ";s:1:"E";s:3:"ℱ";s:1:"F";s:3:"ℳ";s:1:"M";s:3:"ℴ";s:1:"o";s:3:"ℵ";s:2:"א";s:3:"ℶ";s:2:"ב";s:3:"ℷ";s:2:"ג";s:3:"ℸ";s:2:"ד";s:3:"ℹ";s:1:"i";s:3:"℻";s:3:"FAX";s:3:"ℼ";s:2:"π";s:3:"ℽ";s:2:"γ";s:3:"ℾ";s:2:"Γ";s:3:"ℿ";s:2:"Π";s:3:"⅀";s:3:"∑";s:3:"ⅅ";s:1:"D";s:3:"ⅆ";s:1:"d";s:3:"ⅇ";s:1:"e";s:3:"ⅈ";s:1:"i";s:3:"ⅉ";s:1:"j";s:3:"⅐";s:5:"1⁄7";s:3:"⅑";s:5:"1⁄9";s:3:"⅒";s:6:"1⁄10";s:3:"⅓";s:5:"1⁄3";s:3:"⅔";s:5:"2⁄3";s:3:"⅕";s:5:"1⁄5";s:3:"⅖";s:5:"2⁄5";s:3:"⅗";s:5:"3⁄5";s:3:"⅘";s:5:"4⁄5";s:3:"⅙";s:5:"1⁄6";s:3:"⅚";s:5:"5⁄6";s:3:"⅛";s:5:"1⁄8";s:3:"⅜";s:5:"3⁄8";s:3:"⅝";s:5:"5⁄8";s:3:"⅞";s:5:"7⁄8";s:3:"⅟";s:4:"1⁄";s:3:"Ⅰ";s:1:"I";s:3:"Ⅱ";s:2:"II";s:3:"Ⅲ";s:3:"III";s:3:"Ⅳ";s:2:"IV";s:3:"Ⅴ";s:1:"V";s:3:"Ⅵ";s:2:"VI";s:3:"Ⅶ";s:3:"VII";s:3:"Ⅷ";s:4:"VIII";s:3:"Ⅸ";s:2:"IX";s:3:"Ⅹ";s:1:"X";s:3:"Ⅺ";s:2:"XI";s:3:"Ⅻ";s:3:"XII";s:3:"Ⅼ";s:1:"L";s:3:"Ⅽ";s:1:"C";s:3:"Ⅾ";s:1:"D";s:3:"Ⅿ";s:1:"M";s:3:"ⅰ";s:1:"i";s:3:"ⅱ";s:2:"ii";s:3:"ⅲ";s:3:"iii";s:3:"ⅳ";s:2:"iv";s:3:"ⅴ";s:1:"v";s:3:"ⅵ";s:2:"vi";s:3:"ⅶ";s:3:"vii";s:3:"ⅷ";s:4:"viii";s:3:"ⅸ";s:2:"ix";s:3:"ⅹ";s:1:"x";s:3:"ⅺ";s:2:"xi";s:3:"ⅻ";s:3:"xii";s:3:"ⅼ";s:1:"l";s:3:"ⅽ";s:1:"c";s:3:"ⅾ";s:1:"d";s:3:"ⅿ";s:1:"m";s:3:"↉";s:5:"0⁄3";s:3:"↚";s:5:"↚";s:3:"↛";s:5:"↛";s:3:"↮";s:5:"↮";s:3:"⇍";s:5:"⇍";s:3:"⇎";s:5:"⇎";s:3:"⇏";s:5:"⇏";s:3:"∄";s:5:"∄";s:3:"∉";s:5:"∉";s:3:"∌";s:5:"∌";s:3:"∤";s:5:"∤";s:3:"∦";s:5:"∦";s:3:"∬";s:6:"∫∫";s:3:"∭";s:9:"∫∫∫";s:3:"∯";s:6:"∮∮";s:3:"∰";s:9:"∮∮∮";s:3:"≁";s:5:"≁";s:3:"≄";s:5:"≄";s:3:"≇";s:5:"≇";s:3:"≉";s:5:"≉";s:3:"≠";s:3:"≠";s:3:"≢";s:5:"≢";s:3:"≭";s:5:"≭";s:3:"≮";s:3:"≮";s:3:"≯";s:3:"≯";s:3:"≰";s:5:"≰";s:3:"≱";s:5:"≱";s:3:"≴";s:5:"≴";s:3:"≵";s:5:"≵";s:3:"≸";s:5:"≸";s:3:"≹";s:5:"≹";s:3:"⊀";s:5:"⊀";s:3:"⊁";s:5:"⊁";s:3:"⊄";s:5:"⊄";s:3:"⊅";s:5:"⊅";s:3:"⊈";s:5:"⊈";s:3:"⊉";s:5:"⊉";s:3:"⊬";s:5:"⊬";s:3:"⊭";s:5:"⊭";s:3:"⊮";s:5:"⊮";s:3:"⊯";s:5:"⊯";s:3:"⋠";s:5:"⋠";s:3:"⋡";s:5:"⋡";s:3:"⋢";s:5:"⋢";s:3:"⋣";s:5:"⋣";s:3:"⋪";s:5:"⋪";s:3:"⋫";s:5:"⋫";s:3:"⋬";s:5:"⋬";s:3:"⋭";s:5:"⋭";s:3:"〈";s:3:"〈";s:3:"〉";s:3:"〉";s:3:"①";s:1:"1";s:3:"②";s:1:"2";s:3:"③";s:1:"3";s:3:"④";s:1:"4";s:3:"⑤";s:1:"5";s:3:"⑥";s:1:"6";s:3:"⑦";s:1:"7";s:3:"⑧";s:1:"8";s:3:"⑨";s:1:"9";s:3:"⑩";s:2:"10";s:3:"⑪";s:2:"11";s:3:"⑫";s:2:"12";s:3:"⑬";s:2:"13";s:3:"⑭";s:2:"14";s:3:"⑮";s:2:"15";s:3:"⑯";s:2:"16";s:3:"⑰";s:2:"17";s:3:"⑱";s:2:"18";s:3:"⑲";s:2:"19";s:3:"⑳";s:2:"20";s:3:"⑴";s:3:"(1)";s:3:"⑵";s:3:"(2)";s:3:"⑶";s:3:"(3)";s:3:"⑷";s:3:"(4)";s:3:"⑸";s:3:"(5)";s:3:"⑹";s:3:"(6)";s:3:"⑺";s:3:"(7)";s:3:"⑻";s:3:"(8)";s:3:"⑼";s:3:"(9)";s:3:"⑽";s:4:"(10)";s:3:"⑾";s:4:"(11)";s:3:"⑿";s:4:"(12)";s:3:"⒀";s:4:"(13)";s:3:"⒁";s:4:"(14)";s:3:"⒂";s:4:"(15)";s:3:"⒃";s:4:"(16)";s:3:"⒄";s:4:"(17)";s:3:"⒅";s:4:"(18)";s:3:"⒆";s:4:"(19)";s:3:"⒇";s:4:"(20)";s:3:"⒈";s:2:"1.";s:3:"⒉";s:2:"2.";s:3:"⒊";s:2:"3.";s:3:"⒋";s:2:"4.";s:3:"⒌";s:2:"5.";s:3:"⒍";s:2:"6.";s:3:"⒎";s:2:"7.";s:3:"⒏";s:2:"8.";s:3:"⒐";s:2:"9.";s:3:"⒑";s:3:"10.";s:3:"⒒";s:3:"11.";s:3:"⒓";s:3:"12.";s:3:"⒔";s:3:"13.";s:3:"⒕";s:3:"14.";s:3:"⒖";s:3:"15.";s:3:"⒗";s:3:"16.";s:3:"⒘";s:3:"17.";s:3:"⒙";s:3:"18.";s:3:"⒚";s:3:"19.";s:3:"⒛";s:3:"20.";s:3:"⒜";s:3:"(a)";s:3:"⒝";s:3:"(b)";s:3:"⒞";s:3:"(c)";s:3:"⒟";s:3:"(d)";s:3:"⒠";s:3:"(e)";s:3:"⒡";s:3:"(f)";s:3:"⒢";s:3:"(g)";s:3:"⒣";s:3:"(h)";s:3:"⒤";s:3:"(i)";s:3:"⒥";s:3:"(j)";s:3:"⒦";s:3:"(k)";s:3:"⒧";s:3:"(l)";s:3:"⒨";s:3:"(m)";s:3:"⒩";s:3:"(n)";s:3:"⒪";s:3:"(o)";s:3:"⒫";s:3:"(p)";s:3:"⒬";s:3:"(q)";s:3:"⒭";s:3:"(r)";s:3:"⒮";s:3:"(s)";s:3:"⒯";s:3:"(t)";s:3:"⒰";s:3:"(u)";s:3:"⒱";s:3:"(v)";s:3:"⒲";s:3:"(w)";s:3:"⒳";s:3:"(x)";s:3:"⒴";s:3:"(y)";s:3:"⒵";s:3:"(z)";s:3:"Ⓐ";s:1:"A";s:3:"Ⓑ";s:1:"B";s:3:"Ⓒ";s:1:"C";s:3:"Ⓓ";s:1:"D";s:3:"Ⓔ";s:1:"E";s:3:"Ⓕ";s:1:"F";s:3:"Ⓖ";s:1:"G";s:3:"Ⓗ";s:1:"H";s:3:"Ⓘ";s:1:"I";s:3:"Ⓙ";s:1:"J";s:3:"Ⓚ";s:1:"K";s:3:"Ⓛ";s:1:"L";s:3:"Ⓜ";s:1:"M";s:3:"Ⓝ";s:1:"N";s:3:"Ⓞ";s:1:"O";s:3:"Ⓟ";s:1:"P";s:3:"Ⓠ";s:1:"Q";s:3:"Ⓡ";s:1:"R";s:3:"Ⓢ";s:1:"S";s:3:"Ⓣ";s:1:"T";s:3:"Ⓤ";s:1:"U";s:3:"Ⓥ";s:1:"V";s:3:"Ⓦ";s:1:"W";s:3:"Ⓧ";s:1:"X";s:3:"Ⓨ";s:1:"Y";s:3:"Ⓩ";s:1:"Z";s:3:"ⓐ";s:1:"a";s:3:"ⓑ";s:1:"b";s:3:"ⓒ";s:1:"c";s:3:"ⓓ";s:1:"d";s:3:"ⓔ";s:1:"e";s:3:"ⓕ";s:1:"f";s:3:"ⓖ";s:1:"g";s:3:"ⓗ";s:1:"h";s:3:"ⓘ";s:1:"i";s:3:"ⓙ";s:1:"j";s:3:"ⓚ";s:1:"k";s:3:"ⓛ";s:1:"l";s:3:"ⓜ";s:1:"m";s:3:"ⓝ";s:1:"n";s:3:"ⓞ";s:1:"o";s:3:"ⓟ";s:1:"p";s:3:"ⓠ";s:1:"q";s:3:"ⓡ";s:1:"r";s:3:"ⓢ";s:1:"s";s:3:"ⓣ";s:1:"t";s:3:"ⓤ";s:1:"u";s:3:"ⓥ";s:1:"v";s:3:"ⓦ";s:1:"w";s:3:"ⓧ";s:1:"x";s:3:"ⓨ";s:1:"y";s:3:"ⓩ";s:1:"z";s:3:"⓪";s:1:"0";s:3:"⨌";s:12:"∫∫∫∫";s:3:"⩴";s:3:"::=";s:3:"⩵";s:2:"==";s:3:"⩶";s:3:"===";s:3:"⫝̸";s:5:"⫝̸";s:3:"ⱼ";s:1:"j";s:3:"ⱽ";s:1:"V";s:3:"ⵯ";s:3:"ⵡ";s:3:"⺟";s:3:"母";s:3:"⻳";s:3:"龟";s:3:"⼀";s:3:"一";s:3:"⼁";s:3:"丨";s:3:"⼂";s:3:"丶";s:3:"⼃";s:3:"丿";s:3:"⼄";s:3:"乙";s:3:"⼅";s:3:"亅";s:3:"⼆";s:3:"二";s:3:"⼇";s:3:"亠";s:3:"⼈";s:3:"人";s:3:"⼉";s:3:"儿";s:3:"⼊";s:3:"入";s:3:"⼋";s:3:"八";s:3:"⼌";s:3:"冂";s:3:"⼍";s:3:"冖";s:3:"⼎";s:3:"冫";s:3:"⼏";s:3:"几";s:3:"⼐";s:3:"凵";s:3:"⼑";s:3:"刀";s:3:"⼒";s:3:"力";s:3:"⼓";s:3:"勹";s:3:"⼔";s:3:"匕";s:3:"⼕";s:3:"匚";s:3:"⼖";s:3:"匸";s:3:"⼗";s:3:"十";s:3:"⼘";s:3:"卜";s:3:"⼙";s:3:"卩";s:3:"⼚";s:3:"厂";s:3:"⼛";s:3:"厶";s:3:"⼜";s:3:"又";s:3:"⼝";s:3:"口";s:3:"⼞";s:3:"囗";s:3:"⼟";s:3:"土";s:3:"⼠";s:3:"士";s:3:"⼡";s:3:"夂";s:3:"⼢";s:3:"夊";s:3:"⼣";s:3:"夕";s:3:"⼤";s:3:"大";s:3:"⼥";s:3:"女";s:3:"⼦";s:3:"子";s:3:"⼧";s:3:"宀";s:3:"⼨";s:3:"寸";s:3:"⼩";s:3:"小";s:3:"⼪";s:3:"尢";s:3:"⼫";s:3:"尸";s:3:"⼬";s:3:"屮";s:3:"⼭";s:3:"山";s:3:"⼮";s:3:"巛";s:3:"⼯";s:3:"工";s:3:"⼰";s:3:"己";s:3:"⼱";s:3:"巾";s:3:"⼲";s:3:"干";s:3:"⼳";s:3:"幺";s:3:"⼴";s:3:"广";s:3:"⼵";s:3:"廴";s:3:"⼶";s:3:"廾";s:3:"⼷";s:3:"弋";s:3:"⼸";s:3:"弓";s:3:"⼹";s:3:"彐";s:3:"⼺";s:3:"彡";s:3:"⼻";s:3:"彳";s:3:"⼼";s:3:"心";s:3:"⼽";s:3:"戈";s:3:"⼾";s:3:"戶";s:3:"⼿";s:3:"手";s:3:"⽀";s:3:"支";s:3:"⽁";s:3:"攴";s:3:"⽂";s:3:"文";s:3:"⽃";s:3:"斗";s:3:"⽄";s:3:"斤";s:3:"⽅";s:3:"方";s:3:"⽆";s:3:"无";s:3:"⽇";s:3:"日";s:3:"⽈";s:3:"曰";s:3:"⽉";s:3:"月";s:3:"⽊";s:3:"木";s:3:"⽋";s:3:"欠";s:3:"⽌";s:3:"止";s:3:"⽍";s:3:"歹";s:3:"⽎";s:3:"殳";s:3:"⽏";s:3:"毋";s:3:"⽐";s:3:"比";s:3:"⽑";s:3:"毛";s:3:"⽒";s:3:"氏";s:3:"⽓";s:3:"气";s:3:"⽔";s:3:"水";s:3:"⽕";s:3:"火";s:3:"⽖";s:3:"爪";s:3:"⽗";s:3:"父";s:3:"⽘";s:3:"爻";s:3:"⽙";s:3:"爿";s:3:"⽚";s:3:"片";s:3:"⽛";s:3:"牙";s:3:"⽜";s:3:"牛";s:3:"⽝";s:3:"犬";s:3:"⽞";s:3:"玄";s:3:"⽟";s:3:"玉";s:3:"⽠";s:3:"瓜";s:3:"⽡";s:3:"瓦";s:3:"⽢";s:3:"甘";s:3:"⽣";s:3:"生";s:3:"⽤";s:3:"用";s:3:"⽥";s:3:"田";s:3:"⽦";s:3:"疋";s:3:"⽧";s:3:"疒";s:3:"⽨";s:3:"癶";s:3:"⽩";s:3:"白";s:3:"⽪";s:3:"皮";s:3:"⽫";s:3:"皿";s:3:"⽬";s:3:"目";s:3:"⽭";s:3:"矛";s:3:"⽮";s:3:"矢";s:3:"⽯";s:3:"石";s:3:"⽰";s:3:"示";s:3:"⽱";s:3:"禸";s:3:"⽲";s:3:"禾";s:3:"⽳";s:3:"穴";s:3:"⽴";s:3:"立";s:3:"⽵";s:3:"竹";s:3:"⽶";s:3:"米";s:3:"⽷";s:3:"糸";s:3:"⽸";s:3:"缶";s:3:"⽹";s:3:"网";s:3:"⽺";s:3:"羊";s:3:"⽻";s:3:"羽";s:3:"⽼";s:3:"老";s:3:"⽽";s:3:"而";s:3:"⽾";s:3:"耒";s:3:"⽿";s:3:"耳";s:3:"⾀";s:3:"聿";s:3:"⾁";s:3:"肉";s:3:"⾂";s:3:"臣";s:3:"⾃";s:3:"自";s:3:"⾄";s:3:"至";s:3:"⾅";s:3:"臼";s:3:"⾆";s:3:"舌";s:3:"⾇";s:3:"舛";s:3:"⾈";s:3:"舟";s:3:"⾉";s:3:"艮";s:3:"⾊";s:3:"色";s:3:"⾋";s:3:"艸";s:3:"⾌";s:3:"虍";s:3:"⾍";s:3:"虫";s:3:"⾎";s:3:"血";s:3:"⾏";s:3:"行";s:3:"⾐";s:3:"衣";s:3:"⾑";s:3:"襾";s:3:"⾒";s:3:"見";s:3:"⾓";s:3:"角";s:3:"⾔";s:3:"言";s:3:"⾕";s:3:"谷";s:3:"⾖";s:3:"豆";s:3:"⾗";s:3:"豕";s:3:"⾘";s:3:"豸";s:3:"⾙";s:3:"貝";s:3:"⾚";s:3:"赤";s:3:"⾛";s:3:"走";s:3:"⾜";s:3:"足";s:3:"⾝";s:3:"身";s:3:"⾞";s:3:"車";s:3:"⾟";s:3:"辛";s:3:"⾠";s:3:"辰";s:3:"⾡";s:3:"辵";s:3:"⾢";s:3:"邑";s:3:"⾣";s:3:"酉";s:3:"⾤";s:3:"釆";s:3:"⾥";s:3:"里";s:3:"⾦";s:3:"金";s:3:"⾧";s:3:"長";s:3:"⾨";s:3:"門";s:3:"⾩";s:3:"阜";s:3:"⾪";s:3:"隶";s:3:"⾫";s:3:"隹";s:3:"⾬";s:3:"雨";s:3:"⾭";s:3:"靑";s:3:"⾮";s:3:"非";s:3:"⾯";s:3:"面";s:3:"⾰";s:3:"革";s:3:"⾱";s:3:"韋";s:3:"⾲";s:3:"韭";s:3:"⾳";s:3:"音";s:3:"⾴";s:3:"頁";s:3:"⾵";s:3:"風";s:3:"⾶";s:3:"飛";s:3:"⾷";s:3:"食";s:3:"⾸";s:3:"首";s:3:"⾹";s:3:"香";s:3:"⾺";s:3:"馬";s:3:"⾻";s:3:"骨";s:3:"⾼";s:3:"高";s:3:"⾽";s:3:"髟";s:3:"⾾";s:3:"鬥";s:3:"⾿";s:3:"鬯";s:3:"⿀";s:3:"鬲";s:3:"⿁";s:3:"鬼";s:3:"⿂";s:3:"魚";s:3:"⿃";s:3:"鳥";s:3:"⿄";s:3:"鹵";s:3:"⿅";s:3:"鹿";s:3:"⿆";s:3:"麥";s:3:"⿇";s:3:"麻";s:3:"⿈";s:3:"黃";s:3:"⿉";s:3:"黍";s:3:"⿊";s:3:"黑";s:3:"⿋";s:3:"黹";s:3:"⿌";s:3:"黽";s:3:"⿍";s:3:"鼎";s:3:"⿎";s:3:"鼓";s:3:"⿏";s:3:"鼠";s:3:"⿐";s:3:"鼻";s:3:"⿑";s:3:"齊";s:3:"⿒";s:3:"齒";s:3:"⿓";s:3:"龍";s:3:"⿔";s:3:"龜";s:3:"⿕";s:3:"龠";s:3:" ";s:1:" ";s:3:"〶";s:3:"〒";s:3:"〸";s:3:"十";s:3:"〹";s:3:"卄";s:3:"〺";s:3:"卅";s:3:"が";s:6:"が";s:3:"ぎ";s:6:"ぎ";s:3:"ぐ";s:6:"ぐ";s:3:"げ";s:6:"げ";s:3:"ご";s:6:"ご";s:3:"ざ";s:6:"ざ";s:3:"じ";s:6:"じ";s:3:"ず";s:6:"ず";s:3:"ぜ";s:6:"ぜ";s:3:"ぞ";s:6:"ぞ";s:3:"だ";s:6:"だ";s:3:"ぢ";s:6:"ぢ";s:3:"づ";s:6:"づ";s:3:"で";s:6:"で";s:3:"ど";s:6:"ど";s:3:"ば";s:6:"ば";s:3:"ぱ";s:6:"ぱ";s:3:"び";s:6:"び";s:3:"ぴ";s:6:"ぴ";s:3:"ぶ";s:6:"ぶ";s:3:"ぷ";s:6:"ぷ";s:3:"べ";s:6:"べ";s:3:"ぺ";s:6:"ぺ";s:3:"ぼ";s:6:"ぼ";s:3:"ぽ";s:6:"ぽ";s:3:"ゔ";s:6:"ゔ";s:3:"゛";s:4:" ゙";s:3:"゜";s:4:" ゚";s:3:"ゞ";s:6:"ゞ";s:3:"ゟ";s:6:"より";s:3:"ガ";s:6:"ガ";s:3:"ギ";s:6:"ギ";s:3:"グ";s:6:"グ";s:3:"ゲ";s:6:"ゲ";s:3:"ゴ";s:6:"ゴ";s:3:"ザ";s:6:"ザ";s:3:"ジ";s:6:"ジ";s:3:"ズ";s:6:"ズ";s:3:"ゼ";s:6:"ゼ";s:3:"ゾ";s:6:"ゾ";s:3:"ダ";s:6:"ダ";s:3:"ヂ";s:6:"ヂ";s:3:"ヅ";s:6:"ヅ";s:3:"デ";s:6:"デ";s:3:"ド";s:6:"ド";s:3:"バ";s:6:"バ";s:3:"パ";s:6:"パ";s:3:"ビ";s:6:"ビ";s:3:"ピ";s:6:"ピ";s:3:"ブ";s:6:"ブ";s:3:"プ";s:6:"プ";s:3:"ベ";s:6:"ベ";s:3:"ペ";s:6:"ペ";s:3:"ボ";s:6:"ボ";s:3:"ポ";s:6:"ポ";s:3:"ヴ";s:6:"ヴ";s:3:"ヷ";s:6:"ヷ";s:3:"ヸ";s:6:"ヸ";s:3:"ヹ";s:6:"ヹ";s:3:"ヺ";s:6:"ヺ";s:3:"ヾ";s:6:"ヾ";s:3:"ヿ";s:6:"コト";s:3:"ㄱ";s:3:"ᄀ";s:3:"ㄲ";s:3:"ᄁ";s:3:"ㄳ";s:3:"ᆪ";s:3:"ㄴ";s:3:"ᄂ";s:3:"ㄵ";s:3:"ᆬ";s:3:"ㄶ";s:3:"ᆭ";s:3:"ㄷ";s:3:"ᄃ";s:3:"ㄸ";s:3:"ᄄ";s:3:"ㄹ";s:3:"ᄅ";s:3:"ㄺ";s:3:"ᆰ";s:3:"ㄻ";s:3:"ᆱ";s:3:"ㄼ";s:3:"ᆲ";s:3:"ㄽ";s:3:"ᆳ";s:3:"ㄾ";s:3:"ᆴ";s:3:"ㄿ";s:3:"ᆵ";s:3:"ㅀ";s:3:"ᄚ";s:3:"ㅁ";s:3:"ᄆ";s:3:"ㅂ";s:3:"ᄇ";s:3:"ㅃ";s:3:"ᄈ";s:3:"ㅄ";s:3:"ᄡ";s:3:"ㅅ";s:3:"ᄉ";s:3:"ㅆ";s:3:"ᄊ";s:3:"ㅇ";s:3:"ᄋ";s:3:"ㅈ";s:3:"ᄌ";s:3:"ㅉ";s:3:"ᄍ";s:3:"ㅊ";s:3:"ᄎ";s:3:"ㅋ";s:3:"ᄏ";s:3:"ㅌ";s:3:"ᄐ";s:3:"ㅍ";s:3:"ᄑ";s:3:"ㅎ";s:3:"ᄒ";s:3:"ㅏ";s:3:"ᅡ";s:3:"ㅐ";s:3:"ᅢ";s:3:"ㅑ";s:3:"ᅣ";s:3:"ㅒ";s:3:"ᅤ";s:3:"ㅓ";s:3:"ᅥ";s:3:"ㅔ";s:3:"ᅦ";s:3:"ㅕ";s:3:"ᅧ";s:3:"ㅖ";s:3:"ᅨ";s:3:"ㅗ";s:3:"ᅩ";s:3:"ㅘ";s:3:"ᅪ";s:3:"ㅙ";s:3:"ᅫ";s:3:"ㅚ";s:3:"ᅬ";s:3:"ㅛ";s:3:"ᅭ";s:3:"ㅜ";s:3:"ᅮ";s:3:"ㅝ";s:3:"ᅯ";s:3:"ㅞ";s:3:"ᅰ";s:3:"ㅟ";s:3:"ᅱ";s:3:"ㅠ";s:3:"ᅲ";s:3:"ㅡ";s:3:"ᅳ";s:3:"ㅢ";s:3:"ᅴ";s:3:"ㅣ";s:3:"ᅵ";s:3:"ㅤ";s:3:"ᅠ";s:3:"ㅥ";s:3:"ᄔ";s:3:"ㅦ";s:3:"ᄕ";s:3:"ㅧ";s:3:"ᇇ";s:3:"ㅨ";s:3:"ᇈ";s:3:"ㅩ";s:3:"ᇌ";s:3:"ㅪ";s:3:"ᇎ";s:3:"ㅫ";s:3:"ᇓ";s:3:"ㅬ";s:3:"ᇗ";s:3:"ㅭ";s:3:"ᇙ";s:3:"ㅮ";s:3:"ᄜ";s:3:"ㅯ";s:3:"ᇝ";s:3:"ㅰ";s:3:"ᇟ";s:3:"ㅱ";s:3:"ᄝ";s:3:"ㅲ";s:3:"ᄞ";s:3:"ㅳ";s:3:"ᄠ";s:3:"ㅴ";s:3:"ᄢ";s:3:"ㅵ";s:3:"ᄣ";s:3:"ㅶ";s:3:"ᄧ";s:3:"ㅷ";s:3:"ᄩ";s:3:"ㅸ";s:3:"ᄫ";s:3:"ㅹ";s:3:"ᄬ";s:3:"ㅺ";s:3:"ᄭ";s:3:"ㅻ";s:3:"ᄮ";s:3:"ㅼ";s:3:"ᄯ";s:3:"ㅽ";s:3:"ᄲ";s:3:"ㅾ";s:3:"ᄶ";s:3:"ㅿ";s:3:"ᅀ";s:3:"ㆀ";s:3:"ᅇ";s:3:"ㆁ";s:3:"ᅌ";s:3:"ㆂ";s:3:"ᇱ";s:3:"ㆃ";s:3:"ᇲ";s:3:"ㆄ";s:3:"ᅗ";s:3:"ㆅ";s:3:"ᅘ";s:3:"ㆆ";s:3:"ᅙ";s:3:"ㆇ";s:3:"ᆄ";s:3:"ㆈ";s:3:"ᆅ";s:3:"ㆉ";s:3:"ᆈ";s:3:"ㆊ";s:3:"ᆑ";s:3:"ㆋ";s:3:"ᆒ";s:3:"ㆌ";s:3:"ᆔ";s:3:"ㆍ";s:3:"ᆞ";s:3:"ㆎ";s:3:"ᆡ";s:3:"㆒";s:3:"一";s:3:"㆓";s:3:"二";s:3:"㆔";s:3:"三";s:3:"㆕";s:3:"四";s:3:"㆖";s:3:"上";s:3:"㆗";s:3:"中";s:3:"㆘";s:3:"下";s:3:"㆙";s:3:"甲";s:3:"㆚";s:3:"乙";s:3:"㆛";s:3:"丙";s:3:"㆜";s:3:"丁";s:3:"㆝";s:3:"天";s:3:"㆞";s:3:"地";s:3:"㆟";s:3:"人";s:3:"㈀";s:5:"(ᄀ)";s:3:"㈁";s:5:"(ᄂ)";s:3:"㈂";s:5:"(ᄃ)";s:3:"㈃";s:5:"(ᄅ)";s:3:"㈄";s:5:"(ᄆ)";s:3:"㈅";s:5:"(ᄇ)";s:3:"㈆";s:5:"(ᄉ)";s:3:"㈇";s:5:"(ᄋ)";s:3:"㈈";s:5:"(ᄌ)";s:3:"㈉";s:5:"(ᄎ)";s:3:"㈊";s:5:"(ᄏ)";s:3:"㈋";s:5:"(ᄐ)";s:3:"㈌";s:5:"(ᄑ)";s:3:"㈍";s:5:"(ᄒ)";s:3:"㈎";s:8:"(가)";s:3:"㈏";s:8:"(나)";s:3:"㈐";s:8:"(다)";s:3:"㈑";s:8:"(라)";s:3:"㈒";s:8:"(마)";s:3:"㈓";s:8:"(바)";s:3:"㈔";s:8:"(사)";s:3:"㈕";s:8:"(아)";s:3:"㈖";s:8:"(자)";s:3:"㈗";s:8:"(차)";s:3:"㈘";s:8:"(카)";s:3:"㈙";s:8:"(타)";s:3:"㈚";s:8:"(파)";s:3:"㈛";s:8:"(하)";s:3:"㈜";s:8:"(주)";s:3:"㈝";s:17:"(오전)";s:3:"㈞";s:14:"(오후)";s:3:"㈠";s:5:"(一)";s:3:"㈡";s:5:"(二)";s:3:"㈢";s:5:"(三)";s:3:"㈣";s:5:"(四)";s:3:"㈤";s:5:"(五)";s:3:"㈥";s:5:"(六)";s:3:"㈦";s:5:"(七)";s:3:"㈧";s:5:"(八)";s:3:"㈨";s:5:"(九)";s:3:"㈩";s:5:"(十)";s:3:"㈪";s:5:"(月)";s:3:"㈫";s:5:"(火)";s:3:"㈬";s:5:"(水)";s:3:"㈭";s:5:"(木)";s:3:"㈮";s:5:"(金)";s:3:"㈯";s:5:"(土)";s:3:"㈰";s:5:"(日)";s:3:"㈱";s:5:"(株)";s:3:"㈲";s:5:"(有)";s:3:"㈳";s:5:"(社)";s:3:"㈴";s:5:"(名)";s:3:"㈵";s:5:"(特)";s:3:"㈶";s:5:"(財)";s:3:"㈷";s:5:"(祝)";s:3:"㈸";s:5:"(労)";s:3:"㈹";s:5:"(代)";s:3:"㈺";s:5:"(呼)";s:3:"㈻";s:5:"(学)";s:3:"㈼";s:5:"(監)";s:3:"㈽";s:5:"(企)";s:3:"㈾";s:5:"(資)";s:3:"㈿";s:5:"(協)";s:3:"㉀";s:5:"(祭)";s:3:"㉁";s:5:"(休)";s:3:"㉂";s:5:"(自)";s:3:"㉃";s:5:"(至)";s:3:"㉄";s:3:"問";s:3:"㉅";s:3:"幼";s:3:"㉆";s:3:"文";s:3:"㉇";s:3:"箏";s:3:"㉐";s:3:"PTE";s:3:"㉑";s:2:"21";s:3:"㉒";s:2:"22";s:3:"㉓";s:2:"23";s:3:"㉔";s:2:"24";s:3:"㉕";s:2:"25";s:3:"㉖";s:2:"26";s:3:"㉗";s:2:"27";s:3:"㉘";s:2:"28";s:3:"㉙";s:2:"29";s:3:"㉚";s:2:"30";s:3:"㉛";s:2:"31";s:3:"㉜";s:2:"32";s:3:"㉝";s:2:"33";s:3:"㉞";s:2:"34";s:3:"㉟";s:2:"35";s:3:"㉠";s:3:"ᄀ";s:3:"㉡";s:3:"ᄂ";s:3:"㉢";s:3:"ᄃ";s:3:"㉣";s:3:"ᄅ";s:3:"㉤";s:3:"ᄆ";s:3:"㉥";s:3:"ᄇ";s:3:"㉦";s:3:"ᄉ";s:3:"㉧";s:3:"ᄋ";s:3:"㉨";s:3:"ᄌ";s:3:"㉩";s:3:"ᄎ";s:3:"㉪";s:3:"ᄏ";s:3:"㉫";s:3:"ᄐ";s:3:"㉬";s:3:"ᄑ";s:3:"㉭";s:3:"ᄒ";s:3:"㉮";s:6:"가";s:3:"㉯";s:6:"나";s:3:"㉰";s:6:"다";s:3:"㉱";s:6:"라";s:3:"㉲";s:6:"마";s:3:"㉳";s:6:"바";s:3:"㉴";s:6:"사";s:3:"㉵";s:6:"아";s:3:"㉶";s:6:"자";s:3:"㉷";s:6:"차";s:3:"㉸";s:6:"카";s:3:"㉹";s:6:"타";s:3:"㉺";s:6:"파";s:3:"㉻";s:6:"하";s:3:"㉼";s:15:"참고";s:3:"㉽";s:12:"주의";s:3:"㉾";s:6:"우";s:3:"㊀";s:3:"一";s:3:"㊁";s:3:"二";s:3:"㊂";s:3:"三";s:3:"㊃";s:3:"四";s:3:"㊄";s:3:"五";s:3:"㊅";s:3:"六";s:3:"㊆";s:3:"七";s:3:"㊇";s:3:"八";s:3:"㊈";s:3:"九";s:3:"㊉";s:3:"十";s:3:"㊊";s:3:"月";s:3:"㊋";s:3:"火";s:3:"㊌";s:3:"水";s:3:"㊍";s:3:"木";s:3:"㊎";s:3:"金";s:3:"㊏";s:3:"土";s:3:"㊐";s:3:"日";s:3:"㊑";s:3:"株";s:3:"㊒";s:3:"有";s:3:"㊓";s:3:"社";s:3:"㊔";s:3:"名";s:3:"㊕";s:3:"特";s:3:"㊖";s:3:"財";s:3:"㊗";s:3:"祝";s:3:"㊘";s:3:"労";s:3:"㊙";s:3:"秘";s:3:"㊚";s:3:"男";s:3:"㊛";s:3:"女";s:3:"㊜";s:3:"適";s:3:"㊝";s:3:"優";s:3:"㊞";s:3:"印";s:3:"㊟";s:3:"注";s:3:"㊠";s:3:"項";s:3:"㊡";s:3:"休";s:3:"㊢";s:3:"写";s:3:"㊣";s:3:"正";s:3:"㊤";s:3:"上";s:3:"㊥";s:3:"中";s:3:"㊦";s:3:"下";s:3:"㊧";s:3:"左";s:3:"㊨";s:3:"右";s:3:"㊩";s:3:"医";s:3:"㊪";s:3:"宗";s:3:"㊫";s:3:"学";s:3:"㊬";s:3:"監";s:3:"㊭";s:3:"企";s:3:"㊮";s:3:"資";s:3:"㊯";s:3:"協";s:3:"㊰";s:3:"夜";s:3:"㊱";s:2:"36";s:3:"㊲";s:2:"37";s:3:"㊳";s:2:"38";s:3:"㊴";s:2:"39";s:3:"㊵";s:2:"40";s:3:"㊶";s:2:"41";s:3:"㊷";s:2:"42";s:3:"㊸";s:2:"43";s:3:"㊹";s:2:"44";s:3:"㊺";s:2:"45";s:3:"㊻";s:2:"46";s:3:"㊼";s:2:"47";s:3:"㊽";s:2:"48";s:3:"㊾";s:2:"49";s:3:"㊿";s:2:"50";s:3:"㋀";s:4:"1月";s:3:"㋁";s:4:"2月";s:3:"㋂";s:4:"3月";s:3:"㋃";s:4:"4月";s:3:"㋄";s:4:"5月";s:3:"㋅";s:4:"6月";s:3:"㋆";s:4:"7月";s:3:"㋇";s:4:"8月";s:3:"㋈";s:4:"9月";s:3:"㋉";s:5:"10月";s:3:"㋊";s:5:"11月";s:3:"㋋";s:5:"12月";s:3:"㋌";s:2:"Hg";s:3:"㋍";s:3:"erg";s:3:"㋎";s:2:"eV";s:3:"㋏";s:3:"LTD";s:3:"㋐";s:3:"ア";s:3:"㋑";s:3:"イ";s:3:"㋒";s:3:"ウ";s:3:"㋓";s:3:"エ";s:3:"㋔";s:3:"オ";s:3:"㋕";s:3:"カ";s:3:"㋖";s:3:"キ";s:3:"㋗";s:3:"ク";s:3:"㋘";s:3:"ケ";s:3:"㋙";s:3:"コ";s:3:"㋚";s:3:"サ";s:3:"㋛";s:3:"シ";s:3:"㋜";s:3:"ス";s:3:"㋝";s:3:"セ";s:3:"㋞";s:3:"ソ";s:3:"㋟";s:3:"タ";s:3:"㋠";s:3:"チ";s:3:"㋡";s:3:"ツ";s:3:"㋢";s:3:"テ";s:3:"㋣";s:3:"ト";s:3:"㋤";s:3:"ナ";s:3:"㋥";s:3:"ニ";s:3:"㋦";s:3:"ヌ";s:3:"㋧";s:3:"ネ";s:3:"㋨";s:3:"ノ";s:3:"㋩";s:3:"ハ";s:3:"㋪";s:3:"ヒ";s:3:"㋫";s:3:"フ";s:3:"㋬";s:3:"ヘ";s:3:"㋭";s:3:"ホ";s:3:"㋮";s:3:"マ";s:3:"㋯";s:3:"ミ";s:3:"㋰";s:3:"ム";s:3:"㋱";s:3:"メ";s:3:"㋲";s:3:"モ";s:3:"㋳";s:3:"ヤ";s:3:"㋴";s:3:"ユ";s:3:"㋵";s:3:"ヨ";s:3:"㋶";s:3:"ラ";s:3:"㋷";s:3:"リ";s:3:"㋸";s:3:"ル";s:3:"㋹";s:3:"レ";s:3:"㋺";s:3:"ロ";s:3:"㋻";s:3:"ワ";s:3:"㋼";s:3:"ヰ";s:3:"㋽";s:3:"ヱ";s:3:"㋾";s:3:"ヲ";s:3:"㌀";s:15:"アパート";s:3:"㌁";s:12:"アルファ";s:3:"㌂";s:15:"アンペア";s:3:"㌃";s:9:"アール";s:3:"㌄";s:15:"イニング";s:3:"㌅";s:9:"インチ";s:3:"㌆";s:9:"ウォン";s:3:"㌇";s:18:"エスクード";s:3:"㌈";s:12:"エーカー";s:3:"㌉";s:9:"オンス";s:3:"㌊";s:9:"オーム";s:3:"㌋";s:9:"カイリ";s:3:"㌌";s:12:"カラット";s:3:"㌍";s:12:"カロリー";s:3:"㌎";s:12:"ガロン";s:3:"㌏";s:12:"ガンマ";s:3:"㌐";s:12:"ギガ";s:3:"㌑";s:12:"ギニー";s:3:"㌒";s:12:"キュリー";s:3:"㌓";s:18:"ギルダー";s:3:"㌔";s:6:"キロ";s:3:"㌕";s:18:"キログラム";s:3:"㌖";s:18:"キロメートル";s:3:"㌗";s:15:"キロワット";s:3:"㌘";s:12:"グラム";s:3:"㌙";s:18:"グラムトン";s:3:"㌚";s:18:"クルゼイロ";s:3:"㌛";s:12:"クローネ";s:3:"㌜";s:9:"ケース";s:3:"㌝";s:9:"コルナ";s:3:"㌞";s:12:"コーポ";s:3:"㌟";s:12:"サイクル";s:3:"㌠";s:15:"サンチーム";s:3:"㌡";s:15:"シリング";s:3:"㌢";s:9:"センチ";s:3:"㌣";s:9:"セント";s:3:"㌤";s:12:"ダース";s:3:"㌥";s:9:"デシ";s:3:"㌦";s:9:"ドル";s:3:"㌧";s:6:"トン";s:3:"㌨";s:6:"ナノ";s:3:"㌩";s:9:"ノット";s:3:"㌪";s:9:"ハイツ";s:3:"㌫";s:18:"パーセント";s:3:"㌬";s:12:"パーツ";s:3:"㌭";s:15:"バーレル";s:3:"㌮";s:18:"ピアストル";s:3:"㌯";s:12:"ピクル";s:3:"㌰";s:9:"ピコ";s:3:"㌱";s:9:"ビル";s:3:"㌲";s:18:"ファラッド";s:3:"㌳";s:12:"フィート";s:3:"㌴";s:18:"ブッシェル";s:3:"㌵";s:9:"フラン";s:3:"㌶";s:15:"ヘクタール";s:3:"㌷";s:9:"ペソ";s:3:"㌸";s:12:"ペニヒ";s:3:"㌹";s:9:"ヘルツ";s:3:"㌺";s:12:"ペンス";s:3:"㌻";s:15:"ページ";s:3:"㌼";s:12:"ベータ";s:3:"㌽";s:15:"ポイント";s:3:"㌾";s:12:"ボルト";s:3:"㌿";s:6:"ホン";s:3:"㍀";s:15:"ポンド";s:3:"㍁";s:9:"ホール";s:3:"㍂";s:9:"ホーン";s:3:"㍃";s:12:"マイクロ";s:3:"㍄";s:9:"マイル";s:3:"㍅";s:9:"マッハ";s:3:"㍆";s:9:"マルク";s:3:"㍇";s:15:"マンション";s:3:"㍈";s:12:"ミクロン";s:3:"㍉";s:6:"ミリ";s:3:"㍊";s:18:"ミリバール";s:3:"㍋";s:9:"メガ";s:3:"㍌";s:15:"メガトン";s:3:"㍍";s:12:"メートル";s:3:"㍎";s:12:"ヤード";s:3:"㍏";s:9:"ヤール";s:3:"㍐";s:9:"ユアン";s:3:"㍑";s:12:"リットル";s:3:"㍒";s:6:"リラ";s:3:"㍓";s:12:"ルピー";s:3:"㍔";s:15:"ルーブル";s:3:"㍕";s:6:"レム";s:3:"㍖";s:18:"レントゲン";s:3:"㍗";s:9:"ワット";s:3:"㍘";s:4:"0点";s:3:"㍙";s:4:"1点";s:3:"㍚";s:4:"2点";s:3:"㍛";s:4:"3点";s:3:"㍜";s:4:"4点";s:3:"㍝";s:4:"5点";s:3:"㍞";s:4:"6点";s:3:"㍟";s:4:"7点";s:3:"㍠";s:4:"8点";s:3:"㍡";s:4:"9点";s:3:"㍢";s:5:"10点";s:3:"㍣";s:5:"11点";s:3:"㍤";s:5:"12点";s:3:"㍥";s:5:"13点";s:3:"㍦";s:5:"14点";s:3:"㍧";s:5:"15点";s:3:"㍨";s:5:"16点";s:3:"㍩";s:5:"17点";s:3:"㍪";s:5:"18点";s:3:"㍫";s:5:"19点";s:3:"㍬";s:5:"20点";s:3:"㍭";s:5:"21点";s:3:"㍮";s:5:"22点";s:3:"㍯";s:5:"23点";s:3:"㍰";s:5:"24点";s:3:"㍱";s:3:"hPa";s:3:"㍲";s:2:"da";s:3:"㍳";s:2:"AU";s:3:"㍴";s:3:"bar";s:3:"㍵";s:2:"oV";s:3:"㍶";s:2:"pc";s:3:"㍷";s:2:"dm";s:3:"㍸";s:3:"dm2";s:3:"㍹";s:3:"dm3";s:3:"㍺";s:2:"IU";s:3:"㍻";s:6:"平成";s:3:"㍼";s:6:"昭和";s:3:"㍽";s:6:"大正";s:3:"㍾";s:6:"明治";s:3:"㍿";s:12:"株式会社";s:3:"㎀";s:2:"pA";s:3:"㎁";s:2:"nA";s:3:"㎂";s:3:"μA";s:3:"㎃";s:2:"mA";s:3:"㎄";s:2:"kA";s:3:"㎅";s:2:"KB";s:3:"㎆";s:2:"MB";s:3:"㎇";s:2:"GB";s:3:"㎈";s:3:"cal";s:3:"㎉";s:4:"kcal";s:3:"㎊";s:2:"pF";s:3:"㎋";s:2:"nF";s:3:"㎌";s:3:"μF";s:3:"㎍";s:3:"μg";s:3:"㎎";s:2:"mg";s:3:"㎏";s:2:"kg";s:3:"㎐";s:2:"Hz";s:3:"㎑";s:3:"kHz";s:3:"㎒";s:3:"MHz";s:3:"㎓";s:3:"GHz";s:3:"㎔";s:3:"THz";s:3:"㎕";s:3:"μl";s:3:"㎖";s:2:"ml";s:3:"㎗";s:2:"dl";s:3:"㎘";s:2:"kl";s:3:"㎙";s:2:"fm";s:3:"㎚";s:2:"nm";s:3:"㎛";s:3:"μm";s:3:"㎜";s:2:"mm";s:3:"㎝";s:2:"cm";s:3:"㎞";s:2:"km";s:3:"㎟";s:3:"mm2";s:3:"㎠";s:3:"cm2";s:3:"㎡";s:2:"m2";s:3:"㎢";s:3:"km2";s:3:"㎣";s:3:"mm3";s:3:"㎤";s:3:"cm3";s:3:"㎥";s:2:"m3";s:3:"㎦";s:3:"km3";s:3:"㎧";s:5:"m∕s";s:3:"㎨";s:6:"m∕s2";s:3:"㎩";s:2:"Pa";s:3:"㎪";s:3:"kPa";s:3:"㎫";s:3:"MPa";s:3:"㎬";s:3:"GPa";s:3:"㎭";s:3:"rad";s:3:"㎮";s:7:"rad∕s";s:3:"㎯";s:8:"rad∕s2";s:3:"㎰";s:2:"ps";s:3:"㎱";s:2:"ns";s:3:"㎲";s:3:"μs";s:3:"㎳";s:2:"ms";s:3:"㎴";s:2:"pV";s:3:"㎵";s:2:"nV";s:3:"㎶";s:3:"μV";s:3:"㎷";s:2:"mV";s:3:"㎸";s:2:"kV";s:3:"㎹";s:2:"MV";s:3:"㎺";s:2:"pW";s:3:"㎻";s:2:"nW";s:3:"㎼";s:3:"μW";s:3:"㎽";s:2:"mW";s:3:"㎾";s:2:"kW";s:3:"㎿";s:2:"MW";s:3:"㏀";s:3:"kΩ";s:3:"㏁";s:3:"MΩ";s:3:"㏂";s:4:"a.m.";s:3:"㏃";s:2:"Bq";s:3:"㏄";s:2:"cc";s:3:"㏅";s:2:"cd";s:3:"㏆";s:6:"C∕kg";s:3:"㏇";s:3:"Co.";s:3:"㏈";s:2:"dB";s:3:"㏉";s:2:"Gy";s:3:"㏊";s:2:"ha";s:3:"㏋";s:2:"HP";s:3:"㏌";s:2:"in";s:3:"㏍";s:2:"KK";s:3:"㏎";s:2:"KM";s:3:"㏏";s:2:"kt";s:3:"㏐";s:2:"lm";s:3:"㏑";s:2:"ln";s:3:"㏒";s:3:"log";s:3:"㏓";s:2:"lx";s:3:"㏔";s:2:"mb";s:3:"㏕";s:3:"mil";s:3:"㏖";s:3:"mol";s:3:"㏗";s:2:"PH";s:3:"㏘";s:4:"p.m.";s:3:"㏙";s:3:"PPM";s:3:"㏚";s:2:"PR";s:3:"㏛";s:2:"sr";s:3:"㏜";s:2:"Sv";s:3:"㏝";s:2:"Wb";s:3:"㏞";s:5:"V∕m";s:3:"㏟";s:5:"A∕m";s:3:"㏠";s:4:"1日";s:3:"㏡";s:4:"2日";s:3:"㏢";s:4:"3日";s:3:"㏣";s:4:"4日";s:3:"㏤";s:4:"5日";s:3:"㏥";s:4:"6日";s:3:"㏦";s:4:"7日";s:3:"㏧";s:4:"8日";s:3:"㏨";s:4:"9日";s:3:"㏩";s:5:"10日";s:3:"㏪";s:5:"11日";s:3:"㏫";s:5:"12日";s:3:"㏬";s:5:"13日";s:3:"㏭";s:5:"14日";s:3:"㏮";s:5:"15日";s:3:"㏯";s:5:"16日";s:3:"㏰";s:5:"17日";s:3:"㏱";s:5:"18日";s:3:"㏲";s:5:"19日";s:3:"㏳";s:5:"20日";s:3:"㏴";s:5:"21日";s:3:"㏵";s:5:"22日";s:3:"㏶";s:5:"23日";s:3:"㏷";s:5:"24日";s:3:"㏸";s:5:"25日";s:3:"㏹";s:5:"26日";s:3:"㏺";s:5:"27日";s:3:"㏻";s:5:"28日";s:3:"㏼";s:5:"29日";s:3:"㏽";s:5:"30日";s:3:"㏾";s:5:"31日";s:3:"㏿";s:3:"gal";s:3:"ꝰ";s:3:"ꝯ";s:3:"豈";s:3:"豈";s:3:"更";s:3:"更";s:3:"車";s:3:"車";s:3:"賈";s:3:"賈";s:3:"滑";s:3:"滑";s:3:"串";s:3:"串";s:3:"句";s:3:"句";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"龜";s:3:"契";s:3:"契";s:3:"金";s:3:"金";s:3:"喇";s:3:"喇";s:3:"奈";s:3:"奈";s:3:"懶";s:3:"懶";s:3:"癩";s:3:"癩";s:3:"羅";s:3:"羅";s:3:"蘿";s:3:"蘿";s:3:"螺";s:3:"螺";s:3:"裸";s:3:"裸";s:3:"邏";s:3:"邏";s:3:"樂";s:3:"樂";s:3:"洛";s:3:"洛";s:3:"烙";s:3:"烙";s:3:"珞";s:3:"珞";s:3:"落";s:3:"落";s:3:"酪";s:3:"酪";s:3:"駱";s:3:"駱";s:3:"亂";s:3:"亂";s:3:"卵";s:3:"卵";s:3:"欄";s:3:"欄";s:3:"爛";s:3:"爛";s:3:"蘭";s:3:"蘭";s:3:"鸞";s:3:"鸞";s:3:"嵐";s:3:"嵐";s:3:"濫";s:3:"濫";s:3:"藍";s:3:"藍";s:3:"襤";s:3:"襤";s:3:"拉";s:3:"拉";s:3:"臘";s:3:"臘";s:3:"蠟";s:3:"蠟";s:3:"廊";s:3:"廊";s:3:"朗";s:3:"朗";s:3:"浪";s:3:"浪";s:3:"狼";s:3:"狼";s:3:"郎";s:3:"郎";s:3:"來";s:3:"來";s:3:"冷";s:3:"冷";s:3:"勞";s:3:"勞";s:3:"擄";s:3:"擄";s:3:"櫓";s:3:"櫓";s:3:"爐";s:3:"爐";s:3:"盧";s:3:"盧";s:3:"老";s:3:"老";s:3:"蘆";s:3:"蘆";s:3:"虜";s:3:"虜";s:3:"路";s:3:"路";s:3:"露";s:3:"露";s:3:"魯";s:3:"魯";s:3:"鷺";s:3:"鷺";s:3:"碌";s:3:"碌";s:3:"祿";s:3:"祿";s:3:"綠";s:3:"綠";s:3:"菉";s:3:"菉";s:3:"錄";s:3:"錄";s:3:"鹿";s:3:"鹿";s:3:"論";s:3:"論";s:3:"壟";s:3:"壟";s:3:"弄";s:3:"弄";s:3:"籠";s:3:"籠";s:3:"聾";s:3:"聾";s:3:"牢";s:3:"牢";s:3:"磊";s:3:"磊";s:3:"賂";s:3:"賂";s:3:"雷";s:3:"雷";s:3:"壘";s:3:"壘";s:3:"屢";s:3:"屢";s:3:"樓";s:3:"樓";s:3:"淚";s:3:"淚";s:3:"漏";s:3:"漏";s:3:"累";s:3:"累";s:3:"縷";s:3:"縷";s:3:"陋";s:3:"陋";s:3:"勒";s:3:"勒";s:3:"肋";s:3:"肋";s:3:"凜";s:3:"凜";s:3:"凌";s:3:"凌";s:3:"稜";s:3:"稜";s:3:"綾";s:3:"綾";s:3:"菱";s:3:"菱";s:3:"陵";s:3:"陵";s:3:"讀";s:3:"讀";s:3:"拏";s:3:"拏";s:3:"樂";s:3:"樂";s:3:"諾";s:3:"諾";s:3:"丹";s:3:"丹";s:3:"寧";s:3:"寧";s:3:"怒";s:3:"怒";s:3:"率";s:3:"率";s:3:"異";s:3:"異";s:3:"北";s:3:"北";s:3:"磻";s:3:"磻";s:3:"便";s:3:"便";s:3:"復";s:3:"復";s:3:"不";s:3:"不";s:3:"泌";s:3:"泌";s:3:"數";s:3:"數";s:3:"索";s:3:"索";s:3:"參";s:3:"參";s:3:"塞";s:3:"塞";s:3:"省";s:3:"省";s:3:"葉";s:3:"葉";s:3:"說";s:3:"說";s:3:"殺";s:3:"殺";s:3:"辰";s:3:"辰";s:3:"沈";s:3:"沈";s:3:"拾";s:3:"拾";s:3:"若";s:3:"若";s:3:"掠";s:3:"掠";s:3:"略";s:3:"略";s:3:"亮";s:3:"亮";s:3:"兩";s:3:"兩";s:3:"凉";s:3:"凉";s:3:"梁";s:3:"梁";s:3:"糧";s:3:"糧";s:3:"良";s:3:"良";s:3:"諒";s:3:"諒";s:3:"量";s:3:"量";s:3:"勵";s:3:"勵";s:3:"呂";s:3:"呂";s:3:"女";s:3:"女";s:3:"廬";s:3:"廬";s:3:"旅";s:3:"旅";s:3:"濾";s:3:"濾";s:3:"礪";s:3:"礪";s:3:"閭";s:3:"閭";s:3:"驪";s:3:"驪";s:3:"麗";s:3:"麗";s:3:"黎";s:3:"黎";s:3:"力";s:3:"力";s:3:"曆";s:3:"曆";s:3:"歷";s:3:"歷";s:3:"轢";s:3:"轢";s:3:"年";s:3:"年";s:3:"憐";s:3:"憐";s:3:"戀";s:3:"戀";s:3:"撚";s:3:"撚";s:3:"漣";s:3:"漣";s:3:"煉";s:3:"煉";s:3:"璉";s:3:"璉";s:3:"秊";s:3:"秊";s:3:"練";s:3:"練";s:3:"聯";s:3:"聯";s:3:"輦";s:3:"輦";s:3:"蓮";s:3:"蓮";s:3:"連";s:3:"連";s:3:"鍊";s:3:"鍊";s:3:"列";s:3:"列";s:3:"劣";s:3:"劣";s:3:"咽";s:3:"咽";s:3:"烈";s:3:"烈";s:3:"裂";s:3:"裂";s:3:"說";s:3:"說";s:3:"廉";s:3:"廉";s:3:"念";s:3:"念";s:3:"捻";s:3:"捻";s:3:"殮";s:3:"殮";s:3:"簾";s:3:"簾";s:3:"獵";s:3:"獵";s:3:"令";s:3:"令";s:3:"囹";s:3:"囹";s:3:"寧";s:3:"寧";s:3:"嶺";s:3:"嶺";s:3:"怜";s:3:"怜";s:3:"玲";s:3:"玲";s:3:"瑩";s:3:"瑩";s:3:"羚";s:3:"羚";s:3:"聆";s:3:"聆";s:3:"鈴";s:3:"鈴";s:3:"零";s:3:"零";s:3:"靈";s:3:"靈";s:3:"領";s:3:"領";s:3:"例";s:3:"例";s:3:"禮";s:3:"禮";s:3:"醴";s:3:"醴";s:3:"隸";s:3:"隸";s:3:"惡";s:3:"惡";s:3:"了";s:3:"了";s:3:"僚";s:3:"僚";s:3:"寮";s:3:"寮";s:3:"尿";s:3:"尿";s:3:"料";s:3:"料";s:3:"樂";s:3:"樂";s:3:"燎";s:3:"燎";s:3:"療";s:3:"療";s:3:"蓼";s:3:"蓼";s:3:"遼";s:3:"遼";s:3:"龍";s:3:"龍";s:3:"暈";s:3:"暈";s:3:"阮";s:3:"阮";s:3:"劉";s:3:"劉";s:3:"杻";s:3:"杻";s:3:"柳";s:3:"柳";s:3:"流";s:3:"流";s:3:"溜";s:3:"溜";s:3:"琉";s:3:"琉";s:3:"留";s:3:"留";s:3:"硫";s:3:"硫";s:3:"紐";s:3:"紐";s:3:"類";s:3:"類";s:3:"六";s:3:"六";s:3:"戮";s:3:"戮";s:3:"陸";s:3:"陸";s:3:"倫";s:3:"倫";s:3:"崙";s:3:"崙";s:3:"淪";s:3:"淪";s:3:"輪";s:3:"輪";s:3:"律";s:3:"律";s:3:"慄";s:3:"慄";s:3:"栗";s:3:"栗";s:3:"率";s:3:"率";s:3:"隆";s:3:"隆";s:3:"利";s:3:"利";s:3:"吏";s:3:"吏";s:3:"履";s:3:"履";s:3:"易";s:3:"易";s:3:"李";s:3:"李";s:3:"梨";s:3:"梨";s:3:"泥";s:3:"泥";s:3:"理";s:3:"理";s:3:"痢";s:3:"痢";s:3:"罹";s:3:"罹";s:3:"裏";s:3:"裏";s:3:"裡";s:3:"裡";s:3:"里";s:3:"里";s:3:"離";s:3:"離";s:3:"匿";s:3:"匿";s:3:"溺";s:3:"溺";s:3:"吝";s:3:"吝";s:3:"燐";s:3:"燐";s:3:"璘";s:3:"璘";s:3:"藺";s:3:"藺";s:3:"隣";s:3:"隣";s:3:"鱗";s:3:"鱗";s:3:"麟";s:3:"麟";s:3:"林";s:3:"林";s:3:"淋";s:3:"淋";s:3:"臨";s:3:"臨";s:3:"立";s:3:"立";s:3:"笠";s:3:"笠";s:3:"粒";s:3:"粒";s:3:"狀";s:3:"狀";s:3:"炙";s:3:"炙";s:3:"識";s:3:"識";s:3:"什";s:3:"什";s:3:"茶";s:3:"茶";s:3:"刺";s:3:"刺";s:3:"切";s:3:"切";s:3:"度";s:3:"度";s:3:"拓";s:3:"拓";s:3:"糖";s:3:"糖";s:3:"宅";s:3:"宅";s:3:"洞";s:3:"洞";s:3:"暴";s:3:"暴";s:3:"輻";s:3:"輻";s:3:"行";s:3:"行";s:3:"降";s:3:"降";s:3:"見";s:3:"見";s:3:"廓";s:3:"廓";s:3:"兀";s:3:"兀";s:3:"嗀";s:3:"嗀";s:3:"塚";s:3:"塚";s:3:"晴";s:3:"晴";s:3:"凞";s:3:"凞";s:3:"猪";s:3:"猪";s:3:"益";s:3:"益";s:3:"礼";s:3:"礼";s:3:"神";s:3:"神";s:3:"祥";s:3:"祥";s:3:"福";s:3:"福";s:3:"靖";s:3:"靖";s:3:"精";s:3:"精";s:3:"羽";s:3:"羽";s:3:"蘒";s:3:"蘒";s:3:"諸";s:3:"諸";s:3:"逸";s:3:"逸";s:3:"都";s:3:"都";s:3:"飯";s:3:"飯";s:3:"飼";s:3:"飼";s:3:"館";s:3:"館";s:3:"鶴";s:3:"鶴";s:3:"侮";s:3:"侮";s:3:"僧";s:3:"僧";s:3:"免";s:3:"免";s:3:"勉";s:3:"勉";s:3:"勤";s:3:"勤";s:3:"卑";s:3:"卑";s:3:"喝";s:3:"喝";s:3:"嘆";s:3:"嘆";s:3:"器";s:3:"器";s:3:"塀";s:3:"塀";s:3:"墨";s:3:"墨";s:3:"層";s:3:"層";s:3:"屮";s:3:"屮";s:3:"悔";s:3:"悔";s:3:"慨";s:3:"慨";s:3:"憎";s:3:"憎";s:3:"懲";s:3:"懲";s:3:"敏";s:3:"敏";s:3:"既";s:3:"既";s:3:"暑";s:3:"暑";s:3:"梅";s:3:"梅";s:3:"海";s:3:"海";s:3:"渚";s:3:"渚";s:3:"漢";s:3:"漢";s:3:"煮";s:3:"煮";s:3:"爫";s:3:"爫";s:3:"琢";s:3:"琢";s:3:"碑";s:3:"碑";s:3:"社";s:3:"社";s:3:"祉";s:3:"祉";s:3:"祈";s:3:"祈";s:3:"祐";s:3:"祐";s:3:"祖";s:3:"祖";s:3:"祝";s:3:"祝";s:3:"禍";s:3:"禍";s:3:"禎";s:3:"禎";s:3:"穀";s:3:"穀";s:3:"突";s:3:"突";s:3:"節";s:3:"節";s:3:"練";s:3:"練";s:3:"縉";s:3:"縉";s:3:"繁";s:3:"繁";s:3:"署";s:3:"署";s:3:"者";s:3:"者";s:3:"臭";s:3:"臭";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"艹";s:3:"著";s:3:"著";s:3:"褐";s:3:"褐";s:3:"視";s:3:"視";s:3:"謁";s:3:"謁";s:3:"謹";s:3:"謹";s:3:"賓";s:3:"賓";s:3:"贈";s:3:"贈";s:3:"辶";s:3:"辶";s:3:"逸";s:3:"逸";s:3:"難";s:3:"難";s:3:"響";s:3:"響";s:3:"頻";s:3:"頻";s:3:"恵";s:3:"恵";s:3:"𤋮";s:4:"𤋮";s:3:"舘";s:3:"舘";s:3:"並";s:3:"並";s:3:"况";s:3:"况";s:3:"全";s:3:"全";s:3:"侀";s:3:"侀";s:3:"充";s:3:"充";s:3:"冀";s:3:"冀";s:3:"勇";s:3:"勇";s:3:"勺";s:3:"勺";s:3:"喝";s:3:"喝";s:3:"啕";s:3:"啕";s:3:"喙";s:3:"喙";s:3:"嗢";s:3:"嗢";s:3:"塚";s:3:"塚";s:3:"墳";s:3:"墳";s:3:"奄";s:3:"奄";s:3:"奔";s:3:"奔";s:3:"婢";s:3:"婢";s:3:"嬨";s:3:"嬨";s:3:"廒";s:3:"廒";s:3:"廙";s:3:"廙";s:3:"彩";s:3:"彩";s:3:"徭";s:3:"徭";s:3:"惘";s:3:"惘";s:3:"慎";s:3:"慎";s:3:"愈";s:3:"愈";s:3:"憎";s:3:"憎";s:3:"慠";s:3:"慠";s:3:"懲";s:3:"懲";s:3:"戴";s:3:"戴";s:3:"揄";s:3:"揄";s:3:"搜";s:3:"搜";s:3:"摒";s:3:"摒";s:3:"敖";s:3:"敖";s:3:"晴";s:3:"晴";s:3:"朗";s:3:"朗";s:3:"望";s:3:"望";s:3:"杖";s:3:"杖";s:3:"歹";s:3:"歹";s:3:"殺";s:3:"殺";s:3:"流";s:3:"流";s:3:"滛";s:3:"滛";s:3:"滋";s:3:"滋";s:3:"漢";s:3:"漢";s:3:"瀞";s:3:"瀞";s:3:"煮";s:3:"煮";s:3:"瞧";s:3:"瞧";s:3:"爵";s:3:"爵";s:3:"犯";s:3:"犯";s:3:"猪";s:3:"猪";s:3:"瑱";s:3:"瑱";s:3:"甆";s:3:"甆";s:3:"画";s:3:"画";s:3:"瘝";s:3:"瘝";s:3:"瘟";s:3:"瘟";s:3:"益";s:3:"益";s:3:"盛";s:3:"盛";s:3:"直";s:3:"直";s:3:"睊";s:3:"睊";s:3:"着";s:3:"着";s:3:"磌";s:3:"磌";s:3:"窱";s:3:"窱";s:3:"節";s:3:"節";s:3:"类";s:3:"类";s:3:"絛";s:3:"絛";s:3:"練";s:3:"練";s:3:"缾";s:3:"缾";s:3:"者";s:3:"者";s:3:"荒";s:3:"荒";s:3:"華";s:3:"華";s:3:"蝹";s:3:"蝹";s:3:"襁";s:3:"襁";s:3:"覆";s:3:"覆";s:3:"視";s:3:"視";s:3:"調";s:3:"調";s:3:"諸";s:3:"諸";s:3:"請";s:3:"請";s:3:"謁";s:3:"謁";s:3:"諾";s:3:"諾";s:3:"諭";s:3:"諭";s:3:"謹";s:3:"謹";s:3:"變";s:3:"變";s:3:"贈";s:3:"贈";s:3:"輸";s:3:"輸";s:3:"遲";s:3:"遲";s:3:"醙";s:3:"醙";s:3:"鉶";s:3:"鉶";s:3:"陼";s:3:"陼";s:3:"難";s:3:"難";s:3:"靖";s:3:"靖";s:3:"韛";s:3:"韛";s:3:"響";s:3:"響";s:3:"頋";s:3:"頋";s:3:"頻";s:3:"頻";s:3:"鬒";s:3:"鬒";s:3:"龜";s:3:"龜";s:3:"𢡊";s:4:"𢡊";s:3:"𢡄";s:4:"𢡄";s:3:"𣏕";s:4:"𣏕";s:3:"㮝";s:3:"㮝";s:3:"䀘";s:3:"䀘";s:3:"䀹";s:3:"䀹";s:3:"𥉉";s:4:"𥉉";s:3:"𥳐";s:4:"𥳐";s:3:"𧻓";s:4:"𧻓";s:3:"齃";s:3:"齃";s:3:"龎";s:3:"龎";s:3:"ff";s:2:"ff";s:3:"fi";s:2:"fi";s:3:"fl";s:2:"fl";s:3:"ffi";s:3:"ffi";s:3:"ffl";s:3:"ffl";s:3:"ſt";s:2:"st";s:3:"st";s:2:"st";s:3:"ﬓ";s:4:"մն";s:3:"ﬔ";s:4:"մե";s:3:"ﬕ";s:4:"մի";s:3:"ﬖ";s:4:"վն";s:3:"ﬗ";s:4:"մխ";s:3:"יִ";s:4:"יִ";s:3:"ײַ";s:4:"ײַ";s:3:"ﬠ";s:2:"ע";s:3:"ﬡ";s:2:"א";s:3:"ﬢ";s:2:"ד";s:3:"ﬣ";s:2:"ה";s:3:"ﬤ";s:2:"כ";s:3:"ﬥ";s:2:"ל";s:3:"ﬦ";s:2:"ם";s:3:"ﬧ";s:2:"ר";s:3:"ﬨ";s:2:"ת";s:3:"﬩";s:1:"+";s:3:"שׁ";s:4:"שׁ";s:3:"שׂ";s:4:"שׂ";s:3:"שּׁ";s:6:"שּׁ";s:3:"שּׂ";s:6:"שּׂ";s:3:"אַ";s:4:"אַ";s:3:"אָ";s:4:"אָ";s:3:"אּ";s:4:"אּ";s:3:"בּ";s:4:"בּ";s:3:"גּ";s:4:"גּ";s:3:"דּ";s:4:"דּ";s:3:"הּ";s:4:"הּ";s:3:"וּ";s:4:"וּ";s:3:"זּ";s:4:"זּ";s:3:"טּ";s:4:"טּ";s:3:"יּ";s:4:"יּ";s:3:"ךּ";s:4:"ךּ";s:3:"כּ";s:4:"כּ";s:3:"לּ";s:4:"לּ";s:3:"מּ";s:4:"מּ";s:3:"נּ";s:4:"נּ";s:3:"סּ";s:4:"סּ";s:3:"ףּ";s:4:"ףּ";s:3:"פּ";s:4:"פּ";s:3:"צּ";s:4:"צּ";s:3:"קּ";s:4:"קּ";s:3:"רּ";s:4:"רּ";s:3:"שּ";s:4:"שּ";s:3:"תּ";s:4:"תּ";s:3:"וֹ";s:4:"וֹ";s:3:"בֿ";s:4:"בֿ";s:3:"כֿ";s:4:"כֿ";s:3:"פֿ";s:4:"פֿ";s:3:"ﭏ";s:4:"אל";s:3:"ﭐ";s:2:"ٱ";s:3:"ﭑ";s:2:"ٱ";s:3:"ﭒ";s:2:"ٻ";s:3:"ﭓ";s:2:"ٻ";s:3:"ﭔ";s:2:"ٻ";s:3:"ﭕ";s:2:"ٻ";s:3:"ﭖ";s:2:"پ";s:3:"ﭗ";s:2:"پ";s:3:"ﭘ";s:2:"پ";s:3:"ﭙ";s:2:"پ";s:3:"ﭚ";s:2:"ڀ";s:3:"ﭛ";s:2:"ڀ";s:3:"ﭜ";s:2:"ڀ";s:3:"ﭝ";s:2:"ڀ";s:3:"ﭞ";s:2:"ٺ";s:3:"ﭟ";s:2:"ٺ";s:3:"ﭠ";s:2:"ٺ";s:3:"ﭡ";s:2:"ٺ";s:3:"ﭢ";s:2:"ٿ";s:3:"ﭣ";s:2:"ٿ";s:3:"ﭤ";s:2:"ٿ";s:3:"ﭥ";s:2:"ٿ";s:3:"ﭦ";s:2:"ٹ";s:3:"ﭧ";s:2:"ٹ";s:3:"ﭨ";s:2:"ٹ";s:3:"ﭩ";s:2:"ٹ";s:3:"ﭪ";s:2:"ڤ";s:3:"ﭫ";s:2:"ڤ";s:3:"ﭬ";s:2:"ڤ";s:3:"ﭭ";s:2:"ڤ";s:3:"ﭮ";s:2:"ڦ";s:3:"ﭯ";s:2:"ڦ";s:3:"ﭰ";s:2:"ڦ";s:3:"ﭱ";s:2:"ڦ";s:3:"ﭲ";s:2:"ڄ";s:3:"ﭳ";s:2:"ڄ";s:3:"ﭴ";s:2:"ڄ";s:3:"ﭵ";s:2:"ڄ";s:3:"ﭶ";s:2:"ڃ";s:3:"ﭷ";s:2:"ڃ";s:3:"ﭸ";s:2:"ڃ";s:3:"ﭹ";s:2:"ڃ";s:3:"ﭺ";s:2:"چ";s:3:"ﭻ";s:2:"چ";s:3:"ﭼ";s:2:"چ";s:3:"ﭽ";s:2:"چ";s:3:"ﭾ";s:2:"ڇ";s:3:"ﭿ";s:2:"ڇ";s:3:"ﮀ";s:2:"ڇ";s:3:"ﮁ";s:2:"ڇ";s:3:"ﮂ";s:2:"ڍ";s:3:"ﮃ";s:2:"ڍ";s:3:"ﮄ";s:2:"ڌ";s:3:"ﮅ";s:2:"ڌ";s:3:"ﮆ";s:2:"ڎ";s:3:"ﮇ";s:2:"ڎ";s:3:"ﮈ";s:2:"ڈ";s:3:"ﮉ";s:2:"ڈ";s:3:"ﮊ";s:2:"ژ";s:3:"ﮋ";s:2:"ژ";s:3:"ﮌ";s:2:"ڑ";s:3:"ﮍ";s:2:"ڑ";s:3:"ﮎ";s:2:"ک";s:3:"ﮏ";s:2:"ک";s:3:"ﮐ";s:2:"ک";s:3:"ﮑ";s:2:"ک";s:3:"ﮒ";s:2:"گ";s:3:"ﮓ";s:2:"گ";s:3:"ﮔ";s:2:"گ";s:3:"ﮕ";s:2:"گ";s:3:"ﮖ";s:2:"ڳ";s:3:"ﮗ";s:2:"ڳ";s:3:"ﮘ";s:2:"ڳ";s:3:"ﮙ";s:2:"ڳ";s:3:"ﮚ";s:2:"ڱ";s:3:"ﮛ";s:2:"ڱ";s:3:"ﮜ";s:2:"ڱ";s:3:"ﮝ";s:2:"ڱ";s:3:"ﮞ";s:2:"ں";s:3:"ﮟ";s:2:"ں";s:3:"ﮠ";s:2:"ڻ";s:3:"ﮡ";s:2:"ڻ";s:3:"ﮢ";s:2:"ڻ";s:3:"ﮣ";s:2:"ڻ";s:3:"ﮤ";s:4:"ۀ";s:3:"ﮥ";s:4:"ۀ";s:3:"ﮦ";s:2:"ہ";s:3:"ﮧ";s:2:"ہ";s:3:"ﮨ";s:2:"ہ";s:3:"ﮩ";s:2:"ہ";s:3:"ﮪ";s:2:"ھ";s:3:"ﮫ";s:2:"ھ";s:3:"ﮬ";s:2:"ھ";s:3:"ﮭ";s:2:"ھ";s:3:"ﮮ";s:2:"ے";s:3:"ﮯ";s:2:"ے";s:3:"ﮰ";s:4:"ۓ";s:3:"ﮱ";s:4:"ۓ";s:3:"ﯓ";s:2:"ڭ";s:3:"ﯔ";s:2:"ڭ";s:3:"ﯕ";s:2:"ڭ";s:3:"ﯖ";s:2:"ڭ";s:3:"ﯗ";s:2:"ۇ";s:3:"ﯘ";s:2:"ۇ";s:3:"ﯙ";s:2:"ۆ";s:3:"ﯚ";s:2:"ۆ";s:3:"ﯛ";s:2:"ۈ";s:3:"ﯜ";s:2:"ۈ";s:3:"ﯝ";s:4:"ۇٴ";s:3:"ﯞ";s:2:"ۋ";s:3:"ﯟ";s:2:"ۋ";s:3:"ﯠ";s:2:"ۅ";s:3:"ﯡ";s:2:"ۅ";s:3:"ﯢ";s:2:"ۉ";s:3:"ﯣ";s:2:"ۉ";s:3:"ﯤ";s:2:"ې";s:3:"ﯥ";s:2:"ې";s:3:"ﯦ";s:2:"ې";s:3:"ﯧ";s:2:"ې";s:3:"ﯨ";s:2:"ى";s:3:"ﯩ";s:2:"ى";s:3:"ﯪ";s:6:"ئا";s:3:"ﯫ";s:6:"ئا";s:3:"ﯬ";s:6:"ئە";s:3:"ﯭ";s:6:"ئە";s:3:"ﯮ";s:6:"ئو";s:3:"ﯯ";s:6:"ئو";s:3:"ﯰ";s:6:"ئۇ";s:3:"ﯱ";s:6:"ئۇ";s:3:"ﯲ";s:6:"ئۆ";s:3:"ﯳ";s:6:"ئۆ";s:3:"ﯴ";s:6:"ئۈ";s:3:"ﯵ";s:6:"ئۈ";s:3:"ﯶ";s:6:"ئې";s:3:"ﯷ";s:6:"ئې";s:3:"ﯸ";s:6:"ئې";s:3:"ﯹ";s:6:"ئى";s:3:"ﯺ";s:6:"ئى";s:3:"ﯻ";s:6:"ئى";s:3:"ﯼ";s:2:"ی";s:3:"ﯽ";s:2:"ی";s:3:"ﯾ";s:2:"ی";s:3:"ﯿ";s:2:"ی";s:3:"ﰀ";s:6:"ئج";s:3:"ﰁ";s:6:"ئح";s:3:"ﰂ";s:6:"ئم";s:3:"ﰃ";s:6:"ئى";s:3:"ﰄ";s:6:"ئي";s:3:"ﰅ";s:4:"بج";s:3:"ﰆ";s:4:"بح";s:3:"ﰇ";s:4:"بخ";s:3:"ﰈ";s:4:"بم";s:3:"ﰉ";s:4:"بى";s:3:"ﰊ";s:4:"بي";s:3:"ﰋ";s:4:"تج";s:3:"ﰌ";s:4:"تح";s:3:"ﰍ";s:4:"تخ";s:3:"ﰎ";s:4:"تم";s:3:"ﰏ";s:4:"تى";s:3:"ﰐ";s:4:"تي";s:3:"ﰑ";s:4:"ثج";s:3:"ﰒ";s:4:"ثم";s:3:"ﰓ";s:4:"ثى";s:3:"ﰔ";s:4:"ثي";s:3:"ﰕ";s:4:"جح";s:3:"ﰖ";s:4:"جم";s:3:"ﰗ";s:4:"حج";s:3:"ﰘ";s:4:"حم";s:3:"ﰙ";s:4:"خج";s:3:"ﰚ";s:4:"خح";s:3:"ﰛ";s:4:"خم";s:3:"ﰜ";s:4:"سج";s:3:"ﰝ";s:4:"سح";s:3:"ﰞ";s:4:"سخ";s:3:"ﰟ";s:4:"سم";s:3:"ﰠ";s:4:"صح";s:3:"ﰡ";s:4:"صم";s:3:"ﰢ";s:4:"ضج";s:3:"ﰣ";s:4:"ضح";s:3:"ﰤ";s:4:"ضخ";s:3:"ﰥ";s:4:"ضم";s:3:"ﰦ";s:4:"طح";s:3:"ﰧ";s:4:"طم";s:3:"ﰨ";s:4:"ظم";s:3:"ﰩ";s:4:"عج";s:3:"ﰪ";s:4:"عم";s:3:"ﰫ";s:4:"غج";s:3:"ﰬ";s:4:"غم";s:3:"ﰭ";s:4:"فج";s:3:"ﰮ";s:4:"فح";s:3:"ﰯ";s:4:"فخ";s:3:"ﰰ";s:4:"فم";s:3:"ﰱ";s:4:"فى";s:3:"ﰲ";s:4:"في";s:3:"ﰳ";s:4:"قح";s:3:"ﰴ";s:4:"قم";s:3:"ﰵ";s:4:"قى";s:3:"ﰶ";s:4:"قي";s:3:"ﰷ";s:4:"كا";s:3:"ﰸ";s:4:"كج";s:3:"ﰹ";s:4:"كح";s:3:"ﰺ";s:4:"كخ";s:3:"ﰻ";s:4:"كل";s:3:"ﰼ";s:4:"كم";s:3:"ﰽ";s:4:"كى";s:3:"ﰾ";s:4:"كي";s:3:"ﰿ";s:4:"لج";s:3:"ﱀ";s:4:"لح";s:3:"ﱁ";s:4:"لخ";s:3:"ﱂ";s:4:"لم";s:3:"ﱃ";s:4:"لى";s:3:"ﱄ";s:4:"لي";s:3:"ﱅ";s:4:"مج";s:3:"ﱆ";s:4:"مح";s:3:"ﱇ";s:4:"مخ";s:3:"ﱈ";s:4:"مم";s:3:"ﱉ";s:4:"مى";s:3:"ﱊ";s:4:"مي";s:3:"ﱋ";s:4:"نج";s:3:"ﱌ";s:4:"نح";s:3:"ﱍ";s:4:"نخ";s:3:"ﱎ";s:4:"نم";s:3:"ﱏ";s:4:"نى";s:3:"ﱐ";s:4:"ني";s:3:"ﱑ";s:4:"هج";s:3:"ﱒ";s:4:"هم";s:3:"ﱓ";s:4:"هى";s:3:"ﱔ";s:4:"هي";s:3:"ﱕ";s:4:"يج";s:3:"ﱖ";s:4:"يح";s:3:"ﱗ";s:4:"يخ";s:3:"ﱘ";s:4:"يم";s:3:"ﱙ";s:4:"يى";s:3:"ﱚ";s:4:"يي";s:3:"ﱛ";s:4:"ذٰ";s:3:"ﱜ";s:4:"رٰ";s:3:"ﱝ";s:4:"ىٰ";s:3:"ﱞ";s:5:" ٌّ";s:3:"ﱟ";s:5:" ٍّ";s:3:"ﱠ";s:5:" َّ";s:3:"ﱡ";s:5:" ُّ";s:3:"ﱢ";s:5:" ِّ";s:3:"ﱣ";s:5:" ّٰ";s:3:"ﱤ";s:6:"ئر";s:3:"ﱥ";s:6:"ئز";s:3:"ﱦ";s:6:"ئم";s:3:"ﱧ";s:6:"ئن";s:3:"ﱨ";s:6:"ئى";s:3:"ﱩ";s:6:"ئي";s:3:"ﱪ";s:4:"بر";s:3:"ﱫ";s:4:"بز";s:3:"ﱬ";s:4:"بم";s:3:"ﱭ";s:4:"بن";s:3:"ﱮ";s:4:"بى";s:3:"ﱯ";s:4:"بي";s:3:"ﱰ";s:4:"تر";s:3:"ﱱ";s:4:"تز";s:3:"ﱲ";s:4:"تم";s:3:"ﱳ";s:4:"تن";s:3:"ﱴ";s:4:"تى";s:3:"ﱵ";s:4:"تي";s:3:"ﱶ";s:4:"ثر";s:3:"ﱷ";s:4:"ثز";s:3:"ﱸ";s:4:"ثم";s:3:"ﱹ";s:4:"ثن";s:3:"ﱺ";s:4:"ثى";s:3:"ﱻ";s:4:"ثي";s:3:"ﱼ";s:4:"فى";s:3:"ﱽ";s:4:"في";s:3:"ﱾ";s:4:"قى";s:3:"ﱿ";s:4:"قي";s:3:"ﲀ";s:4:"كا";s:3:"ﲁ";s:4:"كل";s:3:"ﲂ";s:4:"كم";s:3:"ﲃ";s:4:"كى";s:3:"ﲄ";s:4:"كي";s:3:"ﲅ";s:4:"لم";s:3:"ﲆ";s:4:"لى";s:3:"ﲇ";s:4:"لي";s:3:"ﲈ";s:4:"ما";s:3:"ﲉ";s:4:"مم";s:3:"ﲊ";s:4:"نر";s:3:"ﲋ";s:4:"نز";s:3:"ﲌ";s:4:"نم";s:3:"ﲍ";s:4:"نن";s:3:"ﲎ";s:4:"نى";s:3:"ﲏ";s:4:"ني";s:3:"ﲐ";s:4:"ىٰ";s:3:"ﲑ";s:4:"ير";s:3:"ﲒ";s:4:"يز";s:3:"ﲓ";s:4:"يم";s:3:"ﲔ";s:4:"ين";s:3:"ﲕ";s:4:"يى";s:3:"ﲖ";s:4:"يي";s:3:"ﲗ";s:6:"ئج";s:3:"ﲘ";s:6:"ئح";s:3:"ﲙ";s:6:"ئخ";s:3:"ﲚ";s:6:"ئم";s:3:"ﲛ";s:6:"ئه";s:3:"ﲜ";s:4:"بج";s:3:"ﲝ";s:4:"بح";s:3:"ﲞ";s:4:"بخ";s:3:"ﲟ";s:4:"بم";s:3:"ﲠ";s:4:"به";s:3:"ﲡ";s:4:"تج";s:3:"ﲢ";s:4:"تح";s:3:"ﲣ";s:4:"تخ";s:3:"ﲤ";s:4:"تم";s:3:"ﲥ";s:4:"ته";s:3:"ﲦ";s:4:"ثم";s:3:"ﲧ";s:4:"جح";s:3:"ﲨ";s:4:"جم";s:3:"ﲩ";s:4:"حج";s:3:"ﲪ";s:4:"حم";s:3:"ﲫ";s:4:"خج";s:3:"ﲬ";s:4:"خم";s:3:"ﲭ";s:4:"سج";s:3:"ﲮ";s:4:"سح";s:3:"ﲯ";s:4:"سخ";s:3:"ﲰ";s:4:"سم";s:3:"ﲱ";s:4:"صح";s:3:"ﲲ";s:4:"صخ";s:3:"ﲳ";s:4:"صم";s:3:"ﲴ";s:4:"ضج";s:3:"ﲵ";s:4:"ضح";s:3:"ﲶ";s:4:"ضخ";s:3:"ﲷ";s:4:"ضم";s:3:"ﲸ";s:4:"طح";s:3:"ﲹ";s:4:"ظم";s:3:"ﲺ";s:4:"عج";s:3:"ﲻ";s:4:"عم";s:3:"ﲼ";s:4:"غج";s:3:"ﲽ";s:4:"غم";s:3:"ﲾ";s:4:"فج";s:3:"ﲿ";s:4:"فح";s:3:"ﳀ";s:4:"فخ";s:3:"ﳁ";s:4:"فم";s:3:"ﳂ";s:4:"قح";s:3:"ﳃ";s:4:"قم";s:3:"ﳄ";s:4:"كج";s:3:"ﳅ";s:4:"كح";s:3:"ﳆ";s:4:"كخ";s:3:"ﳇ";s:4:"كل";s:3:"ﳈ";s:4:"كم";s:3:"ﳉ";s:4:"لج";s:3:"ﳊ";s:4:"لح";s:3:"ﳋ";s:4:"لخ";s:3:"ﳌ";s:4:"لم";s:3:"ﳍ";s:4:"له";s:3:"ﳎ";s:4:"مج";s:3:"ﳏ";s:4:"مح";s:3:"ﳐ";s:4:"مخ";s:3:"ﳑ";s:4:"مم";s:3:"ﳒ";s:4:"نج";s:3:"ﳓ";s:4:"نح";s:3:"ﳔ";s:4:"نخ";s:3:"ﳕ";s:4:"نم";s:3:"ﳖ";s:4:"نه";s:3:"ﳗ";s:4:"هج";s:3:"ﳘ";s:4:"هم";s:3:"ﳙ";s:4:"هٰ";s:3:"ﳚ";s:4:"يج";s:3:"ﳛ";s:4:"يح";s:3:"ﳜ";s:4:"يخ";s:3:"ﳝ";s:4:"يم";s:3:"ﳞ";s:4:"يه";s:3:"ﳟ";s:6:"ئم";s:3:"ﳠ";s:6:"ئه";s:3:"ﳡ";s:4:"بم";s:3:"ﳢ";s:4:"به";s:3:"ﳣ";s:4:"تم";s:3:"ﳤ";s:4:"ته";s:3:"ﳥ";s:4:"ثم";s:3:"ﳦ";s:4:"ثه";s:3:"ﳧ";s:4:"سم";s:3:"ﳨ";s:4:"سه";s:3:"ﳩ";s:4:"شم";s:3:"ﳪ";s:4:"شه";s:3:"ﳫ";s:4:"كل";s:3:"ﳬ";s:4:"كم";s:3:"ﳭ";s:4:"لم";s:3:"ﳮ";s:4:"نم";s:3:"ﳯ";s:4:"نه";s:3:"ﳰ";s:4:"يم";s:3:"ﳱ";s:4:"يه";s:3:"ﳲ";s:6:"ـَّ";s:3:"ﳳ";s:6:"ـُّ";s:3:"ﳴ";s:6:"ـِّ";s:3:"ﳵ";s:4:"طى";s:3:"ﳶ";s:4:"طي";s:3:"ﳷ";s:4:"عى";s:3:"ﳸ";s:4:"عي";s:3:"ﳹ";s:4:"غى";s:3:"ﳺ";s:4:"غي";s:3:"ﳻ";s:4:"سى";s:3:"ﳼ";s:4:"سي";s:3:"ﳽ";s:4:"شى";s:3:"ﳾ";s:4:"شي";s:3:"ﳿ";s:4:"حى";s:3:"ﴀ";s:4:"حي";s:3:"ﴁ";s:4:"جى";s:3:"ﴂ";s:4:"جي";s:3:"ﴃ";s:4:"خى";s:3:"ﴄ";s:4:"خي";s:3:"ﴅ";s:4:"صى";s:3:"ﴆ";s:4:"صي";s:3:"ﴇ";s:4:"ضى";s:3:"ﴈ";s:4:"ضي";s:3:"ﴉ";s:4:"شج";s:3:"ﴊ";s:4:"شح";s:3:"ﴋ";s:4:"شخ";s:3:"ﴌ";s:4:"شم";s:3:"ﴍ";s:4:"شر";s:3:"ﴎ";s:4:"سر";s:3:"ﴏ";s:4:"صر";s:3:"ﴐ";s:4:"ضر";s:3:"ﴑ";s:4:"طى";s:3:"ﴒ";s:4:"طي";s:3:"ﴓ";s:4:"عى";s:3:"ﴔ";s:4:"عي";s:3:"ﴕ";s:4:"غى";s:3:"ﴖ";s:4:"غي";s:3:"ﴗ";s:4:"سى";s:3:"ﴘ";s:4:"سي";s:3:"ﴙ";s:4:"شى";s:3:"ﴚ";s:4:"شي";s:3:"ﴛ";s:4:"حى";s:3:"ﴜ";s:4:"حي";s:3:"ﴝ";s:4:"جى";s:3:"ﴞ";s:4:"جي";s:3:"ﴟ";s:4:"خى";s:3:"ﴠ";s:4:"خي";s:3:"ﴡ";s:4:"صى";s:3:"ﴢ";s:4:"صي";s:3:"ﴣ";s:4:"ضى";s:3:"ﴤ";s:4:"ضي";s:3:"ﴥ";s:4:"شج";s:3:"ﴦ";s:4:"شح";s:3:"ﴧ";s:4:"شخ";s:3:"ﴨ";s:4:"شم";s:3:"ﴩ";s:4:"شر";s:3:"ﴪ";s:4:"سر";s:3:"ﴫ";s:4:"صر";s:3:"ﴬ";s:4:"ضر";s:3:"ﴭ";s:4:"شج";s:3:"ﴮ";s:4:"شح";s:3:"ﴯ";s:4:"شخ";s:3:"ﴰ";s:4:"شم";s:3:"ﴱ";s:4:"سه";s:3:"ﴲ";s:4:"شه";s:3:"ﴳ";s:4:"طم";s:3:"ﴴ";s:4:"سج";s:3:"ﴵ";s:4:"سح";s:3:"ﴶ";s:4:"سخ";s:3:"ﴷ";s:4:"شج";s:3:"ﴸ";s:4:"شح";s:3:"ﴹ";s:4:"شخ";s:3:"ﴺ";s:4:"طم";s:3:"ﴻ";s:4:"ظم";s:3:"ﴼ";s:4:"اً";s:3:"ﴽ";s:4:"اً";s:3:"ﵐ";s:6:"تجم";s:3:"ﵑ";s:6:"تحج";s:3:"ﵒ";s:6:"تحج";s:3:"ﵓ";s:6:"تحم";s:3:"ﵔ";s:6:"تخم";s:3:"ﵕ";s:6:"تمج";s:3:"ﵖ";s:6:"تمح";s:3:"ﵗ";s:6:"تمخ";s:3:"ﵘ";s:6:"جمح";s:3:"ﵙ";s:6:"جمح";s:3:"ﵚ";s:6:"حمي";s:3:"ﵛ";s:6:"حمى";s:3:"ﵜ";s:6:"سحج";s:3:"ﵝ";s:6:"سجح";s:3:"ﵞ";s:6:"سجى";s:3:"ﵟ";s:6:"سمح";s:3:"ﵠ";s:6:"سمح";s:3:"ﵡ";s:6:"سمج";s:3:"ﵢ";s:6:"سمم";s:3:"ﵣ";s:6:"سمم";s:3:"ﵤ";s:6:"صحح";s:3:"ﵥ";s:6:"صحح";s:3:"ﵦ";s:6:"صمم";s:3:"ﵧ";s:6:"شحم";s:3:"ﵨ";s:6:"شحم";s:3:"ﵩ";s:6:"شجي";s:3:"ﵪ";s:6:"شمخ";s:3:"ﵫ";s:6:"شمخ";s:3:"ﵬ";s:6:"شمم";s:3:"ﵭ";s:6:"شمم";s:3:"ﵮ";s:6:"ضحى";s:3:"ﵯ";s:6:"ضخم";s:3:"ﵰ";s:6:"ضخم";s:3:"ﵱ";s:6:"طمح";s:3:"ﵲ";s:6:"طمح";s:3:"ﵳ";s:6:"طمم";s:3:"ﵴ";s:6:"طمي";s:3:"ﵵ";s:6:"عجم";s:3:"ﵶ";s:6:"عمم";s:3:"ﵷ";s:6:"عمم";s:3:"ﵸ";s:6:"عمى";s:3:"ﵹ";s:6:"غمم";s:3:"ﵺ";s:6:"غمي";s:3:"ﵻ";s:6:"غمى";s:3:"ﵼ";s:6:"فخم";s:3:"ﵽ";s:6:"فخم";s:3:"ﵾ";s:6:"قمح";s:3:"ﵿ";s:6:"قمم";s:3:"ﶀ";s:6:"لحم";s:3:"ﶁ";s:6:"لحي";s:3:"ﶂ";s:6:"لحى";s:3:"ﶃ";s:6:"لجج";s:3:"ﶄ";s:6:"لجج";s:3:"ﶅ";s:6:"لخم";s:3:"ﶆ";s:6:"لخم";s:3:"ﶇ";s:6:"لمح";s:3:"ﶈ";s:6:"لمح";s:3:"ﶉ";s:6:"محج";s:3:"ﶊ";s:6:"محم";s:3:"ﶋ";s:6:"محي";s:3:"ﶌ";s:6:"مجح";s:3:"ﶍ";s:6:"مجم";s:3:"ﶎ";s:6:"مخج";s:3:"ﶏ";s:6:"مخم";s:3:"ﶒ";s:6:"مجخ";s:3:"ﶓ";s:6:"همج";s:3:"ﶔ";s:6:"همم";s:3:"ﶕ";s:6:"نحم";s:3:"ﶖ";s:6:"نحى";s:3:"ﶗ";s:6:"نجم";s:3:"ﶘ";s:6:"نجم";s:3:"ﶙ";s:6:"نجى";s:3:"ﶚ";s:6:"نمي";s:3:"ﶛ";s:6:"نمى";s:3:"ﶜ";s:6:"يمم";s:3:"ﶝ";s:6:"يمم";s:3:"ﶞ";s:6:"بخي";s:3:"ﶟ";s:6:"تجي";s:3:"ﶠ";s:6:"تجى";s:3:"ﶡ";s:6:"تخي";s:3:"ﶢ";s:6:"تخى";s:3:"ﶣ";s:6:"تمي";s:3:"ﶤ";s:6:"تمى";s:3:"ﶥ";s:6:"جمي";s:3:"ﶦ";s:6:"جحى";s:3:"ﶧ";s:6:"جمى";s:3:"ﶨ";s:6:"سخى";s:3:"ﶩ";s:6:"صحي";s:3:"ﶪ";s:6:"شحي";s:3:"ﶫ";s:6:"ضحي";s:3:"ﶬ";s:6:"لجي";s:3:"ﶭ";s:6:"لمي";s:3:"ﶮ";s:6:"يحي";s:3:"ﶯ";s:6:"يجي";s:3:"ﶰ";s:6:"يمي";s:3:"ﶱ";s:6:"ممي";s:3:"ﶲ";s:6:"قمي";s:3:"ﶳ";s:6:"نحي";s:3:"ﶴ";s:6:"قمح";s:3:"ﶵ";s:6:"لحم";s:3:"ﶶ";s:6:"عمي";s:3:"ﶷ";s:6:"كمي";s:3:"ﶸ";s:6:"نجح";s:3:"ﶹ";s:6:"مخي";s:3:"ﶺ";s:6:"لجم";s:3:"ﶻ";s:6:"كمم";s:3:"ﶼ";s:6:"لجم";s:3:"ﶽ";s:6:"نجح";s:3:"ﶾ";s:6:"جحي";s:3:"ﶿ";s:6:"حجي";s:3:"ﷀ";s:6:"مجي";s:3:"ﷁ";s:6:"فمي";s:3:"ﷂ";s:6:"بحي";s:3:"ﷃ";s:6:"كمم";s:3:"ﷄ";s:6:"عجم";s:3:"ﷅ";s:6:"صمم";s:3:"ﷆ";s:6:"سخي";s:3:"ﷇ";s:6:"نجي";s:3:"ﷰ";s:6:"صلے";s:3:"ﷱ";s:6:"قلے";s:3:"ﷲ";s:8:"الله";s:3:"ﷳ";s:8:"اكبر";s:3:"ﷴ";s:8:"محمد";s:3:"ﷵ";s:8:"صلعم";s:3:"ﷶ";s:8:"رسول";s:3:"ﷷ";s:8:"عليه";s:3:"ﷸ";s:8:"وسلم";s:3:"ﷹ";s:6:"صلى";s:3:"ﷺ";s:33:"صلى الله عليه وسلم";s:3:"ﷻ";s:15:"جل جلاله";s:3:"﷼";s:8:"ریال";s:3:"︐";s:1:",";s:3:"︑";s:3:"、";s:3:"︒";s:3:"。";s:3:"︓";s:1:":";s:3:"︔";s:1:";";s:3:"︕";s:1:"!";s:3:"︖";s:1:"?";s:3:"︗";s:3:"〖";s:3:"︘";s:3:"〗";s:3:"︙";s:3:"...";s:3:"︰";s:2:"..";s:3:"︱";s:3:"—";s:3:"︲";s:3:"–";s:3:"︳";s:1:"_";s:3:"︴";s:1:"_";s:3:"︵";s:1:"(";s:3:"︶";s:1:")";s:3:"︷";s:1:"{";s:3:"︸";s:1:"}";s:3:"︹";s:3:"〔";s:3:"︺";s:3:"〕";s:3:"︻";s:3:"【";s:3:"︼";s:3:"】";s:3:"︽";s:3:"《";s:3:"︾";s:3:"》";s:3:"︿";s:3:"〈";s:3:"﹀";s:3:"〉";s:3:"﹁";s:3:"「";s:3:"﹂";s:3:"」";s:3:"﹃";s:3:"『";s:3:"﹄";s:3:"』";s:3:"﹇";s:1:"[";s:3:"﹈";s:1:"]";s:3:"﹉";s:3:" ̅";s:3:"﹊";s:3:" ̅";s:3:"﹋";s:3:" ̅";s:3:"﹌";s:3:" ̅";s:3:"﹍";s:1:"_";s:3:"﹎";s:1:"_";s:3:"﹏";s:1:"_";s:3:"﹐";s:1:",";s:3:"﹑";s:3:"、";s:3:"﹒";s:1:".";s:3:"﹔";s:1:";";s:3:"﹕";s:1:":";s:3:"﹖";s:1:"?";s:3:"﹗";s:1:"!";s:3:"﹘";s:3:"—";s:3:"﹙";s:1:"(";s:3:"﹚";s:1:")";s:3:"﹛";s:1:"{";s:3:"﹜";s:1:"}";s:3:"﹝";s:3:"〔";s:3:"﹞";s:3:"〕";s:3:"﹟";s:1:"#";s:3:"﹠";s:1:"&";s:3:"﹡";s:1:"*";s:3:"﹢";s:1:"+";s:3:"﹣";s:1:"-";s:3:"﹤";s:1:"<";s:3:"﹥";s:1:">";s:3:"﹦";s:1:"=";s:3:"﹨";s:1:"\\";s:3:"﹩";s:1:"$";s:3:"﹪";s:1:"%";s:3:"﹫";s:1:"@";s:3:"ﹰ";s:3:" ً";s:3:"ﹱ";s:4:"ـً";s:3:"ﹲ";s:3:" ٌ";s:3:"ﹴ";s:3:" ٍ";s:3:"ﹶ";s:3:" َ";s:3:"ﹷ";s:4:"ـَ";s:3:"ﹸ";s:3:" ُ";s:3:"ﹹ";s:4:"ـُ";s:3:"ﹺ";s:3:" ِ";s:3:"ﹻ";s:4:"ـِ";s:3:"ﹼ";s:3:" ّ";s:3:"ﹽ";s:4:"ـّ";s:3:"ﹾ";s:3:" ْ";s:3:"ﹿ";s:4:"ـْ";s:3:"ﺀ";s:2:"ء";s:3:"ﺁ";s:4:"آ";s:3:"ﺂ";s:4:"آ";s:3:"ﺃ";s:4:"أ";s:3:"ﺄ";s:4:"أ";s:3:"ﺅ";s:4:"ؤ";s:3:"ﺆ";s:4:"ؤ";s:3:"ﺇ";s:4:"إ";s:3:"ﺈ";s:4:"إ";s:3:"ﺉ";s:4:"ئ";s:3:"ﺊ";s:4:"ئ";s:3:"ﺋ";s:4:"ئ";s:3:"ﺌ";s:4:"ئ";s:3:"ﺍ";s:2:"ا";s:3:"ﺎ";s:2:"ا";s:3:"ﺏ";s:2:"ب";s:3:"ﺐ";s:2:"ب";s:3:"ﺑ";s:2:"ب";s:3:"ﺒ";s:2:"ب";s:3:"ﺓ";s:2:"ة";s:3:"ﺔ";s:2:"ة";s:3:"ﺕ";s:2:"ت";s:3:"ﺖ";s:2:"ت";s:3:"ﺗ";s:2:"ت";s:3:"ﺘ";s:2:"ت";s:3:"ﺙ";s:2:"ث";s:3:"ﺚ";s:2:"ث";s:3:"ﺛ";s:2:"ث";s:3:"ﺜ";s:2:"ث";s:3:"ﺝ";s:2:"ج";s:3:"ﺞ";s:2:"ج";s:3:"ﺟ";s:2:"ج";s:3:"ﺠ";s:2:"ج";s:3:"ﺡ";s:2:"ح";s:3:"ﺢ";s:2:"ح";s:3:"ﺣ";s:2:"ح";s:3:"ﺤ";s:2:"ح";s:3:"ﺥ";s:2:"خ";s:3:"ﺦ";s:2:"خ";s:3:"ﺧ";s:2:"خ";s:3:"ﺨ";s:2:"خ";s:3:"ﺩ";s:2:"د";s:3:"ﺪ";s:2:"د";s:3:"ﺫ";s:2:"ذ";s:3:"ﺬ";s:2:"ذ";s:3:"ﺭ";s:2:"ر";s:3:"ﺮ";s:2:"ر";s:3:"ﺯ";s:2:"ز";s:3:"ﺰ";s:2:"ز";s:3:"ﺱ";s:2:"س";s:3:"ﺲ";s:2:"س";s:3:"ﺳ";s:2:"س";s:3:"ﺴ";s:2:"س";s:3:"ﺵ";s:2:"ش";s:3:"ﺶ";s:2:"ش";s:3:"ﺷ";s:2:"ش";s:3:"ﺸ";s:2:"ش";s:3:"ﺹ";s:2:"ص";s:3:"ﺺ";s:2:"ص";s:3:"ﺻ";s:2:"ص";s:3:"ﺼ";s:2:"ص";s:3:"ﺽ";s:2:"ض";s:3:"ﺾ";s:2:"ض";s:3:"ﺿ";s:2:"ض";s:3:"ﻀ";s:2:"ض";s:3:"ﻁ";s:2:"ط";s:3:"ﻂ";s:2:"ط";s:3:"ﻃ";s:2:"ط";s:3:"ﻄ";s:2:"ط";s:3:"ﻅ";s:2:"ظ";s:3:"ﻆ";s:2:"ظ";s:3:"ﻇ";s:2:"ظ";s:3:"ﻈ";s:2:"ظ";s:3:"ﻉ";s:2:"ع";s:3:"ﻊ";s:2:"ع";s:3:"ﻋ";s:2:"ع";s:3:"ﻌ";s:2:"ع";s:3:"ﻍ";s:2:"غ";s:3:"ﻎ";s:2:"غ";s:3:"ﻏ";s:2:"غ";s:3:"ﻐ";s:2:"غ";s:3:"ﻑ";s:2:"ف";s:3:"ﻒ";s:2:"ف";s:3:"ﻓ";s:2:"ف";s:3:"ﻔ";s:2:"ف";s:3:"ﻕ";s:2:"ق";s:3:"ﻖ";s:2:"ق";s:3:"ﻗ";s:2:"ق";s:3:"ﻘ";s:2:"ق";s:3:"ﻙ";s:2:"ك";s:3:"ﻚ";s:2:"ك";s:3:"ﻛ";s:2:"ك";s:3:"ﻜ";s:2:"ك";s:3:"ﻝ";s:2:"ل";s:3:"ﻞ";s:2:"ل";s:3:"ﻟ";s:2:"ل";s:3:"ﻠ";s:2:"ل";s:3:"ﻡ";s:2:"م";s:3:"ﻢ";s:2:"م";s:3:"ﻣ";s:2:"م";s:3:"ﻤ";s:2:"م";s:3:"ﻥ";s:2:"ن";s:3:"ﻦ";s:2:"ن";s:3:"ﻧ";s:2:"ن";s:3:"ﻨ";s:2:"ن";s:3:"ﻩ";s:2:"ه";s:3:"ﻪ";s:2:"ه";s:3:"ﻫ";s:2:"ه";s:3:"ﻬ";s:2:"ه";s:3:"ﻭ";s:2:"و";s:3:"ﻮ";s:2:"و";s:3:"ﻯ";s:2:"ى";s:3:"ﻰ";s:2:"ى";s:3:"ﻱ";s:2:"ي";s:3:"ﻲ";s:2:"ي";s:3:"ﻳ";s:2:"ي";s:3:"ﻴ";s:2:"ي";s:3:"ﻵ";s:6:"لآ";s:3:"ﻶ";s:6:"لآ";s:3:"ﻷ";s:6:"لأ";s:3:"ﻸ";s:6:"لأ";s:3:"ﻹ";s:6:"لإ";s:3:"ﻺ";s:6:"لإ";s:3:"ﻻ";s:4:"لا";s:3:"ﻼ";s:4:"لا";s:3:"!";s:1:"!";s:3:""";s:1:""";s:3:"#";s:1:"#";s:3:"$";s:1:"$";s:3:"%";s:1:"%";s:3:"&";s:1:"&";s:3:"'";s:1:"\'";s:3:"(";s:1:"(";s:3:")";s:1:")";s:3:"*";s:1:"*";s:3:"+";s:1:"+";s:3:",";s:1:",";s:3:"-";s:1:"-";s:3:".";s:1:".";s:3:"/";s:1:"/";s:3:"0";s:1:"0";s:3:"1";s:1:"1";s:3:"2";s:1:"2";s:3:"3";s:1:"3";s:3:"4";s:1:"4";s:3:"5";s:1:"5";s:3:"6";s:1:"6";s:3:"7";s:1:"7";s:3:"8";s:1:"8";s:3:"9";s:1:"9";s:3:":";s:1:":";s:3:";";s:1:";";s:3:"<";s:1:"<";s:3:"=";s:1:"=";s:3:">";s:1:">";s:3:"?";s:1:"?";s:3:"@";s:1:"@";s:3:"A";s:1:"A";s:3:"B";s:1:"B";s:3:"C";s:1:"C";s:3:"D";s:1:"D";s:3:"E";s:1:"E";s:3:"F";s:1:"F";s:3:"G";s:1:"G";s:3:"H";s:1:"H";s:3:"I";s:1:"I";s:3:"J";s:1:"J";s:3:"K";s:1:"K";s:3:"L";s:1:"L";s:3:"M";s:1:"M";s:3:"N";s:1:"N";s:3:"O";s:1:"O";s:3:"P";s:1:"P";s:3:"Q";s:1:"Q";s:3:"R";s:1:"R";s:3:"S";s:1:"S";s:3:"T";s:1:"T";s:3:"U";s:1:"U";s:3:"V";s:1:"V";s:3:"W";s:1:"W";s:3:"X";s:1:"X";s:3:"Y";s:1:"Y";s:3:"Z";s:1:"Z";s:3:"[";s:1:"[";s:3:"\";s:1:"\\";s:3:"]";s:1:"]";s:3:"^";s:1:"^";s:3:"_";s:1:"_";s:3:"`";s:1:"`";s:3:"a";s:1:"a";s:3:"b";s:1:"b";s:3:"c";s:1:"c";s:3:"d";s:1:"d";s:3:"e";s:1:"e";s:3:"f";s:1:"f";s:3:"g";s:1:"g";s:3:"h";s:1:"h";s:3:"i";s:1:"i";s:3:"j";s:1:"j";s:3:"k";s:1:"k";s:3:"l";s:1:"l";s:3:"m";s:1:"m";s:3:"n";s:1:"n";s:3:"o";s:1:"o";s:3:"p";s:1:"p";s:3:"q";s:1:"q";s:3:"r";s:1:"r";s:3:"s";s:1:"s";s:3:"t";s:1:"t";s:3:"u";s:1:"u";s:3:"v";s:1:"v";s:3:"w";s:1:"w";s:3:"x";s:1:"x";s:3:"y";s:1:"y";s:3:"z";s:1:"z";s:3:"{";s:1:"{";s:3:"|";s:1:"|";s:3:"}";s:1:"}";s:3:"~";s:1:"~";s:3:"⦅";s:3:"⦅";s:3:"⦆";s:3:"⦆";s:3:"。";s:3:"。";s:3:"「";s:3:"「";s:3:"」";s:3:"」";s:3:"、";s:3:"、";s:3:"・";s:3:"・";s:3:"ヲ";s:3:"ヲ";s:3:"ァ";s:3:"ァ";s:3:"ィ";s:3:"ィ";s:3:"ゥ";s:3:"ゥ";s:3:"ェ";s:3:"ェ";s:3:"ォ";s:3:"ォ";s:3:"ャ";s:3:"ャ";s:3:"ュ";s:3:"ュ";s:3:"ョ";s:3:"ョ";s:3:"ッ";s:3:"ッ";s:3:"ー";s:3:"ー";s:3:"ア";s:3:"ア";s:3:"イ";s:3:"イ";s:3:"ウ";s:3:"ウ";s:3:"エ";s:3:"エ";s:3:"オ";s:3:"オ";s:3:"カ";s:3:"カ";s:3:"キ";s:3:"キ";s:3:"ク";s:3:"ク";s:3:"ケ";s:3:"ケ";s:3:"コ";s:3:"コ";s:3:"サ";s:3:"サ";s:3:"シ";s:3:"シ";s:3:"ス";s:3:"ス";s:3:"セ";s:3:"セ";s:3:"ソ";s:3:"ソ";s:3:"タ";s:3:"タ";s:3:"チ";s:3:"チ";s:3:"ツ";s:3:"ツ";s:3:"テ";s:3:"テ";s:3:"ト";s:3:"ト";s:3:"ナ";s:3:"ナ";s:3:"ニ";s:3:"ニ";s:3:"ヌ";s:3:"ヌ";s:3:"ネ";s:3:"ネ";s:3:"ノ";s:3:"ノ";s:3:"ハ";s:3:"ハ";s:3:"ヒ";s:3:"ヒ";s:3:"フ";s:3:"フ";s:3:"ヘ";s:3:"ヘ";s:3:"ホ";s:3:"ホ";s:3:"マ";s:3:"マ";s:3:"ミ";s:3:"ミ";s:3:"ム";s:3:"ム";s:3:"メ";s:3:"メ";s:3:"モ";s:3:"モ";s:3:"ヤ";s:3:"ヤ";s:3:"ユ";s:3:"ユ";s:3:"ヨ";s:3:"ヨ";s:3:"ラ";s:3:"ラ";s:3:"リ";s:3:"リ";s:3:"ル";s:3:"ル";s:3:"レ";s:3:"レ";s:3:"ロ";s:3:"ロ";s:3:"ワ";s:3:"ワ";s:3:"ン";s:3:"ン";s:3:"゙";s:3:"゙";s:3:"゚";s:3:"゚";s:3:"ᅠ";s:3:"ᅠ";s:3:"ᄀ";s:3:"ᄀ";s:3:"ᄁ";s:3:"ᄁ";s:3:"ᆪ";s:3:"ᆪ";s:3:"ᄂ";s:3:"ᄂ";s:3:"ᆬ";s:3:"ᆬ";s:3:"ᆭ";s:3:"ᆭ";s:3:"ᄃ";s:3:"ᄃ";s:3:"ᄄ";s:3:"ᄄ";s:3:"ᄅ";s:3:"ᄅ";s:3:"ᆰ";s:3:"ᆰ";s:3:"ᆱ";s:3:"ᆱ";s:3:"ᆲ";s:3:"ᆲ";s:3:"ᆳ";s:3:"ᆳ";s:3:"ᆴ";s:3:"ᆴ";s:3:"ᆵ";s:3:"ᆵ";s:3:"ᄚ";s:3:"ᄚ";s:3:"ᄆ";s:3:"ᄆ";s:3:"ᄇ";s:3:"ᄇ";s:3:"ᄈ";s:3:"ᄈ";s:3:"ᄡ";s:3:"ᄡ";s:3:"ᄉ";s:3:"ᄉ";s:3:"ᄊ";s:3:"ᄊ";s:3:"ᄋ";s:3:"ᄋ";s:3:"ᄌ";s:3:"ᄌ";s:3:"ᄍ";s:3:"ᄍ";s:3:"ᄎ";s:3:"ᄎ";s:3:"ᄏ";s:3:"ᄏ";s:3:"ᄐ";s:3:"ᄐ";s:3:"ᄑ";s:3:"ᄑ";s:3:"ᄒ";s:3:"ᄒ";s:3:"ᅡ";s:3:"ᅡ";s:3:"ᅢ";s:3:"ᅢ";s:3:"ᅣ";s:3:"ᅣ";s:3:"ᅤ";s:3:"ᅤ";s:3:"ᅥ";s:3:"ᅥ";s:3:"ᅦ";s:3:"ᅦ";s:3:"ᅧ";s:3:"ᅧ";s:3:"ᅨ";s:3:"ᅨ";s:3:"ᅩ";s:3:"ᅩ";s:3:"ᅪ";s:3:"ᅪ";s:3:"ᅫ";s:3:"ᅫ";s:3:"ᅬ";s:3:"ᅬ";s:3:"ᅭ";s:3:"ᅭ";s:3:"ᅮ";s:3:"ᅮ";s:3:"ᅯ";s:3:"ᅯ";s:3:"ᅰ";s:3:"ᅰ";s:3:"ᅱ";s:3:"ᅱ";s:3:"ᅲ";s:3:"ᅲ";s:3:"ᅳ";s:3:"ᅳ";s:3:"ᅴ";s:3:"ᅴ";s:3:"ᅵ";s:3:"ᅵ";s:3:"¢";s:2:"¢";s:3:"£";s:2:"£";s:3:"¬";s:2:"¬";s:3:" ̄";s:3:" ̄";s:3:"¦";s:2:"¦";s:3:"¥";s:2:"¥";s:3:"₩";s:3:"₩";s:3:"│";s:3:"│";s:3:"←";s:3:"←";s:3:"↑";s:3:"↑";s:3:"→";s:3:"→";s:3:"↓";s:3:"↓";s:3:"■";s:3:"■";s:3:"○";s:3:"○";s:4:"𑂚";s:8:"𑂚";s:4:"𑂜";s:8:"𑂜";s:4:"𑂫";s:8:"𑂫";s:4:"𝅗𝅥";s:8:"𝅗𝅥";s:4:"𝅘𝅥";s:8:"𝅘𝅥";s:4:"𝅘𝅥𝅮";s:12:"𝅘𝅥𝅮";s:4:"𝅘𝅥𝅯";s:12:"𝅘𝅥𝅯";s:4:"𝅘𝅥𝅰";s:12:"𝅘𝅥𝅰";s:4:"𝅘𝅥𝅱";s:12:"𝅘𝅥𝅱";s:4:"𝅘𝅥𝅲";s:12:"𝅘𝅥𝅲";s:4:"𝆹𝅥";s:8:"𝆹𝅥";s:4:"𝆺𝅥";s:8:"𝆺𝅥";s:4:"𝆹𝅥𝅮";s:12:"𝆹𝅥𝅮";s:4:"𝆺𝅥𝅮";s:12:"𝆺𝅥𝅮";s:4:"𝆹𝅥𝅯";s:12:"𝆹𝅥𝅯";s:4:"𝆺𝅥𝅯";s:12:"𝆺𝅥𝅯";s:4:"𝐀";s:1:"A";s:4:"𝐁";s:1:"B";s:4:"𝐂";s:1:"C";s:4:"𝐃";s:1:"D";s:4:"𝐄";s:1:"E";s:4:"𝐅";s:1:"F";s:4:"𝐆";s:1:"G";s:4:"𝐇";s:1:"H";s:4:"𝐈";s:1:"I";s:4:"𝐉";s:1:"J";s:4:"𝐊";s:1:"K";s:4:"𝐋";s:1:"L";s:4:"𝐌";s:1:"M";s:4:"𝐍";s:1:"N";s:4:"𝐎";s:1:"O";s:4:"𝐏";s:1:"P";s:4:"𝐐";s:1:"Q";s:4:"𝐑";s:1:"R";s:4:"𝐒";s:1:"S";s:4:"𝐓";s:1:"T";s:4:"𝐔";s:1:"U";s:4:"𝐕";s:1:"V";s:4:"𝐖";s:1:"W";s:4:"𝐗";s:1:"X";s:4:"𝐘";s:1:"Y";s:4:"𝐙";s:1:"Z";s:4:"𝐚";s:1:"a";s:4:"𝐛";s:1:"b";s:4:"𝐜";s:1:"c";s:4:"𝐝";s:1:"d";s:4:"𝐞";s:1:"e";s:4:"𝐟";s:1:"f";s:4:"𝐠";s:1:"g";s:4:"𝐡";s:1:"h";s:4:"𝐢";s:1:"i";s:4:"𝐣";s:1:"j";s:4:"𝐤";s:1:"k";s:4:"𝐥";s:1:"l";s:4:"𝐦";s:1:"m";s:4:"𝐧";s:1:"n";s:4:"𝐨";s:1:"o";s:4:"𝐩";s:1:"p";s:4:"𝐪";s:1:"q";s:4:"𝐫";s:1:"r";s:4:"𝐬";s:1:"s";s:4:"𝐭";s:1:"t";s:4:"𝐮";s:1:"u";s:4:"𝐯";s:1:"v";s:4:"𝐰";s:1:"w";s:4:"𝐱";s:1:"x";s:4:"𝐲";s:1:"y";s:4:"𝐳";s:1:"z";s:4:"𝐴";s:1:"A";s:4:"𝐵";s:1:"B";s:4:"𝐶";s:1:"C";s:4:"𝐷";s:1:"D";s:4:"𝐸";s:1:"E";s:4:"𝐹";s:1:"F";s:4:"𝐺";s:1:"G";s:4:"𝐻";s:1:"H";s:4:"𝐼";s:1:"I";s:4:"𝐽";s:1:"J";s:4:"𝐾";s:1:"K";s:4:"𝐿";s:1:"L";s:4:"𝑀";s:1:"M";s:4:"𝑁";s:1:"N";s:4:"𝑂";s:1:"O";s:4:"𝑃";s:1:"P";s:4:"𝑄";s:1:"Q";s:4:"𝑅";s:1:"R";s:4:"𝑆";s:1:"S";s:4:"𝑇";s:1:"T";s:4:"𝑈";s:1:"U";s:4:"𝑉";s:1:"V";s:4:"𝑊";s:1:"W";s:4:"𝑋";s:1:"X";s:4:"𝑌";s:1:"Y";s:4:"𝑍";s:1:"Z";s:4:"𝑎";s:1:"a";s:4:"𝑏";s:1:"b";s:4:"𝑐";s:1:"c";s:4:"𝑑";s:1:"d";s:4:"𝑒";s:1:"e";s:4:"𝑓";s:1:"f";s:4:"𝑔";s:1:"g";s:4:"𝑖";s:1:"i";s:4:"𝑗";s:1:"j";s:4:"𝑘";s:1:"k";s:4:"𝑙";s:1:"l";s:4:"𝑚";s:1:"m";s:4:"𝑛";s:1:"n";s:4:"𝑜";s:1:"o";s:4:"𝑝";s:1:"p";s:4:"𝑞";s:1:"q";s:4:"𝑟";s:1:"r";s:4:"𝑠";s:1:"s";s:4:"𝑡";s:1:"t";s:4:"𝑢";s:1:"u";s:4:"𝑣";s:1:"v";s:4:"𝑤";s:1:"w";s:4:"𝑥";s:1:"x";s:4:"𝑦";s:1:"y";s:4:"𝑧";s:1:"z";s:4:"𝑨";s:1:"A";s:4:"𝑩";s:1:"B";s:4:"𝑪";s:1:"C";s:4:"𝑫";s:1:"D";s:4:"𝑬";s:1:"E";s:4:"𝑭";s:1:"F";s:4:"𝑮";s:1:"G";s:4:"𝑯";s:1:"H";s:4:"𝑰";s:1:"I";s:4:"𝑱";s:1:"J";s:4:"𝑲";s:1:"K";s:4:"𝑳";s:1:"L";s:4:"𝑴";s:1:"M";s:4:"𝑵";s:1:"N";s:4:"𝑶";s:1:"O";s:4:"𝑷";s:1:"P";s:4:"𝑸";s:1:"Q";s:4:"𝑹";s:1:"R";s:4:"𝑺";s:1:"S";s:4:"𝑻";s:1:"T";s:4:"𝑼";s:1:"U";s:4:"𝑽";s:1:"V";s:4:"𝑾";s:1:"W";s:4:"𝑿";s:1:"X";s:4:"𝒀";s:1:"Y";s:4:"𝒁";s:1:"Z";s:4:"𝒂";s:1:"a";s:4:"𝒃";s:1:"b";s:4:"𝒄";s:1:"c";s:4:"𝒅";s:1:"d";s:4:"𝒆";s:1:"e";s:4:"𝒇";s:1:"f";s:4:"𝒈";s:1:"g";s:4:"𝒉";s:1:"h";s:4:"𝒊";s:1:"i";s:4:"𝒋";s:1:"j";s:4:"𝒌";s:1:"k";s:4:"𝒍";s:1:"l";s:4:"𝒎";s:1:"m";s:4:"𝒏";s:1:"n";s:4:"𝒐";s:1:"o";s:4:"𝒑";s:1:"p";s:4:"𝒒";s:1:"q";s:4:"𝒓";s:1:"r";s:4:"𝒔";s:1:"s";s:4:"𝒕";s:1:"t";s:4:"𝒖";s:1:"u";s:4:"𝒗";s:1:"v";s:4:"𝒘";s:1:"w";s:4:"𝒙";s:1:"x";s:4:"𝒚";s:1:"y";s:4:"𝒛";s:1:"z";s:4:"𝒜";s:1:"A";s:4:"𝒞";s:1:"C";s:4:"𝒟";s:1:"D";s:4:"𝒢";s:1:"G";s:4:"𝒥";s:1:"J";s:4:"𝒦";s:1:"K";s:4:"𝒩";s:1:"N";s:4:"𝒪";s:1:"O";s:4:"𝒫";s:1:"P";s:4:"𝒬";s:1:"Q";s:4:"𝒮";s:1:"S";s:4:"𝒯";s:1:"T";s:4:"𝒰";s:1:"U";s:4:"𝒱";s:1:"V";s:4:"𝒲";s:1:"W";s:4:"𝒳";s:1:"X";s:4:"𝒴";s:1:"Y";s:4:"𝒵";s:1:"Z";s:4:"𝒶";s:1:"a";s:4:"𝒷";s:1:"b";s:4:"𝒸";s:1:"c";s:4:"𝒹";s:1:"d";s:4:"𝒻";s:1:"f";s:4:"𝒽";s:1:"h";s:4:"𝒾";s:1:"i";s:4:"𝒿";s:1:"j";s:4:"𝓀";s:1:"k";s:4:"𝓁";s:1:"l";s:4:"𝓂";s:1:"m";s:4:"𝓃";s:1:"n";s:4:"𝓅";s:1:"p";s:4:"𝓆";s:1:"q";s:4:"𝓇";s:1:"r";s:4:"𝓈";s:1:"s";s:4:"𝓉";s:1:"t";s:4:"𝓊";s:1:"u";s:4:"𝓋";s:1:"v";s:4:"𝓌";s:1:"w";s:4:"𝓍";s:1:"x";s:4:"𝓎";s:1:"y";s:4:"𝓏";s:1:"z";s:4:"𝓐";s:1:"A";s:4:"𝓑";s:1:"B";s:4:"𝓒";s:1:"C";s:4:"𝓓";s:1:"D";s:4:"𝓔";s:1:"E";s:4:"𝓕";s:1:"F";s:4:"𝓖";s:1:"G";s:4:"𝓗";s:1:"H";s:4:"𝓘";s:1:"I";s:4:"𝓙";s:1:"J";s:4:"𝓚";s:1:"K";s:4:"𝓛";s:1:"L";s:4:"𝓜";s:1:"M";s:4:"𝓝";s:1:"N";s:4:"𝓞";s:1:"O";s:4:"𝓟";s:1:"P";s:4:"𝓠";s:1:"Q";s:4:"𝓡";s:1:"R";s:4:"𝓢";s:1:"S";s:4:"𝓣";s:1:"T";s:4:"𝓤";s:1:"U";s:4:"𝓥";s:1:"V";s:4:"𝓦";s:1:"W";s:4:"𝓧";s:1:"X";s:4:"𝓨";s:1:"Y";s:4:"𝓩";s:1:"Z";s:4:"𝓪";s:1:"a";s:4:"𝓫";s:1:"b";s:4:"𝓬";s:1:"c";s:4:"𝓭";s:1:"d";s:4:"𝓮";s:1:"e";s:4:"𝓯";s:1:"f";s:4:"𝓰";s:1:"g";s:4:"𝓱";s:1:"h";s:4:"𝓲";s:1:"i";s:4:"𝓳";s:1:"j";s:4:"𝓴";s:1:"k";s:4:"𝓵";s:1:"l";s:4:"𝓶";s:1:"m";s:4:"𝓷";s:1:"n";s:4:"𝓸";s:1:"o";s:4:"𝓹";s:1:"p";s:4:"𝓺";s:1:"q";s:4:"𝓻";s:1:"r";s:4:"𝓼";s:1:"s";s:4:"𝓽";s:1:"t";s:4:"𝓾";s:1:"u";s:4:"𝓿";s:1:"v";s:4:"𝔀";s:1:"w";s:4:"𝔁";s:1:"x";s:4:"𝔂";s:1:"y";s:4:"𝔃";s:1:"z";s:4:"𝔄";s:1:"A";s:4:"𝔅";s:1:"B";s:4:"𝔇";s:1:"D";s:4:"𝔈";s:1:"E";s:4:"𝔉";s:1:"F";s:4:"𝔊";s:1:"G";s:4:"𝔍";s:1:"J";s:4:"𝔎";s:1:"K";s:4:"𝔏";s:1:"L";s:4:"𝔐";s:1:"M";s:4:"𝔑";s:1:"N";s:4:"𝔒";s:1:"O";s:4:"𝔓";s:1:"P";s:4:"𝔔";s:1:"Q";s:4:"𝔖";s:1:"S";s:4:"𝔗";s:1:"T";s:4:"𝔘";s:1:"U";s:4:"𝔙";s:1:"V";s:4:"𝔚";s:1:"W";s:4:"𝔛";s:1:"X";s:4:"𝔜";s:1:"Y";s:4:"𝔞";s:1:"a";s:4:"𝔟";s:1:"b";s:4:"𝔠";s:1:"c";s:4:"𝔡";s:1:"d";s:4:"𝔢";s:1:"e";s:4:"𝔣";s:1:"f";s:4:"𝔤";s:1:"g";s:4:"𝔥";s:1:"h";s:4:"𝔦";s:1:"i";s:4:"𝔧";s:1:"j";s:4:"𝔨";s:1:"k";s:4:"𝔩";s:1:"l";s:4:"𝔪";s:1:"m";s:4:"𝔫";s:1:"n";s:4:"𝔬";s:1:"o";s:4:"𝔭";s:1:"p";s:4:"𝔮";s:1:"q";s:4:"𝔯";s:1:"r";s:4:"𝔰";s:1:"s";s:4:"𝔱";s:1:"t";s:4:"𝔲";s:1:"u";s:4:"𝔳";s:1:"v";s:4:"𝔴";s:1:"w";s:4:"𝔵";s:1:"x";s:4:"𝔶";s:1:"y";s:4:"𝔷";s:1:"z";s:4:"𝔸";s:1:"A";s:4:"𝔹";s:1:"B";s:4:"𝔻";s:1:"D";s:4:"𝔼";s:1:"E";s:4:"𝔽";s:1:"F";s:4:"𝔾";s:1:"G";s:4:"𝕀";s:1:"I";s:4:"𝕁";s:1:"J";s:4:"𝕂";s:1:"K";s:4:"𝕃";s:1:"L";s:4:"𝕄";s:1:"M";s:4:"𝕆";s:1:"O";s:4:"𝕊";s:1:"S";s:4:"𝕋";s:1:"T";s:4:"𝕌";s:1:"U";s:4:"𝕍";s:1:"V";s:4:"𝕎";s:1:"W";s:4:"𝕏";s:1:"X";s:4:"𝕐";s:1:"Y";s:4:"𝕒";s:1:"a";s:4:"𝕓";s:1:"b";s:4:"𝕔";s:1:"c";s:4:"𝕕";s:1:"d";s:4:"𝕖";s:1:"e";s:4:"𝕗";s:1:"f";s:4:"𝕘";s:1:"g";s:4:"𝕙";s:1:"h";s:4:"𝕚";s:1:"i";s:4:"𝕛";s:1:"j";s:4:"𝕜";s:1:"k";s:4:"𝕝";s:1:"l";s:4:"𝕞";s:1:"m";s:4:"𝕟";s:1:"n";s:4:"𝕠";s:1:"o";s:4:"𝕡";s:1:"p";s:4:"𝕢";s:1:"q";s:4:"𝕣";s:1:"r";s:4:"𝕤";s:1:"s";s:4:"𝕥";s:1:"t";s:4:"𝕦";s:1:"u";s:4:"𝕧";s:1:"v";s:4:"𝕨";s:1:"w";s:4:"𝕩";s:1:"x";s:4:"𝕪";s:1:"y";s:4:"𝕫";s:1:"z";s:4:"𝕬";s:1:"A";s:4:"𝕭";s:1:"B";s:4:"𝕮";s:1:"C";s:4:"𝕯";s:1:"D";s:4:"𝕰";s:1:"E";s:4:"𝕱";s:1:"F";s:4:"𝕲";s:1:"G";s:4:"𝕳";s:1:"H";s:4:"𝕴";s:1:"I";s:4:"𝕵";s:1:"J";s:4:"𝕶";s:1:"K";s:4:"𝕷";s:1:"L";s:4:"𝕸";s:1:"M";s:4:"𝕹";s:1:"N";s:4:"𝕺";s:1:"O";s:4:"𝕻";s:1:"P";s:4:"𝕼";s:1:"Q";s:4:"𝕽";s:1:"R";s:4:"𝕾";s:1:"S";s:4:"𝕿";s:1:"T";s:4:"𝖀";s:1:"U";s:4:"𝖁";s:1:"V";s:4:"𝖂";s:1:"W";s:4:"𝖃";s:1:"X";s:4:"𝖄";s:1:"Y";s:4:"𝖅";s:1:"Z";s:4:"𝖆";s:1:"a";s:4:"𝖇";s:1:"b";s:4:"𝖈";s:1:"c";s:4:"𝖉";s:1:"d";s:4:"𝖊";s:1:"e";s:4:"𝖋";s:1:"f";s:4:"𝖌";s:1:"g";s:4:"𝖍";s:1:"h";s:4:"𝖎";s:1:"i";s:4:"𝖏";s:1:"j";s:4:"𝖐";s:1:"k";s:4:"𝖑";s:1:"l";s:4:"𝖒";s:1:"m";s:4:"𝖓";s:1:"n";s:4:"𝖔";s:1:"o";s:4:"𝖕";s:1:"p";s:4:"𝖖";s:1:"q";s:4:"𝖗";s:1:"r";s:4:"𝖘";s:1:"s";s:4:"𝖙";s:1:"t";s:4:"𝖚";s:1:"u";s:4:"𝖛";s:1:"v";s:4:"𝖜";s:1:"w";s:4:"𝖝";s:1:"x";s:4:"𝖞";s:1:"y";s:4:"𝖟";s:1:"z";s:4:"𝖠";s:1:"A";s:4:"𝖡";s:1:"B";s:4:"𝖢";s:1:"C";s:4:"𝖣";s:1:"D";s:4:"𝖤";s:1:"E";s:4:"𝖥";s:1:"F";s:4:"𝖦";s:1:"G";s:4:"𝖧";s:1:"H";s:4:"𝖨";s:1:"I";s:4:"𝖩";s:1:"J";s:4:"𝖪";s:1:"K";s:4:"𝖫";s:1:"L";s:4:"𝖬";s:1:"M";s:4:"𝖭";s:1:"N";s:4:"𝖮";s:1:"O";s:4:"𝖯";s:1:"P";s:4:"𝖰";s:1:"Q";s:4:"𝖱";s:1:"R";s:4:"𝖲";s:1:"S";s:4:"𝖳";s:1:"T";s:4:"𝖴";s:1:"U";s:4:"𝖵";s:1:"V";s:4:"𝖶";s:1:"W";s:4:"𝖷";s:1:"X";s:4:"𝖸";s:1:"Y";s:4:"𝖹";s:1:"Z";s:4:"𝖺";s:1:"a";s:4:"𝖻";s:1:"b";s:4:"𝖼";s:1:"c";s:4:"𝖽";s:1:"d";s:4:"𝖾";s:1:"e";s:4:"𝖿";s:1:"f";s:4:"𝗀";s:1:"g";s:4:"𝗁";s:1:"h";s:4:"𝗂";s:1:"i";s:4:"𝗃";s:1:"j";s:4:"𝗄";s:1:"k";s:4:"𝗅";s:1:"l";s:4:"𝗆";s:1:"m";s:4:"𝗇";s:1:"n";s:4:"𝗈";s:1:"o";s:4:"𝗉";s:1:"p";s:4:"𝗊";s:1:"q";s:4:"𝗋";s:1:"r";s:4:"𝗌";s:1:"s";s:4:"𝗍";s:1:"t";s:4:"𝗎";s:1:"u";s:4:"𝗏";s:1:"v";s:4:"𝗐";s:1:"w";s:4:"𝗑";s:1:"x";s:4:"𝗒";s:1:"y";s:4:"𝗓";s:1:"z";s:4:"𝗔";s:1:"A";s:4:"𝗕";s:1:"B";s:4:"𝗖";s:1:"C";s:4:"𝗗";s:1:"D";s:4:"𝗘";s:1:"E";s:4:"𝗙";s:1:"F";s:4:"𝗚";s:1:"G";s:4:"𝗛";s:1:"H";s:4:"𝗜";s:1:"I";s:4:"𝗝";s:1:"J";s:4:"𝗞";s:1:"K";s:4:"𝗟";s:1:"L";s:4:"𝗠";s:1:"M";s:4:"𝗡";s:1:"N";s:4:"𝗢";s:1:"O";s:4:"𝗣";s:1:"P";s:4:"𝗤";s:1:"Q";s:4:"𝗥";s:1:"R";s:4:"𝗦";s:1:"S";s:4:"𝗧";s:1:"T";s:4:"𝗨";s:1:"U";s:4:"𝗩";s:1:"V";s:4:"𝗪";s:1:"W";s:4:"𝗫";s:1:"X";s:4:"𝗬";s:1:"Y";s:4:"𝗭";s:1:"Z";s:4:"𝗮";s:1:"a";s:4:"𝗯";s:1:"b";s:4:"𝗰";s:1:"c";s:4:"𝗱";s:1:"d";s:4:"𝗲";s:1:"e";s:4:"𝗳";s:1:"f";s:4:"𝗴";s:1:"g";s:4:"𝗵";s:1:"h";s:4:"𝗶";s:1:"i";s:4:"𝗷";s:1:"j";s:4:"𝗸";s:1:"k";s:4:"𝗹";s:1:"l";s:4:"𝗺";s:1:"m";s:4:"𝗻";s:1:"n";s:4:"𝗼";s:1:"o";s:4:"𝗽";s:1:"p";s:4:"𝗾";s:1:"q";s:4:"𝗿";s:1:"r";s:4:"𝘀";s:1:"s";s:4:"𝘁";s:1:"t";s:4:"𝘂";s:1:"u";s:4:"𝘃";s:1:"v";s:4:"𝘄";s:1:"w";s:4:"𝘅";s:1:"x";s:4:"𝘆";s:1:"y";s:4:"𝘇";s:1:"z";s:4:"𝘈";s:1:"A";s:4:"𝘉";s:1:"B";s:4:"𝘊";s:1:"C";s:4:"𝘋";s:1:"D";s:4:"𝘌";s:1:"E";s:4:"𝘍";s:1:"F";s:4:"𝘎";s:1:"G";s:4:"𝘏";s:1:"H";s:4:"𝘐";s:1:"I";s:4:"𝘑";s:1:"J";s:4:"𝘒";s:1:"K";s:4:"𝘓";s:1:"L";s:4:"𝘔";s:1:"M";s:4:"𝘕";s:1:"N";s:4:"𝘖";s:1:"O";s:4:"𝘗";s:1:"P";s:4:"𝘘";s:1:"Q";s:4:"𝘙";s:1:"R";s:4:"𝘚";s:1:"S";s:4:"𝘛";s:1:"T";s:4:"𝘜";s:1:"U";s:4:"𝘝";s:1:"V";s:4:"𝘞";s:1:"W";s:4:"𝘟";s:1:"X";s:4:"𝘠";s:1:"Y";s:4:"𝘡";s:1:"Z";s:4:"𝘢";s:1:"a";s:4:"𝘣";s:1:"b";s:4:"𝘤";s:1:"c";s:4:"𝘥";s:1:"d";s:4:"𝘦";s:1:"e";s:4:"𝘧";s:1:"f";s:4:"𝘨";s:1:"g";s:4:"𝘩";s:1:"h";s:4:"𝘪";s:1:"i";s:4:"𝘫";s:1:"j";s:4:"𝘬";s:1:"k";s:4:"𝘭";s:1:"l";s:4:"𝘮";s:1:"m";s:4:"𝘯";s:1:"n";s:4:"𝘰";s:1:"o";s:4:"𝘱";s:1:"p";s:4:"𝘲";s:1:"q";s:4:"𝘳";s:1:"r";s:4:"𝘴";s:1:"s";s:4:"𝘵";s:1:"t";s:4:"𝘶";s:1:"u";s:4:"𝘷";s:1:"v";s:4:"𝘸";s:1:"w";s:4:"𝘹";s:1:"x";s:4:"𝘺";s:1:"y";s:4:"𝘻";s:1:"z";s:4:"𝘼";s:1:"A";s:4:"𝘽";s:1:"B";s:4:"𝘾";s:1:"C";s:4:"𝘿";s:1:"D";s:4:"𝙀";s:1:"E";s:4:"𝙁";s:1:"F";s:4:"𝙂";s:1:"G";s:4:"𝙃";s:1:"H";s:4:"𝙄";s:1:"I";s:4:"𝙅";s:1:"J";s:4:"𝙆";s:1:"K";s:4:"𝙇";s:1:"L";s:4:"𝙈";s:1:"M";s:4:"𝙉";s:1:"N";s:4:"𝙊";s:1:"O";s:4:"𝙋";s:1:"P";s:4:"𝙌";s:1:"Q";s:4:"𝙍";s:1:"R";s:4:"𝙎";s:1:"S";s:4:"𝙏";s:1:"T";s:4:"𝙐";s:1:"U";s:4:"𝙑";s:1:"V";s:4:"𝙒";s:1:"W";s:4:"𝙓";s:1:"X";s:4:"𝙔";s:1:"Y";s:4:"𝙕";s:1:"Z";s:4:"𝙖";s:1:"a";s:4:"𝙗";s:1:"b";s:4:"𝙘";s:1:"c";s:4:"𝙙";s:1:"d";s:4:"𝙚";s:1:"e";s:4:"𝙛";s:1:"f";s:4:"𝙜";s:1:"g";s:4:"𝙝";s:1:"h";s:4:"𝙞";s:1:"i";s:4:"𝙟";s:1:"j";s:4:"𝙠";s:1:"k";s:4:"𝙡";s:1:"l";s:4:"𝙢";s:1:"m";s:4:"𝙣";s:1:"n";s:4:"𝙤";s:1:"o";s:4:"𝙥";s:1:"p";s:4:"𝙦";s:1:"q";s:4:"𝙧";s:1:"r";s:4:"𝙨";s:1:"s";s:4:"𝙩";s:1:"t";s:4:"𝙪";s:1:"u";s:4:"𝙫";s:1:"v";s:4:"𝙬";s:1:"w";s:4:"𝙭";s:1:"x";s:4:"𝙮";s:1:"y";s:4:"𝙯";s:1:"z";s:4:"𝙰";s:1:"A";s:4:"𝙱";s:1:"B";s:4:"𝙲";s:1:"C";s:4:"𝙳";s:1:"D";s:4:"𝙴";s:1:"E";s:4:"𝙵";s:1:"F";s:4:"𝙶";s:1:"G";s:4:"𝙷";s:1:"H";s:4:"𝙸";s:1:"I";s:4:"𝙹";s:1:"J";s:4:"𝙺";s:1:"K";s:4:"𝙻";s:1:"L";s:4:"𝙼";s:1:"M";s:4:"𝙽";s:1:"N";s:4:"𝙾";s:1:"O";s:4:"𝙿";s:1:"P";s:4:"𝚀";s:1:"Q";s:4:"𝚁";s:1:"R";s:4:"𝚂";s:1:"S";s:4:"𝚃";s:1:"T";s:4:"𝚄";s:1:"U";s:4:"𝚅";s:1:"V";s:4:"𝚆";s:1:"W";s:4:"𝚇";s:1:"X";s:4:"𝚈";s:1:"Y";s:4:"𝚉";s:1:"Z";s:4:"𝚊";s:1:"a";s:4:"𝚋";s:1:"b";s:4:"𝚌";s:1:"c";s:4:"𝚍";s:1:"d";s:4:"𝚎";s:1:"e";s:4:"𝚏";s:1:"f";s:4:"𝚐";s:1:"g";s:4:"𝚑";s:1:"h";s:4:"𝚒";s:1:"i";s:4:"𝚓";s:1:"j";s:4:"𝚔";s:1:"k";s:4:"𝚕";s:1:"l";s:4:"𝚖";s:1:"m";s:4:"𝚗";s:1:"n";s:4:"𝚘";s:1:"o";s:4:"𝚙";s:1:"p";s:4:"𝚚";s:1:"q";s:4:"𝚛";s:1:"r";s:4:"𝚜";s:1:"s";s:4:"𝚝";s:1:"t";s:4:"𝚞";s:1:"u";s:4:"𝚟";s:1:"v";s:4:"𝚠";s:1:"w";s:4:"𝚡";s:1:"x";s:4:"𝚢";s:1:"y";s:4:"𝚣";s:1:"z";s:4:"𝚤";s:2:"ı";s:4:"𝚥";s:2:"ȷ";s:4:"𝚨";s:2:"Α";s:4:"𝚩";s:2:"Β";s:4:"𝚪";s:2:"Γ";s:4:"𝚫";s:2:"Δ";s:4:"𝚬";s:2:"Ε";s:4:"𝚭";s:2:"Ζ";s:4:"𝚮";s:2:"Η";s:4:"𝚯";s:2:"Θ";s:4:"𝚰";s:2:"Ι";s:4:"𝚱";s:2:"Κ";s:4:"𝚲";s:2:"Λ";s:4:"𝚳";s:2:"Μ";s:4:"𝚴";s:2:"Ν";s:4:"𝚵";s:2:"Ξ";s:4:"𝚶";s:2:"Ο";s:4:"𝚷";s:2:"Π";s:4:"𝚸";s:2:"Ρ";s:4:"𝚹";s:2:"Θ";s:4:"𝚺";s:2:"Σ";s:4:"𝚻";s:2:"Τ";s:4:"𝚼";s:2:"Υ";s:4:"𝚽";s:2:"Φ";s:4:"𝚾";s:2:"Χ";s:4:"𝚿";s:2:"Ψ";s:4:"𝛀";s:2:"Ω";s:4:"𝛁";s:3:"∇";s:4:"𝛂";s:2:"α";s:4:"𝛃";s:2:"β";s:4:"𝛄";s:2:"γ";s:4:"𝛅";s:2:"δ";s:4:"𝛆";s:2:"ε";s:4:"𝛇";s:2:"ζ";s:4:"𝛈";s:2:"η";s:4:"𝛉";s:2:"θ";s:4:"𝛊";s:2:"ι";s:4:"𝛋";s:2:"κ";s:4:"𝛌";s:2:"λ";s:4:"𝛍";s:2:"μ";s:4:"𝛎";s:2:"ν";s:4:"𝛏";s:2:"ξ";s:4:"𝛐";s:2:"ο";s:4:"𝛑";s:2:"π";s:4:"𝛒";s:2:"ρ";s:4:"𝛓";s:2:"ς";s:4:"𝛔";s:2:"σ";s:4:"𝛕";s:2:"τ";s:4:"𝛖";s:2:"υ";s:4:"𝛗";s:2:"φ";s:4:"𝛘";s:2:"χ";s:4:"𝛙";s:2:"ψ";s:4:"𝛚";s:2:"ω";s:4:"𝛛";s:3:"∂";s:4:"𝛜";s:2:"ε";s:4:"𝛝";s:2:"θ";s:4:"𝛞";s:2:"κ";s:4:"𝛟";s:2:"φ";s:4:"𝛠";s:2:"ρ";s:4:"𝛡";s:2:"π";s:4:"𝛢";s:2:"Α";s:4:"𝛣";s:2:"Β";s:4:"𝛤";s:2:"Γ";s:4:"𝛥";s:2:"Δ";s:4:"𝛦";s:2:"Ε";s:4:"𝛧";s:2:"Ζ";s:4:"𝛨";s:2:"Η";s:4:"𝛩";s:2:"Θ";s:4:"𝛪";s:2:"Ι";s:4:"𝛫";s:2:"Κ";s:4:"𝛬";s:2:"Λ";s:4:"𝛭";s:2:"Μ";s:4:"𝛮";s:2:"Ν";s:4:"𝛯";s:2:"Ξ";s:4:"𝛰";s:2:"Ο";s:4:"𝛱";s:2:"Π";s:4:"𝛲";s:2:"Ρ";s:4:"𝛳";s:2:"Θ";s:4:"𝛴";s:2:"Σ";s:4:"𝛵";s:2:"Τ";s:4:"𝛶";s:2:"Υ";s:4:"𝛷";s:2:"Φ";s:4:"𝛸";s:2:"Χ";s:4:"𝛹";s:2:"Ψ";s:4:"𝛺";s:2:"Ω";s:4:"𝛻";s:3:"∇";s:4:"𝛼";s:2:"α";s:4:"𝛽";s:2:"β";s:4:"𝛾";s:2:"γ";s:4:"𝛿";s:2:"δ";s:4:"𝜀";s:2:"ε";s:4:"𝜁";s:2:"ζ";s:4:"𝜂";s:2:"η";s:4:"𝜃";s:2:"θ";s:4:"𝜄";s:2:"ι";s:4:"𝜅";s:2:"κ";s:4:"𝜆";s:2:"λ";s:4:"𝜇";s:2:"μ";s:4:"𝜈";s:2:"ν";s:4:"𝜉";s:2:"ξ";s:4:"𝜊";s:2:"ο";s:4:"𝜋";s:2:"π";s:4:"𝜌";s:2:"ρ";s:4:"𝜍";s:2:"ς";s:4:"𝜎";s:2:"σ";s:4:"𝜏";s:2:"τ";s:4:"𝜐";s:2:"υ";s:4:"𝜑";s:2:"φ";s:4:"𝜒";s:2:"χ";s:4:"𝜓";s:2:"ψ";s:4:"𝜔";s:2:"ω";s:4:"𝜕";s:3:"∂";s:4:"𝜖";s:2:"ε";s:4:"𝜗";s:2:"θ";s:4:"𝜘";s:2:"κ";s:4:"𝜙";s:2:"φ";s:4:"𝜚";s:2:"ρ";s:4:"𝜛";s:2:"π";s:4:"𝜜";s:2:"Α";s:4:"𝜝";s:2:"Β";s:4:"𝜞";s:2:"Γ";s:4:"𝜟";s:2:"Δ";s:4:"𝜠";s:2:"Ε";s:4:"𝜡";s:2:"Ζ";s:4:"𝜢";s:2:"Η";s:4:"𝜣";s:2:"Θ";s:4:"𝜤";s:2:"Ι";s:4:"𝜥";s:2:"Κ";s:4:"𝜦";s:2:"Λ";s:4:"𝜧";s:2:"Μ";s:4:"𝜨";s:2:"Ν";s:4:"𝜩";s:2:"Ξ";s:4:"𝜪";s:2:"Ο";s:4:"𝜫";s:2:"Π";s:4:"𝜬";s:2:"Ρ";s:4:"𝜭";s:2:"Θ";s:4:"𝜮";s:2:"Σ";s:4:"𝜯";s:2:"Τ";s:4:"𝜰";s:2:"Υ";s:4:"𝜱";s:2:"Φ";s:4:"𝜲";s:2:"Χ";s:4:"𝜳";s:2:"Ψ";s:4:"𝜴";s:2:"Ω";s:4:"𝜵";s:3:"∇";s:4:"𝜶";s:2:"α";s:4:"𝜷";s:2:"β";s:4:"𝜸";s:2:"γ";s:4:"𝜹";s:2:"δ";s:4:"𝜺";s:2:"ε";s:4:"𝜻";s:2:"ζ";s:4:"𝜼";s:2:"η";s:4:"𝜽";s:2:"θ";s:4:"𝜾";s:2:"ι";s:4:"𝜿";s:2:"κ";s:4:"𝝀";s:2:"λ";s:4:"𝝁";s:2:"μ";s:4:"𝝂";s:2:"ν";s:4:"𝝃";s:2:"ξ";s:4:"𝝄";s:2:"ο";s:4:"𝝅";s:2:"π";s:4:"𝝆";s:2:"ρ";s:4:"𝝇";s:2:"ς";s:4:"𝝈";s:2:"σ";s:4:"𝝉";s:2:"τ";s:4:"𝝊";s:2:"υ";s:4:"𝝋";s:2:"φ";s:4:"𝝌";s:2:"χ";s:4:"𝝍";s:2:"ψ";s:4:"𝝎";s:2:"ω";s:4:"𝝏";s:3:"∂";s:4:"𝝐";s:2:"ε";s:4:"𝝑";s:2:"θ";s:4:"𝝒";s:2:"κ";s:4:"𝝓";s:2:"φ";s:4:"𝝔";s:2:"ρ";s:4:"𝝕";s:2:"π";s:4:"𝝖";s:2:"Α";s:4:"𝝗";s:2:"Β";s:4:"𝝘";s:2:"Γ";s:4:"𝝙";s:2:"Δ";s:4:"𝝚";s:2:"Ε";s:4:"𝝛";s:2:"Ζ";s:4:"𝝜";s:2:"Η";s:4:"𝝝";s:2:"Θ";s:4:"𝝞";s:2:"Ι";s:4:"𝝟";s:2:"Κ";s:4:"𝝠";s:2:"Λ";s:4:"𝝡";s:2:"Μ";s:4:"𝝢";s:2:"Ν";s:4:"𝝣";s:2:"Ξ";s:4:"𝝤";s:2:"Ο";s:4:"𝝥";s:2:"Π";s:4:"𝝦";s:2:"Ρ";s:4:"𝝧";s:2:"Θ";s:4:"𝝨";s:2:"Σ";s:4:"𝝩";s:2:"Τ";s:4:"𝝪";s:2:"Υ";s:4:"𝝫";s:2:"Φ";s:4:"𝝬";s:2:"Χ";s:4:"𝝭";s:2:"Ψ";s:4:"𝝮";s:2:"Ω";s:4:"𝝯";s:3:"∇";s:4:"𝝰";s:2:"α";s:4:"𝝱";s:2:"β";s:4:"𝝲";s:2:"γ";s:4:"𝝳";s:2:"δ";s:4:"𝝴";s:2:"ε";s:4:"𝝵";s:2:"ζ";s:4:"𝝶";s:2:"η";s:4:"𝝷";s:2:"θ";s:4:"𝝸";s:2:"ι";s:4:"𝝹";s:2:"κ";s:4:"𝝺";s:2:"λ";s:4:"𝝻";s:2:"μ";s:4:"𝝼";s:2:"ν";s:4:"𝝽";s:2:"ξ";s:4:"𝝾";s:2:"ο";s:4:"𝝿";s:2:"π";s:4:"𝞀";s:2:"ρ";s:4:"𝞁";s:2:"ς";s:4:"𝞂";s:2:"σ";s:4:"𝞃";s:2:"τ";s:4:"𝞄";s:2:"υ";s:4:"𝞅";s:2:"φ";s:4:"𝞆";s:2:"χ";s:4:"𝞇";s:2:"ψ";s:4:"𝞈";s:2:"ω";s:4:"𝞉";s:3:"∂";s:4:"𝞊";s:2:"ε";s:4:"𝞋";s:2:"θ";s:4:"𝞌";s:2:"κ";s:4:"𝞍";s:2:"φ";s:4:"𝞎";s:2:"ρ";s:4:"𝞏";s:2:"π";s:4:"𝞐";s:2:"Α";s:4:"𝞑";s:2:"Β";s:4:"𝞒";s:2:"Γ";s:4:"𝞓";s:2:"Δ";s:4:"𝞔";s:2:"Ε";s:4:"𝞕";s:2:"Ζ";s:4:"𝞖";s:2:"Η";s:4:"𝞗";s:2:"Θ";s:4:"𝞘";s:2:"Ι";s:4:"𝞙";s:2:"Κ";s:4:"𝞚";s:2:"Λ";s:4:"𝞛";s:2:"Μ";s:4:"𝞜";s:2:"Ν";s:4:"𝞝";s:2:"Ξ";s:4:"𝞞";s:2:"Ο";s:4:"𝞟";s:2:"Π";s:4:"𝞠";s:2:"Ρ";s:4:"𝞡";s:2:"Θ";s:4:"𝞢";s:2:"Σ";s:4:"𝞣";s:2:"Τ";s:4:"𝞤";s:2:"Υ";s:4:"𝞥";s:2:"Φ";s:4:"𝞦";s:2:"Χ";s:4:"𝞧";s:2:"Ψ";s:4:"𝞨";s:2:"Ω";s:4:"𝞩";s:3:"∇";s:4:"𝞪";s:2:"α";s:4:"𝞫";s:2:"β";s:4:"𝞬";s:2:"γ";s:4:"𝞭";s:2:"δ";s:4:"𝞮";s:2:"ε";s:4:"𝞯";s:2:"ζ";s:4:"𝞰";s:2:"η";s:4:"𝞱";s:2:"θ";s:4:"𝞲";s:2:"ι";s:4:"𝞳";s:2:"κ";s:4:"𝞴";s:2:"λ";s:4:"𝞵";s:2:"μ";s:4:"𝞶";s:2:"ν";s:4:"𝞷";s:2:"ξ";s:4:"𝞸";s:2:"ο";s:4:"𝞹";s:2:"π";s:4:"𝞺";s:2:"ρ";s:4:"𝞻";s:2:"ς";s:4:"𝞼";s:2:"σ";s:4:"𝞽";s:2:"τ";s:4:"𝞾";s:2:"υ";s:4:"𝞿";s:2:"φ";s:4:"𝟀";s:2:"χ";s:4:"𝟁";s:2:"ψ";s:4:"𝟂";s:2:"ω";s:4:"𝟃";s:3:"∂";s:4:"𝟄";s:2:"ε";s:4:"𝟅";s:2:"θ";s:4:"𝟆";s:2:"κ";s:4:"𝟇";s:2:"φ";s:4:"𝟈";s:2:"ρ";s:4:"𝟉";s:2:"π";s:4:"𝟊";s:2:"Ϝ";s:4:"𝟋";s:2:"ϝ";s:4:"𝟎";s:1:"0";s:4:"𝟏";s:1:"1";s:4:"𝟐";s:1:"2";s:4:"𝟑";s:1:"3";s:4:"𝟒";s:1:"4";s:4:"𝟓";s:1:"5";s:4:"𝟔";s:1:"6";s:4:"𝟕";s:1:"7";s:4:"𝟖";s:1:"8";s:4:"𝟗";s:1:"9";s:4:"𝟘";s:1:"0";s:4:"𝟙";s:1:"1";s:4:"𝟚";s:1:"2";s:4:"𝟛";s:1:"3";s:4:"𝟜";s:1:"4";s:4:"𝟝";s:1:"5";s:4:"𝟞";s:1:"6";s:4:"𝟟";s:1:"7";s:4:"𝟠";s:1:"8";s:4:"𝟡";s:1:"9";s:4:"𝟢";s:1:"0";s:4:"𝟣";s:1:"1";s:4:"𝟤";s:1:"2";s:4:"𝟥";s:1:"3";s:4:"𝟦";s:1:"4";s:4:"𝟧";s:1:"5";s:4:"𝟨";s:1:"6";s:4:"𝟩";s:1:"7";s:4:"𝟪";s:1:"8";s:4:"𝟫";s:1:"9";s:4:"𝟬";s:1:"0";s:4:"𝟭";s:1:"1";s:4:"𝟮";s:1:"2";s:4:"𝟯";s:1:"3";s:4:"𝟰";s:1:"4";s:4:"𝟱";s:1:"5";s:4:"𝟲";s:1:"6";s:4:"𝟳";s:1:"7";s:4:"𝟴";s:1:"8";s:4:"𝟵";s:1:"9";s:4:"𝟶";s:1:"0";s:4:"𝟷";s:1:"1";s:4:"𝟸";s:1:"2";s:4:"𝟹";s:1:"3";s:4:"𝟺";s:1:"4";s:4:"𝟻";s:1:"5";s:4:"𝟼";s:1:"6";s:4:"𝟽";s:1:"7";s:4:"𝟾";s:1:"8";s:4:"𝟿";s:1:"9";s:4:"🄀";s:2:"0.";s:4:"🄁";s:2:"0,";s:4:"🄂";s:2:"1,";s:4:"🄃";s:2:"2,";s:4:"🄄";s:2:"3,";s:4:"🄅";s:2:"4,";s:4:"🄆";s:2:"5,";s:4:"🄇";s:2:"6,";s:4:"🄈";s:2:"7,";s:4:"🄉";s:2:"8,";s:4:"🄊";s:2:"9,";s:4:"🄐";s:3:"(A)";s:4:"🄑";s:3:"(B)";s:4:"🄒";s:3:"(C)";s:4:"🄓";s:3:"(D)";s:4:"🄔";s:3:"(E)";s:4:"🄕";s:3:"(F)";s:4:"🄖";s:3:"(G)";s:4:"🄗";s:3:"(H)";s:4:"🄘";s:3:"(I)";s:4:"🄙";s:3:"(J)";s:4:"🄚";s:3:"(K)";s:4:"🄛";s:3:"(L)";s:4:"🄜";s:3:"(M)";s:4:"🄝";s:3:"(N)";s:4:"🄞";s:3:"(O)";s:4:"🄟";s:3:"(P)";s:4:"🄠";s:3:"(Q)";s:4:"🄡";s:3:"(R)";s:4:"🄢";s:3:"(S)";s:4:"🄣";s:3:"(T)";s:4:"🄤";s:3:"(U)";s:4:"🄥";s:3:"(V)";s:4:"🄦";s:3:"(W)";s:4:"🄧";s:3:"(X)";s:4:"🄨";s:3:"(Y)";s:4:"🄩";s:3:"(Z)";s:4:"🄪";s:7:"〔S〕";s:4:"🄫";s:1:"C";s:4:"🄬";s:1:"R";s:4:"🄭";s:2:"CD";s:4:"🄮";s:2:"WZ";s:4:"🄰";s:1:"A";s:4:"🄱";s:1:"B";s:4:"🄲";s:1:"C";s:4:"🄳";s:1:"D";s:4:"🄴";s:1:"E";s:4:"🄵";s:1:"F";s:4:"🄶";s:1:"G";s:4:"🄷";s:1:"H";s:4:"🄸";s:1:"I";s:4:"🄹";s:1:"J";s:4:"🄺";s:1:"K";s:4:"🄻";s:1:"L";s:4:"🄼";s:1:"M";s:4:"🄽";s:1:"N";s:4:"🄾";s:1:"O";s:4:"🄿";s:1:"P";s:4:"🅀";s:1:"Q";s:4:"🅁";s:1:"R";s:4:"🅂";s:1:"S";s:4:"🅃";s:1:"T";s:4:"🅄";s:1:"U";s:4:"🅅";s:1:"V";s:4:"🅆";s:1:"W";s:4:"🅇";s:1:"X";s:4:"🅈";s:1:"Y";s:4:"🅉";s:1:"Z";s:4:"🅊";s:2:"HV";s:4:"🅋";s:2:"MV";s:4:"🅌";s:2:"SD";s:4:"🅍";s:2:"SS";s:4:"🅎";s:3:"PPV";s:4:"🅏";s:2:"WC";s:4:"🆐";s:2:"DJ";s:4:"🈀";s:6:"ほか";s:4:"🈁";s:6:"ココ";s:4:"🈂";s:3:"サ";s:4:"🈐";s:3:"手";s:4:"🈑";s:3:"字";s:4:"🈒";s:3:"双";s:4:"🈓";s:6:"デ";s:4:"🈔";s:3:"二";s:4:"🈕";s:3:"多";s:4:"🈖";s:3:"解";s:4:"🈗";s:3:"天";s:4:"🈘";s:3:"交";s:4:"🈙";s:3:"映";s:4:"🈚";s:3:"無";s:4:"🈛";s:3:"料";s:4:"🈜";s:3:"前";s:4:"🈝";s:3:"後";s:4:"🈞";s:3:"再";s:4:"🈟";s:3:"新";s:4:"🈠";s:3:"初";s:4:"🈡";s:3:"終";s:4:"🈢";s:3:"生";s:4:"🈣";s:3:"販";s:4:"🈤";s:3:"声";s:4:"🈥";s:3:"吹";s:4:"🈦";s:3:"演";s:4:"🈧";s:3:"投";s:4:"🈨";s:3:"捕";s:4:"🈩";s:3:"一";s:4:"🈪";s:3:"三";s:4:"🈫";s:3:"遊";s:4:"🈬";s:3:"左";s:4:"🈭";s:3:"中";s:4:"🈮";s:3:"右";s:4:"🈯";s:3:"指";s:4:"🈰";s:3:"走";s:4:"🈱";s:3:"打";s:4:"🈲";s:3:"禁";s:4:"🈳";s:3:"空";s:4:"🈴";s:3:"合";s:4:"🈵";s:3:"満";s:4:"🈶";s:3:"有";s:4:"🈷";s:3:"月";s:4:"🈸";s:3:"申";s:4:"🈹";s:3:"割";s:4:"🈺";s:3:"営";s:4:"🉀";s:9:"〔本〕";s:4:"🉁";s:9:"〔三〕";s:4:"🉂";s:9:"〔二〕";s:4:"🉃";s:9:"〔安〕";s:4:"🉄";s:9:"〔点〕";s:4:"🉅";s:9:"〔打〕";s:4:"🉆";s:9:"〔盗〕";s:4:"🉇";s:9:"〔勝〕";s:4:"🉈";s:9:"〔敗〕";s:4:"🉐";s:3:"得";s:4:"🉑";s:3:"可";s:4:"丽";s:3:"丽";s:4:"丸";s:3:"丸";s:4:"乁";s:3:"乁";s:4:"𠄢";s:4:"𠄢";s:4:"你";s:3:"你";s:4:"侮";s:3:"侮";s:4:"侻";s:3:"侻";s:4:"倂";s:3:"倂";s:4:"偺";s:3:"偺";s:4:"備";s:3:"備";s:4:"僧";s:3:"僧";s:4:"像";s:3:"像";s:4:"㒞";s:3:"㒞";s:4:"𠘺";s:4:"𠘺";s:4:"免";s:3:"免";s:4:"兔";s:3:"兔";s:4:"兤";s:3:"兤";s:4:"具";s:3:"具";s:4:"𠔜";s:4:"𠔜";s:4:"㒹";s:3:"㒹";s:4:"內";s:3:"內";s:4:"再";s:3:"再";s:4:"𠕋";s:4:"𠕋";s:4:"冗";s:3:"冗";s:4:"冤";s:3:"冤";s:4:"仌";s:3:"仌";s:4:"冬";s:3:"冬";s:4:"况";s:3:"况";s:4:"𩇟";s:4:"𩇟";s:4:"凵";s:3:"凵";s:4:"刃";s:3:"刃";s:4:"㓟";s:3:"㓟";s:4:"刻";s:3:"刻";s:4:"剆";s:3:"剆";s:4:"割";s:3:"割";s:4:"剷";s:3:"剷";s:4:"㔕";s:3:"㔕";s:4:"勇";s:3:"勇";s:4:"勉";s:3:"勉";s:4:"勤";s:3:"勤";s:4:"勺";s:3:"勺";s:4:"包";s:3:"包";s:4:"匆";s:3:"匆";s:4:"北";s:3:"北";s:4:"卉";s:3:"卉";s:4:"卑";s:3:"卑";s:4:"博";s:3:"博";s:4:"即";s:3:"即";s:4:"卽";s:3:"卽";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"卿";s:3:"卿";s:4:"𠨬";s:4:"𠨬";s:4:"灰";s:3:"灰";s:4:"及";s:3:"及";s:4:"叟";s:3:"叟";s:4:"𠭣";s:4:"𠭣";s:4:"叫";s:3:"叫";s:4:"叱";s:3:"叱";s:4:"吆";s:3:"吆";s:4:"咞";s:3:"咞";s:4:"吸";s:3:"吸";s:4:"呈";s:3:"呈";s:4:"周";s:3:"周";s:4:"咢";s:3:"咢";s:4:"哶";s:3:"哶";s:4:"唐";s:3:"唐";s:4:"啓";s:3:"啓";s:4:"啣";s:3:"啣";s:4:"善";s:3:"善";s:4:"善";s:3:"善";s:4:"喙";s:3:"喙";s:4:"喫";s:3:"喫";s:4:"喳";s:3:"喳";s:4:"嗂";s:3:"嗂";s:4:"圖";s:3:"圖";s:4:"嘆";s:3:"嘆";s:4:"圗";s:3:"圗";s:4:"噑";s:3:"噑";s:4:"噴";s:3:"噴";s:4:"切";s:3:"切";s:4:"壮";s:3:"壮";s:4:"城";s:3:"城";s:4:"埴";s:3:"埴";s:4:"堍";s:3:"堍";s:4:"型";s:3:"型";s:4:"堲";s:3:"堲";s:4:"報";s:3:"報";s:4:"墬";s:3:"墬";s:4:"𡓤";s:4:"𡓤";s:4:"売";s:3:"売";s:4:"壷";s:3:"壷";s:4:"夆";s:3:"夆";s:4:"多";s:3:"多";s:4:"夢";s:3:"夢";s:4:"奢";s:3:"奢";s:4:"𡚨";s:4:"𡚨";s:4:"𡛪";s:4:"𡛪";s:4:"姬";s:3:"姬";s:4:"娛";s:3:"娛";s:4:"娧";s:3:"娧";s:4:"姘";s:3:"姘";s:4:"婦";s:3:"婦";s:4:"㛮";s:3:"㛮";s:4:"㛼";s:3:"㛼";s:4:"嬈";s:3:"嬈";s:4:"嬾";s:3:"嬾";s:4:"嬾";s:3:"嬾";s:4:"𡧈";s:4:"𡧈";s:4:"寃";s:3:"寃";s:4:"寘";s:3:"寘";s:4:"寧";s:3:"寧";s:4:"寳";s:3:"寳";s:4:"𡬘";s:4:"𡬘";s:4:"寿";s:3:"寿";s:4:"将";s:3:"将";s:4:"当";s:3:"当";s:4:"尢";s:3:"尢";s:4:"㞁";s:3:"㞁";s:4:"屠";s:3:"屠";s:4:"屮";s:3:"屮";s:4:"峀";s:3:"峀";s:4:"岍";s:3:"岍";s:4:"𡷤";s:4:"𡷤";s:4:"嵃";s:3:"嵃";s:4:"𡷦";s:4:"𡷦";s:4:"嵮";s:3:"嵮";s:4:"嵫";s:3:"嵫";s:4:"嵼";s:3:"嵼";s:4:"巡";s:3:"巡";s:4:"巢";s:3:"巢";s:4:"㠯";s:3:"㠯";s:4:"巽";s:3:"巽";s:4:"帨";s:3:"帨";s:4:"帽";s:3:"帽";s:4:"幩";s:3:"幩";s:4:"㡢";s:3:"㡢";s:4:"𢆃";s:4:"𢆃";s:4:"㡼";s:3:"㡼";s:4:"庰";s:3:"庰";s:4:"庳";s:3:"庳";s:4:"庶";s:3:"庶";s:4:"廊";s:3:"廊";s:4:"𪎒";s:4:"𪎒";s:4:"廾";s:3:"廾";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"𢌱";s:4:"舁";s:3:"舁";s:4:"弢";s:3:"弢";s:4:"弢";s:3:"弢";s:4:"㣇";s:3:"㣇";s:4:"𣊸";s:4:"𣊸";s:4:"𦇚";s:4:"𦇚";s:4:"形";s:3:"形";s:4:"彫";s:3:"彫";s:4:"㣣";s:3:"㣣";s:4:"徚";s:3:"徚";s:4:"忍";s:3:"忍";s:4:"志";s:3:"志";s:4:"忹";s:3:"忹";s:4:"悁";s:3:"悁";s:4:"㤺";s:3:"㤺";s:4:"㤜";s:3:"㤜";s:4:"悔";s:3:"悔";s:4:"𢛔";s:4:"𢛔";s:4:"惇";s:3:"惇";s:4:"慈";s:3:"慈";s:4:"慌";s:3:"慌";s:4:"慎";s:3:"慎";s:4:"慌";s:3:"慌";s:4:"慺";s:3:"慺";s:4:"憎";s:3:"憎";s:4:"憲";s:3:"憲";s:4:"憤";s:3:"憤";s:4:"憯";s:3:"憯";s:4:"懞";s:3:"懞";s:4:"懲";s:3:"懲";s:4:"懶";s:3:"懶";s:4:"成";s:3:"成";s:4:"戛";s:3:"戛";s:4:"扝";s:3:"扝";s:4:"抱";s:3:"抱";s:4:"拔";s:3:"拔";s:4:"捐";s:3:"捐";s:4:"𢬌";s:4:"𢬌";s:4:"挽";s:3:"挽";s:4:"拼";s:3:"拼";s:4:"捨";s:3:"捨";s:4:"掃";s:3:"掃";s:4:"揤";s:3:"揤";s:4:"𢯱";s:4:"𢯱";s:4:"搢";s:3:"搢";s:4:"揅";s:3:"揅";s:4:"掩";s:3:"掩";s:4:"㨮";s:3:"㨮";s:4:"摩";s:3:"摩";s:4:"摾";s:3:"摾";s:4:"撝";s:3:"撝";s:4:"摷";s:3:"摷";s:4:"㩬";s:3:"㩬";s:4:"敏";s:3:"敏";s:4:"敬";s:3:"敬";s:4:"𣀊";s:4:"𣀊";s:4:"旣";s:3:"旣";s:4:"書";s:3:"書";s:4:"晉";s:3:"晉";s:4:"㬙";s:3:"㬙";s:4:"暑";s:3:"暑";s:4:"㬈";s:3:"㬈";s:4:"㫤";s:3:"㫤";s:4:"冒";s:3:"冒";s:4:"冕";s:3:"冕";s:4:"最";s:3:"最";s:4:"暜";s:3:"暜";s:4:"肭";s:3:"肭";s:4:"䏙";s:3:"䏙";s:4:"朗";s:3:"朗";s:4:"望";s:3:"望";s:4:"朡";s:3:"朡";s:4:"杞";s:3:"杞";s:4:"杓";s:3:"杓";s:4:"𣏃";s:4:"𣏃";s:4:"㭉";s:3:"㭉";s:4:"柺";s:3:"柺";s:4:"枅";s:3:"枅";s:4:"桒";s:3:"桒";s:4:"梅";s:3:"梅";s:4:"𣑭";s:4:"𣑭";s:4:"梎";s:3:"梎";s:4:"栟";s:3:"栟";s:4:"椔";s:3:"椔";s:4:"㮝";s:3:"㮝";s:4:"楂";s:3:"楂";s:4:"榣";s:3:"榣";s:4:"槪";s:3:"槪";s:4:"檨";s:3:"檨";s:4:"𣚣";s:4:"𣚣";s:4:"櫛";s:3:"櫛";s:4:"㰘";s:3:"㰘";s:4:"次";s:3:"次";s:4:"𣢧";s:4:"𣢧";s:4:"歔";s:3:"歔";s:4:"㱎";s:3:"㱎";s:4:"歲";s:3:"歲";s:4:"殟";s:3:"殟";s:4:"殺";s:3:"殺";s:4:"殻";s:3:"殻";s:4:"𣪍";s:4:"𣪍";s:4:"𡴋";s:4:"𡴋";s:4:"𣫺";s:4:"𣫺";s:4:"汎";s:3:"汎";s:4:"𣲼";s:4:"𣲼";s:4:"沿";s:3:"沿";s:4:"泍";s:3:"泍";s:4:"汧";s:3:"汧";s:4:"洖";s:3:"洖";s:4:"派";s:3:"派";s:4:"海";s:3:"海";s:4:"流";s:3:"流";s:4:"浩";s:3:"浩";s:4:"浸";s:3:"浸";s:4:"涅";s:3:"涅";s:4:"𣴞";s:4:"𣴞";s:4:"洴";s:3:"洴";s:4:"港";s:3:"港";s:4:"湮";s:3:"湮";s:4:"㴳";s:3:"㴳";s:4:"滋";s:3:"滋";s:4:"滇";s:3:"滇";s:4:"𣻑";s:4:"𣻑";s:4:"淹";s:3:"淹";s:4:"潮";s:3:"潮";s:4:"𣽞";s:4:"𣽞";s:4:"𣾎";s:4:"𣾎";s:4:"濆";s:3:"濆";s:4:"瀹";s:3:"瀹";s:4:"瀞";s:3:"瀞";s:4:"瀛";s:3:"瀛";s:4:"㶖";s:3:"㶖";s:4:"灊";s:3:"灊";s:4:"災";s:3:"災";s:4:"灷";s:3:"灷";s:4:"炭";s:3:"炭";s:4:"𠔥";s:4:"𠔥";s:4:"煅";s:3:"煅";s:4:"𤉣";s:4:"𤉣";s:4:"熜";s:3:"熜";s:4:"𤎫";s:4:"𤎫";s:4:"爨";s:3:"爨";s:4:"爵";s:3:"爵";s:4:"牐";s:3:"牐";s:4:"𤘈";s:4:"𤘈";s:4:"犀";s:3:"犀";s:4:"犕";s:3:"犕";s:4:"𤜵";s:4:"𤜵";s:4:"𤠔";s:4:"𤠔";s:4:"獺";s:3:"獺";s:4:"王";s:3:"王";s:4:"㺬";s:3:"㺬";s:4:"玥";s:3:"玥";s:4:"㺸";s:3:"㺸";s:4:"㺸";s:3:"㺸";s:4:"瑇";s:3:"瑇";s:4:"瑜";s:3:"瑜";s:4:"瑱";s:3:"瑱";s:4:"璅";s:3:"璅";s:4:"瓊";s:3:"瓊";s:4:"㼛";s:3:"㼛";s:4:"甤";s:3:"甤";s:4:"𤰶";s:4:"𤰶";s:4:"甾";s:3:"甾";s:4:"𤲒";s:4:"𤲒";s:4:"異";s:3:"異";s:4:"𢆟";s:4:"𢆟";s:4:"瘐";s:3:"瘐";s:4:"𤾡";s:4:"𤾡";s:4:"𤾸";s:4:"𤾸";s:4:"𥁄";s:4:"𥁄";s:4:"㿼";s:3:"㿼";s:4:"䀈";s:3:"䀈";s:4:"直";s:3:"直";s:4:"𥃳";s:4:"𥃳";s:4:"𥃲";s:4:"𥃲";s:4:"𥄙";s:4:"𥄙";s:4:"𥄳";s:4:"𥄳";s:4:"眞";s:3:"眞";s:4:"真";s:3:"真";s:4:"真";s:3:"真";s:4:"睊";s:3:"睊";s:4:"䀹";s:3:"䀹";s:4:"瞋";s:3:"瞋";s:4:"䁆";s:3:"䁆";s:4:"䂖";s:3:"䂖";s:4:"𥐝";s:4:"𥐝";s:4:"硎";s:3:"硎";s:4:"碌";s:3:"碌";s:4:"磌";s:3:"磌";s:4:"䃣";s:3:"䃣";s:4:"𥘦";s:4:"𥘦";s:4:"祖";s:3:"祖";s:4:"𥚚";s:4:"𥚚";s:4:"𥛅";s:4:"𥛅";s:4:"福";s:3:"福";s:4:"秫";s:3:"秫";s:4:"䄯";s:3:"䄯";s:4:"穀";s:3:"穀";s:4:"穊";s:3:"穊";s:4:"穏";s:3:"穏";s:4:"𥥼";s:4:"𥥼";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"𥪧";s:4:"竮";s:3:"竮";s:4:"䈂";s:3:"䈂";s:4:"𥮫";s:4:"𥮫";s:4:"篆";s:3:"篆";s:4:"築";s:3:"築";s:4:"䈧";s:3:"䈧";s:4:"𥲀";s:4:"𥲀";s:4:"糒";s:3:"糒";s:4:"䊠";s:3:"䊠";s:4:"糨";s:3:"糨";s:4:"糣";s:3:"糣";s:4:"紀";s:3:"紀";s:4:"𥾆";s:4:"𥾆";s:4:"絣";s:3:"絣";s:4:"䌁";s:3:"䌁";s:4:"緇";s:3:"緇";s:4:"縂";s:3:"縂";s:4:"繅";s:3:"繅";s:4:"䌴";s:3:"䌴";s:4:"𦈨";s:4:"𦈨";s:4:"𦉇";s:4:"𦉇";s:4:"䍙";s:3:"䍙";s:4:"𦋙";s:4:"𦋙";s:4:"罺";s:3:"罺";s:4:"𦌾";s:4:"𦌾";s:4:"羕";s:3:"羕";s:4:"翺";s:3:"翺";s:4:"者";s:3:"者";s:4:"𦓚";s:4:"𦓚";s:4:"𦔣";s:4:"𦔣";s:4:"聠";s:3:"聠";s:4:"𦖨";s:4:"𦖨";s:4:"聰";s:3:"聰";s:4:"𣍟";s:4:"𣍟";s:4:"䏕";s:3:"䏕";s:4:"育";s:3:"育";s:4:"脃";s:3:"脃";s:4:"䐋";s:3:"䐋";s:4:"脾";s:3:"脾";s:4:"媵";s:3:"媵";s:4:"𦞧";s:4:"𦞧";s:4:"𦞵";s:4:"𦞵";s:4:"𣎓";s:4:"𣎓";s:4:"𣎜";s:4:"𣎜";s:4:"舁";s:3:"舁";s:4:"舄";s:3:"舄";s:4:"辞";s:3:"辞";s:4:"䑫";s:3:"䑫";s:4:"芑";s:3:"芑";s:4:"芋";s:3:"芋";s:4:"芝";s:3:"芝";s:4:"劳";s:3:"劳";s:4:"花";s:3:"花";s:4:"芳";s:3:"芳";s:4:"芽";s:3:"芽";s:4:"苦";s:3:"苦";s:4:"𦬼";s:4:"𦬼";s:4:"若";s:3:"若";s:4:"茝";s:3:"茝";s:4:"荣";s:3:"荣";s:4:"莭";s:3:"莭";s:4:"茣";s:3:"茣";s:4:"莽";s:3:"莽";s:4:"菧";s:3:"菧";s:4:"著";s:3:"著";s:4:"荓";s:3:"荓";s:4:"菊";s:3:"菊";s:4:"菌";s:3:"菌";s:4:"菜";s:3:"菜";s:4:"𦰶";s:4:"𦰶";s:4:"𦵫";s:4:"𦵫";s:4:"𦳕";s:4:"𦳕";s:4:"䔫";s:3:"䔫";s:4:"蓱";s:3:"蓱";s:4:"蓳";s:3:"蓳";s:4:"蔖";s:3:"蔖";s:4:"𧏊";s:4:"𧏊";s:4:"蕤";s:3:"蕤";s:4:"𦼬";s:4:"𦼬";s:4:"䕝";s:3:"䕝";s:4:"䕡";s:3:"䕡";s:4:"𦾱";s:4:"𦾱";s:4:"𧃒";s:4:"𧃒";s:4:"䕫";s:3:"䕫";s:4:"虐";s:3:"虐";s:4:"虜";s:3:"虜";s:4:"虧";s:3:"虧";s:4:"虩";s:3:"虩";s:4:"蚩";s:3:"蚩";s:4:"蚈";s:3:"蚈";s:4:"蜎";s:3:"蜎";s:4:"蛢";s:3:"蛢";s:4:"蝹";s:3:"蝹";s:4:"蜨";s:3:"蜨";s:4:"蝫";s:3:"蝫";s:4:"螆";s:3:"螆";s:4:"䗗";s:3:"䗗";s:4:"蟡";s:3:"蟡";s:4:"蠁";s:3:"蠁";s:4:"䗹";s:3:"䗹";s:4:"衠";s:3:"衠";s:4:"衣";s:3:"衣";s:4:"𧙧";s:4:"𧙧";s:4:"裗";s:3:"裗";s:4:"裞";s:3:"裞";s:4:"䘵";s:3:"䘵";s:4:"裺";s:3:"裺";s:4:"㒻";s:3:"㒻";s:4:"𧢮";s:4:"𧢮";s:4:"𧥦";s:4:"𧥦";s:4:"䚾";s:3:"䚾";s:4:"䛇";s:3:"䛇";s:4:"誠";s:3:"誠";s:4:"諭";s:3:"諭";s:4:"變";s:3:"變";s:4:"豕";s:3:"豕";s:4:"𧲨";s:4:"𧲨";s:4:"貫";s:3:"貫";s:4:"賁";s:3:"賁";s:4:"贛";s:3:"贛";s:4:"起";s:3:"起";s:4:"𧼯";s:4:"𧼯";s:4:"𠠄";s:4:"𠠄";s:4:"跋";s:3:"跋";s:4:"趼";s:3:"趼";s:4:"跰";s:3:"跰";s:4:"𠣞";s:4:"𠣞";s:4:"軔";s:3:"軔";s:4:"輸";s:3:"輸";s:4:"𨗒";s:4:"𨗒";s:4:"𨗭";s:4:"𨗭";s:4:"邔";s:3:"邔";s:4:"郱";s:3:"郱";s:4:"鄑";s:3:"鄑";s:4:"𨜮";s:4:"𨜮";s:4:"鄛";s:3:"鄛";s:4:"鈸";s:3:"鈸";s:4:"鋗";s:3:"鋗";s:4:"鋘";s:3:"鋘";s:4:"鉼";s:3:"鉼";s:4:"鏹";s:3:"鏹";s:4:"鐕";s:3:"鐕";s:4:"𨯺";s:4:"𨯺";s:4:"開";s:3:"開";s:4:"䦕";s:3:"䦕";s:4:"閷";s:3:"閷";s:4:"𨵷";s:4:"𨵷";s:4:"䧦";s:3:"䧦";s:4:"雃";s:3:"雃";s:4:"嶲";s:3:"嶲";s:4:"霣";s:3:"霣";s:4:"𩅅";s:4:"𩅅";s:4:"𩈚";s:4:"𩈚";s:4:"䩮";s:3:"䩮";s:4:"䩶";s:3:"䩶";s:4:"韠";s:3:"韠";s:4:"𩐊";s:4:"𩐊";s:4:"䪲";s:3:"䪲";s:4:"𩒖";s:4:"𩒖";s:4:"頋";s:3:"頋";s:4:"頋";s:3:"頋";s:4:"頩";s:3:"頩";s:4:"𩖶";s:4:"𩖶";s:4:"飢";s:3:"飢";s:4:"䬳";s:3:"䬳";s:4:"餩";s:3:"餩";s:4:"馧";s:3:"馧";s:4:"駂";s:3:"駂";s:4:"駾";s:3:"駾";s:4:"䯎";s:3:"䯎";s:4:"𩬰";s:4:"𩬰";s:4:"鬒";s:3:"鬒";s:4:"鱀";s:3:"鱀";s:4:"鳽";s:3:"鳽";s:4:"䳎";s:3:"䳎";s:4:"䳭";s:3:"䳭";s:4:"鵧";s:3:"鵧";s:4:"𪃎";s:4:"𪃎";s:4:"䳸";s:3:"䳸";s:4:"𪄅";s:4:"𪄅";s:4:"𪈎";s:4:"𪈎";s:4:"𪊑";s:4:"𪊑";s:4:"麻";s:3:"麻";s:4:"䵖";s:3:"䵖";s:4:"黹";s:3:"黹";s:4:"黾";s:3:"黾";s:4:"鼅";s:3:"鼅";s:4:"鼏";s:3:"鼏";s:4:"鼖";s:3:"鼖";s:4:"鼻";s:3:"鼻";s:4:"𪘀";s:4:"𪘀";}' );
 
index b07e339..18d89f6 100644 (file)
@@ -46,7 +46,6 @@ define( 'UNICODE_SURROGATE_LAST', 0xdfff );
 define( 'UNICODE_MAX', 0x10ffff );
 define( 'UNICODE_REPLACEMENT', 0xfffd );
 
-
 define( 'UTF8_HANGUL_FIRST', "\xea\xb0\x80" /*codepointToUtf8( UNICODE_HANGUL_FIRST )*/ );
 define( 'UTF8_HANGUL_LAST', "\xed\x9e\xa3" /*codepointToUtf8( UNICODE_HANGUL_LAST )*/ );
 
index 676f8f7..f57aa6c 100644 (file)
  * @ingroup UtfNormal
  */
 
-if( PHP_SAPI != 'cli' ) {
+if ( PHP_SAPI != 'cli' ) {
        die( "Run me from the command line please.\n" );
 }
 
 require_once 'UtfNormalDefines.php';
 require_once 'UtfNormalUtil.php';
 
-$in = fopen("DerivedNormalizationProps.txt", "rt" );
-if( !$in ) {
+$in = fopen( "DerivedNormalizationProps.txt", "rt" );
+if ( !$in ) {
        print "Can't open DerivedNormalizationProps.txt for reading.\n";
        print "If necessary, fetch this file from the internet:\n";
        print "http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt\n";
-       exit(-1);
+       exit( -1 );
 }
 print "Initializing normalization quick check tables...\n";
 $checkNFC = array();
-while( false !== ($line = fgets( $in ) ) ) {
+while ( false !== ( $line = fgets( $in ) ) ) {
        $matches = array();
-       if( preg_match( '/^([0-9A-F]+)(?:..([0-9A-F]+))?\s*;\s*(NFC_QC)\s*;\s*([MN])/', $line, $matches ) ) {
+       if ( preg_match(
+               '/^([0-9A-F]+)(?:..([0-9A-F]+))?\s*;\s*(NFC_QC)\s*;\s*([MN])/',
+               $line,
+               $matches )
+       ) {
                list( $junk, $first, $last, $prop, $value ) = $matches;
                #print "$first $last $prop $value\n";
-               if( !$last ) $last = $first;
-               for( $i = hexdec( $first ); $i <= hexdec( $last ); $i++) {
+               if ( !$last ) {
+                       $last = $first;
+               }
+
+               $lastInDecimal = hexdec( $last );
+               for ( $i = hexdec( $first ); $i <= $lastInDecimal; $i++ ) {
                        $char = codepointToUtf8( $i );
                        $checkNFC[$char] = $value;
                }
@@ -55,29 +63,29 @@ while( false !== ($line = fgets( $in ) ) ) {
 }
 fclose( $in );
 
-$in = fopen("CompositionExclusions.txt", "rt" );
-if( !$in ) {
+$in = fopen( "CompositionExclusions.txt", "rt" );
+if ( !$in ) {
        print "Can't open CompositionExclusions.txt for reading.\n";
        print "If necessary, fetch this file from the internet:\n";
        print "http://www.unicode.org/Public/UNIDATA/CompositionExclusions.txt\n";
-       exit(-1);
+       exit( -1 );
 }
 $exclude = array();
-while( false !== ($line = fgets( $in ) ) ) {
-       if( preg_match( '/^([0-9A-F]+)/i', $line, $matches ) ) {
+while ( false !== ( $line = fgets( $in ) ) ) {
+       if ( preg_match( '/^([0-9A-F]+)/i', $line, $matches ) ) {
                $codepoint = $matches[1];
                $source = codepointToUtf8( hexdec( $codepoint ) );
                $exclude[$source] = true;
        }
 }
-fclose($in);
+fclose( $in );
 
-$in = fopen("UnicodeData.txt", "rt" );
-if( !$in ) {
+$in = fopen( "UnicodeData.txt", "rt" );
+if ( !$in ) {
        print "Can't open UnicodeData.txt for reading.\n";
        print "If necessary, fetch this file from the internet:\n";
        print "http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\n";
-       exit(-1);
+       exit( -1 );
 }
 
 $compatibilityDecomp = array();
@@ -89,8 +97,8 @@ $compat = 0;
 $canon = 0;
 
 print "Reading character definitions...\n";
-while( false !== ($line = fgets( $in ) ) ) {
-       $columns = explode(';', $line);
+while ( false !== ( $line = fgets( $in ) ) ) {
+       $columns = explode( ';', $line );
        $codepoint = $columns[0];
        $name = $columns[1];
        $canonicalCombiningClass = $columns[3];
@@ -98,12 +106,12 @@ while( false !== ($line = fgets( $in ) ) ) {
 
        $source = codepointToUtf8( hexdec( $codepoint ) );
 
-       if( $canonicalCombiningClass != 0 ) {
+       if ( $canonicalCombiningClass != 0 ) {
                $combiningClass[$source] = intval( $canonicalCombiningClass );
        }
 
-       if( $decompositionMapping === '' ) continue;
-       if( preg_match( '/^<(.+)> (.*)$/', $decompositionMapping, $matches ) ) {
+       if ( $decompositionMapping === '' ) continue;
+       if ( preg_match( '/^<(.+)> (.*)$/', $decompositionMapping, $matches ) ) {
                # Compatibility decomposition
                $canonical = false;
                $decompositionMapping = $matches[2];
@@ -116,9 +124,9 @@ while( false !== ($line = fgets( $in ) ) ) {
        $dest = hexSequenceToUtf8( $decompositionMapping );
 
        $compatibilityDecomp[$source] = $dest;
-       if( $canonical ) {
+       if ( $canonical ) {
                $canonicalDecomp[$source] = $dest;
-               if( empty( $exclude[$source] ) ) {
+               if ( empty( $exclude[$source] ) ) {
                        $canonicalComp[$dest] = $source;
                }
        }
@@ -129,15 +137,15 @@ fclose( $in );
 print "Recursively expanding canonical mappings...\n";
 $changed = 42;
 $pass = 1;
-while( $changed > 0 ) {
+while ( $changed > 0 ) {
        print "pass $pass\n";
        $changed = 0;
-       foreach( $canonicalDecomp as $source => $dest ) {
+       foreach ( $canonicalDecomp as $source => $dest ) {
                $newDest = preg_replace_callback(
                        '/([\xc0-\xff][\x80-\xbf]+)/',
                        'callbackCanonical',
-                       $dest);
-               if( $newDest === $dest ) continue;
+                       $dest );
+               if ( $newDest === $dest ) continue;
                $changed++;
                $canonicalDecomp[$source] = $newDest;
        }
@@ -147,15 +155,15 @@ while( $changed > 0 ) {
 print "Recursively expanding compatibility mappings...\n";
 $changed = 42;
 $pass = 1;
-while( $changed > 0 ) {
+while ( $changed > 0 ) {
        print "pass $pass\n";
        $changed = 0;
-       foreach( $compatibilityDecomp as $source => $dest ) {
+       foreach ( $compatibilityDecomp as $source => $dest ) {
                $newDest = preg_replace_callback(
                        '/([\xc0-\xff][\x80-\xbf]+)/',
                        'callbackCompat',
-                       $dest);
-               if( $newDest === $dest ) continue;
+                       $dest );
+               if ( $newDest === $dest ) continue;
                $changed++;
                $compatibilityDecomp[$source] = $newDest;
        }
@@ -164,8 +172,8 @@ while( $changed > 0 ) {
 
 print "$total decomposition mappings ($canon canonical, $compat compatibility)\n";
 
-$out = fopen("UtfNormalData.inc", "wt");
-if( $out ) {
+$out = fopen( "UtfNormalData.inc", "wt" );
+if ( $out ) {
        $serCombining = escapeSingleString( serialize( $combiningClass ) );
        $serComp = escapeSingleString( serialize( $canonicalComp ) );
        $serCanon = escapeSingleString( serialize( $canonicalDecomp ) );
@@ -177,6 +185,7 @@ if( $out ) {
  *
  * @file
  */
+// @codingStandardsIgnoreFile
 
 UtfNormal::\$utfCombiningClass = unserialize( '$serCombining' );
 UtfNormal::\$utfCanonicalComp = unserialize( '$serComp' );
@@ -188,12 +197,11 @@ UtfNormal::\$utfCheckNFC = unserialize( '$serCheckNFC' );
        print "Wrote out UtfNormalData.inc\n";
 } else {
        print "Can't create file UtfNormalData.inc\n";
-       exit(-1);
+       exit( -1 );
 }
 
-
-$out = fopen("UtfNormalDataK.inc", "wt");
-if( $out ) {
+$out = fopen( "UtfNormalDataK.inc", "wt" );
+if ( $out ) {
        $serCompat = escapeSingleString( serialize( $compatibilityDecomp ) );
        $outdata = "<" . "?php
 /**
@@ -202,32 +210,41 @@ if( $out ) {
  *
  * @file
  */
+// @codingStandardsIgnoreFile
 
 UtfNormal::\$utfCompatibilityDecomp = unserialize( '$serCompat' );
 \n";
        fputs( $out, $outdata );
        fclose( $out );
        print "Wrote out UtfNormalDataK.inc\n";
-       exit(0);
+       exit( 0 );
 } else {
        print "Can't create file UtfNormalDataK.inc\n";
-       exit(-1);
+       exit( -1 );
 }
 
 # ---------------
 
 function callbackCanonical( $matches ) {
+       // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
        global $canonicalDecomp;
-       if( isset( $canonicalDecomp[$matches[1]] ) ) {
+       // @codingStandardsIgnoreEnd
+
+       if ( isset( $canonicalDecomp[$matches[1]] ) ) {
                return $canonicalDecomp[$matches[1]];
        }
+
        return $matches[1];
 }
 
 function callbackCompat( $matches ) {
+       // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
        global $compatibilityDecomp;
-       if( isset( $compatibilityDecomp[$matches[1]] ) ) {
+       // @codingStandardsIgnoreEnd
+
+       if ( isset( $compatibilityDecomp[$matches[1]] ) ) {
                return $compatibilityDecomp[$matches[1]];
        }
+
        return $matches[1];
 }
index 9ae6f23..14abf93 100644 (file)
  * @ingroup UtfNormal
  */
 
-if( PHP_SAPI != 'cli' ) {
+if ( PHP_SAPI != 'cli' ) {
        die( "Run me from the command line please.\n" );
 }
 
-if( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
+if ( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
        dl( 'php_utfnormal.so' );
 }
 
@@ -39,8 +39,8 @@ require_once 'UtfNormalUtil.php';
 require_once 'UtfNormal.php';
 
 define( 'BENCH_CYCLES', 1 );
-define( 'BIGSIZE', 1024 * 1024 * 10); // 10m
-ini_set('memory_limit', BIGSIZE + 120 * 1024 * 1024);
+define( 'BIGSIZE', 1024 * 1024 * 10 ); // 10m
+ini_set( 'memory_limit', BIGSIZE + 120 * 1024 * 1024 );
 
 $testfiles = array(
        'testdata/washington.txt' => 'English text',
@@ -51,7 +51,7 @@ $testfiles = array(
 );
 $normalizer = new UtfNormal;
 UtfNormal::loadData();
-foreach( $testfiles as $file => $desc ) {
+foreach ( $testfiles as $file => $desc ) {
        benchmarkTest( $normalizer, $file, $desc );
 }
 
@@ -61,19 +61,20 @@ function benchmarkTest( &$u, $filename, $desc ) {
        print "Testing $filename ($desc)...\n";
        $data = file_get_contents( $filename );
        $all = $data;
-       while (strlen($all) < BIGSIZE) {
+       while ( strlen( $all ) < BIGSIZE ) {
                $all .= $all;
        }
        $data = $all;
-       echo "Data is " . strlen($data) . " bytes.\n";
+       echo "Data is " . strlen( $data ) . " bytes.\n";
        $forms = array(
-        'quickIsNFCVerify',
+               'quickIsNFCVerify',
                'cleanUp',
-               );
-       foreach( $forms as $form ) {
-               if( is_array( $form ) ) {
+       );
+
+       foreach ( $forms as $form ) {
+               if ( is_array( $form ) ) {
                        $str = $data;
-                       foreach( $form as $step ) {
+                       foreach ( $form as $step ) {
                                $str = benchmarkForm( $u, $str, $step );
                        }
                } else {
@@ -84,27 +85,29 @@ function benchmarkTest( &$u, $filename, $desc ) {
 
 function benchTime() {
        $st = explode( ' ', microtime() );
+
        return (float)$st[0] + (float)$st[1];
 }
 
 function benchmarkForm( &$u, &$data, $form ) {
        #$start = benchTime();
-       for( $i = 0; $i < BENCH_CYCLES; $i++ ) {
+       for ( $i = 0; $i < BENCH_CYCLES; $i++ ) {
                $start = benchTime();
                $out = $u->$form( $data, UtfNormal::$utfCanonicalDecomp );
-               $deltas[] = (benchTime() - $start);
+               $deltas[] = ( benchTime() - $start );
        }
        #$delta = (benchTime() - $start) / BENCH_CYCLES;
        sort( $deltas );
        $delta = $deltas[0]; # Take shortest time
 
        $rate = intval( strlen( $data ) / $delta );
-       $same = (0 == strcmp( $data, $out ) );
+       $same = ( 0 == strcmp( $data, $out ) );
 
        printf( " %20s %6.1fms %12s bytes/s (%s)\n",
                $form,
-               $delta*1000.0,
+               $delta * 1000.0,
                number_format( $rate ),
-               ($same ? 'no change' : 'changed' ) );
+               ( $same ? 'no change' : 'changed' ) );
+
        return $out;
 }
index 7be5251..10cd0f0 100644 (file)
  * @ingroup UtfNormal
  */
 
-if( PHP_SAPI != 'cli' ) {
+if ( PHP_SAPI != 'cli' ) {
        die( "Run me from the command line please.\n" );
 }
 
 $verbose = true;
 #define( 'PRETTY_UTF8', true );
 
-if( defined( 'PRETTY_UTF8' ) ) {
+if ( defined( 'PRETTY_UTF8' ) ) {
        function pretty( $string ) {
                return strtoupper( bin2hex( $string ) );
        }
@@ -47,7 +47,7 @@ if( defined( 'PRETTY_UTF8' ) ) {
        }
 }
 
-if( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
+if ( isset( $_SERVER['argv'] ) && in_array( '--icu', $_SERVER['argv'] ) ) {
        dl( 'php_utfnormal.so' );
 }
 
@@ -55,12 +55,12 @@ require_once 'UtfNormalDefines.php';
 require_once 'UtfNormalUtil.php';
 require_once 'UtfNormal.php';
 
-$in = fopen("NormalizationTest.txt", "rt");
-if( !$in ) {
+$in = fopen( "NormalizationTest.txt", "rt" );
+if ( !$in ) {
        print "Couldn't open NormalizationTest.txt -- can't run tests.\n";
        print "If necessary, manually download this file. It can be obtained at\n";
        print "http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt";
-       exit(-1);
+       exit( -1 );
 }
 
 $normalizer = new UtfNormal;
@@ -70,12 +70,13 @@ $success = 0;
 $failure = 0;
 $ok = true;
 $testedChars = array();
-while( false !== ( $line = fgets( $in ) ) ) {
+
+while ( false !== ( $line = fgets( $in ) ) ) {
        list( $data, $comment ) = explode( '#', $line );
-       if( $data === '' ) continue;
+       if ( $data === '' ) continue;
        $matches = array();
-       if( preg_match( '/@Part([\d])/', $data, $matches ) ) {
-               if( $matches[1] > 0 ) {
+       if ( preg_match( '/@Part([\d])/', $data, $matches ) ) {
+               if ( $matches[1] > 0 ) {
                        $ok = reportResults( $total, $success, $failure ) && $ok;
                }
                print "Part {$matches[1]}: $comment";
@@ -87,56 +88,57 @@ while( false !== ( $line = fgets( $in ) ) ) {
 
        $testedChars[$columns[1]] = true;
        $total++;
-       if( testNormals( $normalizer, $columns, $comment, $verbose ) ) {
+       if ( testNormals( $normalizer, $columns, $comment, $verbose ) ) {
                $success++;
        } else {
                $failure++;
                # print "FAILED: $comment";
        }
-       if( $total % 100 == 0 ) print "$total ";
+       if ( $total % 100 == 0 ) print "$total ";
 }
 fclose( $in );
 
 $ok = reportResults( $total, $success, $failure ) && $ok;
 
-$in = fopen("UnicodeData.txt", "rt" );
-if( !$in ) {
+$in = fopen( "UnicodeData.txt", "rt" );
+if ( !$in ) {
        print "Can't open UnicodeData.txt for reading.\n";
        print "If necessary, fetch this file from the internet:\n";
        print "http://www.unicode.org/Public/UNIDATA/UnicodeData.txt\n";
-       exit(-1);
+       exit( -1 );
 }
 print "Now testing invariants...\n";
-while( false !== ($line = fgets( $in ) ) ) {
+
+while ( false !== ( $line = fgets( $in ) ) ) {
        $cols = explode( ';', $line );
        $char = codepointToUtf8( hexdec( $cols[0] ) );
        $desc = $cols[0] . ": " . $cols[1];
-       if( $char < "\x20" || $char >= UTF8_SURROGATE_FIRST && $char <= UTF8_SURROGATE_LAST ) {
+       if ( $char < "\x20" || $char >= UTF8_SURROGATE_FIRST && $char <= UTF8_SURROGATE_LAST ) {
                # Can't check NULL with the ICU plugin, as null bytes fail in C land.
                # Skip other control characters, as we strip them for XML safety.
                # Surrogates are illegal on their own or in UTF-8, ignore.
                continue;
        }
-       if( empty( $testedChars[$char] ) ) {
+       if ( empty( $testedChars[$char] ) ) {
                $total++;
-               if( testInvariant( $normalizer, $char, $desc, $verbose ) ) {
+               if ( testInvariant( $normalizer, $char, $desc, $verbose ) ) {
                        $success++;
                } else {
                        $failure++;
                }
-               if( $total % 100 == 0 ) print "$total ";
+               if ( $total % 100 == 0 ) print "$total ";
        }
 }
 fclose( $in );
 
 $ok = reportResults( $total, $success, $failure ) && $ok;
 
-if( $ok ) {
+if ( $ok ) {
        print "TEST SUCCEEDED!\n";
-       exit(0);
+       exit( 0 );
 } else {
        print "TEST FAILED!\n";
-       exit(-1);
+       exit( -1 );
 }
 
 ## ------
@@ -147,10 +149,11 @@ function reportResults( &$total, &$success, &$failure ) {
        print "\n";
        print "$success tests successful ($percSucc%)\n";
        print "$failure tests failed ($percFail%)\n\n";
-       $ok = ($success > 0 && $failure == 0);
+       $ok = ( $success > 0 && $failure == 0 );
        $total = 0;
        $success = 0;
        $failure = 0;
+
        return $ok;
 }
 
@@ -161,23 +164,25 @@ function testNormals( &$u, $c, $comment, $verbose, $reportFailure = false ) {
        $result = testNFKD( $u, $c, $comment, $reportFailure ) && $result;
        $result = testCleanUp( $u, $c, $comment, $reportFailure ) && $result;
 
-       if( $verbose && !$result && !$reportFailure ) {
+       if ( $verbose && !$result && !$reportFailure ) {
                print $comment;
                testNormals( $u, $c, $comment, $verbose, true );
        }
+
        return $result;
 }
 
 function verbosify( $a, $b, $col, $form, $verbose ) {
        #$result = ($a === $b);
-       $result = (strcmp( $a, $b ) == 0);
-       if( $verbose ) {
+       $result = ( strcmp( $a, $b ) == 0 );
+       if ( $verbose ) {
                $aa = pretty( $a );
                $bb = pretty( $b );
                $ok = $result ? "succeed" : " failed";
                $eq = $result ? "==" : "!=";
                print "  $ok $form c$col '$aa' $eq '$bb'\n";
        }
+
        return $result;
 }
 
@@ -187,6 +192,7 @@ function testNFC( &$u, $c, $comment, $verbose ) {
        $result = verbosify( $c[2], $u->toNFC( $c[3] ), 3, 'NFC', $verbose ) && $result;
        $result = verbosify( $c[4], $u->toNFC( $c[4] ), 4, 'NFC', $verbose ) && $result;
        $result = verbosify( $c[4], $u->toNFC( $c[5] ), 5, 'NFC', $verbose ) && $result;
+
        return $result;
 }
 
@@ -201,6 +207,7 @@ function testCleanUp( &$u, $c, $comment, $verbose ) {
        $result = verbosify( $c[4], $u->cleanUp( $x ), 4, 'cleanUp', $verbose ) && $result;
        $x = $c[5];
        $result = verbosify( $c[4], $u->cleanUp( $x ), 5, 'cleanUp', $verbose ) && $result;
+
        return $result;
 }
 
@@ -210,6 +217,7 @@ function testNFD( &$u, $c, $comment, $verbose ) {
        $result = verbosify( $c[3], $u->toNFD( $c[3] ), 3, 'NFD', $verbose ) && $result;
        $result = verbosify( $c[5], $u->toNFD( $c[4] ), 4, 'NFD', $verbose ) && $result;
        $result = verbosify( $c[5], $u->toNFD( $c[5] ), 5, 'NFD', $verbose ) && $result;
+
        return $result;
 }
 
@@ -219,6 +227,7 @@ function testNFKC( &$u, $c, $comment, $verbose ) {
        $result = verbosify( $c[4], $u->toNFKC( $c[3] ), 3, 'NFKC', $verbose ) && $result;
        $result = verbosify( $c[4], $u->toNFKC( $c[4] ), 4, 'NFKC', $verbose ) && $result;
        $result = verbosify( $c[4], $u->toNFKC( $c[5] ), 5, 'NFKC', $verbose ) && $result;
+
        return $result;
 }
 
@@ -228,6 +237,7 @@ function testNFKD( &$u, $c, $comment, $verbose ) {
        $result = verbosify( $c[5], $u->toNFKD( $c[3] ), 3, 'NFKD', $verbose ) && $result;
        $result = verbosify( $c[5], $u->toNFKD( $c[4] ), 4, 'NFKD', $verbose ) && $result;
        $result = verbosify( $c[5], $u->toNFKD( $c[5] ), 5, 'NFKD', $verbose ) && $result;
+
        return $result;
 }
 
@@ -238,9 +248,10 @@ function testInvariant( &$u, $char, $desc, $verbose, $reportFailure = false ) {
        $result = verbosify( $char, $u->toNFKD( $char ), 1, 'NFKD', $reportFailure ) && $result;
        $result = verbosify( $char, $u->cleanUp( $char ), 1, 'cleanUp', $reportFailure ) && $result;
 
-       if( $verbose && !$result && !$reportFailure ) {
+       if ( $verbose && !$result && !$reportFailure ) {
                print $desc;
                testInvariant( $u, $char, $desc, $verbose, true );
        }
+
        return $result;
 }
index 750c009..53e68c2 100644 (file)
@@ -22,7 +22,7 @@
  * @ingroup UtfNormal
  */
 
-if( PHP_SAPI != 'cli' ) {
+if ( PHP_SAPI != 'cli' ) {
        die( "Run me from the command line please.\n" );
 }
 
@@ -35,41 +35,47 @@ define ( 'COMMENT', '#' );
 // Semicolons are used to separate the columns
 define ( 'SEPARATOR', ';' );
 
-$f = fopen($file, "r");
+$f = fopen( $file, "r" );
 
 /**
  * The following section will be used for testing different normalization methods.
  * - Pure PHP
-     ~ no assertion errors
-     ~ 6.25 minutes
-
+ * ~ no assertion errors
+ * ~ 6.25 minutes
  * - php_utfnormal.so or intl extension: both are wrappers around
-     libicu so we list the version of libicu when making the
-     comparison
-
+ * libicu so we list the version of libicu when making the
+ * comparison
  * - libicu Ubuntu 3.8.1-3ubuntu1.1 php 5.2.6-3ubuntu4.5
-     ~ 2200 assertion errors
-     ~ 5 seconds
-        ~ output: http://paste2.org/p/921566
-
+ * ~ 2200 assertion errors
+ * ~ 5 seconds
+ * ~ output: http://paste2.org/p/921566
  * - libicu Ubuntu 4.2.1-3 php 5.3.2-1ubuntu4.2
-     ~ 1384 assertion errors
-        ~ 15 seconds
-        ~ output: http://paste2.org/p/921435
-
+ * ~ 1384 assertion errors
+ * ~ 15 seconds
+ * ~ output: http://paste2.org/p/921435
  * - libicu Debian 4.4.1-5 php 5.3.2-1ubuntu4.2
-     ~ no assertion errors
-        ~ 13 seconds
-
+ * ~ no assertion errors
+ * ~ 13 seconds
  * - Tests comparing pure PHP output with libicu output were added
    later and slow down the runtime.
* later and slow down the runtime.
  */
 
 require_once './UtfNormal.php';
-function normalize_form_c($c)      { return UtfNormal::toNFC($c);  }
-function normalize_form_d($c)      { return UtfNormal::toNFD($c);  }
-function normalize_form_kc($c)     { return UtfNormal::toNFKC($c); }
-function normalize_form_kd($c)     { return UtfNormal::toNFKD($c); }
+function normalize_form_c( $c ) {
+       return UtfNormal::toNFC( $c );
+}
+
+function normalize_form_d( $c ) {
+       return UtfNormal::toNFD( $c );
+}
+
+function normalize_form_kc( $c ) {
+       return UtfNormal::toNFKC( $c );
+}
+
+function normalize_form_kd( $c ) {
+       return UtfNormal::toNFKD( $c );
+}
 
 /**
  * This set of functions is only useful if youve added a param to the
@@ -78,175 +84,189 @@ function normalize_form_kd($c)     { return UtfNormal::toNFKD($c); }
  * normalization code just for the sake of these tests. -- hexmode
  * @return string
  */
-function normalize_form_c_php($c)  { return UtfNormal::toNFC($c, "php");  }
-function normalize_form_d_php($c)  { return UtfNormal::toNFD($c, "php");  }
-function normalize_form_kc_php($c) { return UtfNormal::toNFKC($c, "php"); }
-function normalize_form_kd_php($c) { return UtfNormal::toNFKD($c, "php"); }
+function normalize_form_c_php( $c ) {
+       return UtfNormal::toNFC( $c, "php" );
+}
+
+function normalize_form_d_php( $c ) {
+       return UtfNormal::toNFD( $c, "php" );
+}
 
-assert_options(ASSERT_ACTIVE, 1);
-assert_options(ASSERT_WARNING, 0);
-assert_options(ASSERT_QUIET_EVAL, 1);
-assert_options(ASSERT_CALLBACK, 'my_assert');
+function normalize_form_kc_php( $c ) {
+       return UtfNormal::toNFKC( $c, "php" );
+}
+
+function normalize_form_kd_php( $c ) {
+       return UtfNormal::toNFKD( $c, "php" );
+}
+
+assert_options( ASSERT_ACTIVE, 1 );
+assert_options( ASSERT_WARNING, 0 );
+assert_options( ASSERT_QUIET_EVAL, 1 );
+assert_options( ASSERT_CALLBACK, 'my_assert' );
 
 function my_assert( $file, $line, $code ) {
+       // @codingStandardsIgnoreStart MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
        global $col, $lineNo;
+       // @codingStandardsIgnoreEnd
+
        echo "Assertion that '$code' failed on line $lineNo ($col[5])\n";
 }
 
 $count = 0;
 $lineNo = 0;
-if( $f !== false ) {
-       while( ( $col = getRow( $f ) ) !== false ) {
+if ( $f !== false ) {
+       while ( ( $col = getRow( $f ) ) !== false ) {
                $lineNo++;
 
-               if(count($col) == 6) {
+               if ( count( $col ) == 6 ) {
                        $count++;
-                       if( $count % 100 === 0 ) echo "Count: $count\n";
+                       if ( $count % 100 === 0 ) echo "Count: $count\n";
                } else {
                        continue;
                }
 
                # verify that the pure PHP version is correct
-               $NFCc1  = normalize_form_c($col[0]);
-               $NFCc1p = normalize_form_c_php($col[0]);
-               assert('$NFCc1 === $NFCc1p');
-               $NFCc2  = normalize_form_c($col[1]);
-               $NFCc2p = normalize_form_c_php($col[1]);
-               assert('$NFCc2 === $NFCc2p');
-               $NFCc3  = normalize_form_c($col[2]);
-               $NFCc3p = normalize_form_c_php($col[2]);
-               assert('$NFCc3 === $NFCc3p');
-               $NFCc4  = normalize_form_c($col[3]);
-               $NFCc4p = normalize_form_c_php($col[3]);
-               assert('$NFCc4 === $NFCc4p');
-               $NFCc5  = normalize_form_c($col[4]);
-               $NFCc5p = normalize_form_c_php($col[4]);
-               assert('$NFCc5 === $NFCc5p');
-
-               $NFDc1  = normalize_form_d($col[0]);
-               $NFDc1p = normalize_form_d_php($col[0]);
-               assert('$NFDc1 === $NFDc1p');
-               $NFDc2  = normalize_form_d($col[1]);
-               $NFDc2p = normalize_form_d_php($col[1]);
-               assert('$NFDc2 === $NFDc2p');
-               $NFDc3  = normalize_form_d($col[2]);
-               $NFDc3p = normalize_form_d_php($col[2]);
-               assert('$NFDc3 === $NFDc3p');
-               $NFDc4  = normalize_form_d($col[3]);
-               $NFDc4p = normalize_form_d_php($col[3]);
-               assert('$NFDc4 === $NFDc4p');
-               $NFDc5  = normalize_form_d($col[4]);
-               $NFDc5p = normalize_form_d_php($col[4]);
-               assert('$NFDc5 === $NFDc5p');
-
-               $NFKDc1  = normalize_form_kd($col[0]);
-               $NFKDc1p = normalize_form_kd_php($col[0]);
-               assert('$NFKDc1 === $NFKDc1p');
-               $NFKDc2  = normalize_form_kd($col[1]);
-               $NFKDc2p = normalize_form_kd_php($col[1]);
-               assert('$NFKDc2 === $NFKDc2p');
-               $NFKDc3  = normalize_form_kd($col[2]);
-               $NFKDc3p = normalize_form_kd_php($col[2]);
-               assert('$NFKDc3 === $NFKDc3p');
-               $NFKDc4  = normalize_form_kd($col[3]);
-               $NFKDc4p = normalize_form_kd_php($col[3]);
-               assert('$NFKDc4 === $NFKDc4p');
-               $NFKDc5  = normalize_form_kd($col[4]);
-               $NFKDc5p = normalize_form_kd_php($col[4]);
-               assert('$NFKDc5 === $NFKDc5p');
-
-               $NFKCc1  = normalize_form_kc($col[0]);
-               $NFKCc1p = normalize_form_kc_php($col[0]);
-               assert('$NFKCc1 === $NFKCc1p');
-               $NFKCc2  = normalize_form_kc($col[1]);
-               $NFKCc2p = normalize_form_kc_php($col[1]);
-               assert('$NFKCc2 === $NFKCc2p');
-               $NFKCc3  = normalize_form_kc($col[2]);
-               $NFKCc3p = normalize_form_kc_php($col[2]);
-               assert('$NFKCc3 === $NFKCc3p');
-               $NFKCc4  = normalize_form_kc($col[3]);
-               $NFKCc4p = normalize_form_kc_php($col[3]);
-               assert('$NFKCc4 === $NFKCc4p');
-               $NFKCc5  = normalize_form_kc($col[4]);
-               $NFKCc5p = normalize_form_kc_php($col[4]);
-               assert('$NFKCc5 === $NFKCc5p');
+               $NFCc1 = normalize_form_c( $col[0] );
+               $NFCc1p = normalize_form_c_php( $col[0] );
+               assert( '$NFCc1 === $NFCc1p' );
+               $NFCc2 = normalize_form_c( $col[1] );
+               $NFCc2p = normalize_form_c_php( $col[1] );
+               assert( '$NFCc2 === $NFCc2p' );
+               $NFCc3 = normalize_form_c( $col[2] );
+               $NFCc3p = normalize_form_c_php( $col[2] );
+               assert( '$NFCc3 === $NFCc3p' );
+               $NFCc4 = normalize_form_c( $col[3] );
+               $NFCc4p = normalize_form_c_php( $col[3] );
+               assert( '$NFCc4 === $NFCc4p' );
+               $NFCc5 = normalize_form_c( $col[4] );
+               $NFCc5p = normalize_form_c_php( $col[4] );
+               assert( '$NFCc5 === $NFCc5p' );
+
+               $NFDc1 = normalize_form_d( $col[0] );
+               $NFDc1p = normalize_form_d_php( $col[0] );
+               assert( '$NFDc1 === $NFDc1p' );
+               $NFDc2 = normalize_form_d( $col[1] );
+               $NFDc2p = normalize_form_d_php( $col[1] );
+               assert( '$NFDc2 === $NFDc2p' );
+               $NFDc3 = normalize_form_d( $col[2] );
+               $NFDc3p = normalize_form_d_php( $col[2] );
+               assert( '$NFDc3 === $NFDc3p' );
+               $NFDc4 = normalize_form_d( $col[3] );
+               $NFDc4p = normalize_form_d_php( $col[3] );
+               assert( '$NFDc4 === $NFDc4p' );
+               $NFDc5 = normalize_form_d( $col[4] );
+               $NFDc5p = normalize_form_d_php( $col[4] );
+               assert( '$NFDc5 === $NFDc5p' );
+
+               $NFKDc1 = normalize_form_kd( $col[0] );
+               $NFKDc1p = normalize_form_kd_php( $col[0] );
+               assert( '$NFKDc1 === $NFKDc1p' );
+               $NFKDc2 = normalize_form_kd( $col[1] );
+               $NFKDc2p = normalize_form_kd_php( $col[1] );
+               assert( '$NFKDc2 === $NFKDc2p' );
+               $NFKDc3 = normalize_form_kd( $col[2] );
+               $NFKDc3p = normalize_form_kd_php( $col[2] );
+               assert( '$NFKDc3 === $NFKDc3p' );
+               $NFKDc4 = normalize_form_kd( $col[3] );
+               $NFKDc4p = normalize_form_kd_php( $col[3] );
+               assert( '$NFKDc4 === $NFKDc4p' );
+               $NFKDc5 = normalize_form_kd( $col[4] );
+               $NFKDc5p = normalize_form_kd_php( $col[4] );
+               assert( '$NFKDc5 === $NFKDc5p' );
+
+               $NFKCc1 = normalize_form_kc( $col[0] );
+               $NFKCc1p = normalize_form_kc_php( $col[0] );
+               assert( '$NFKCc1 === $NFKCc1p' );
+               $NFKCc2 = normalize_form_kc( $col[1] );
+               $NFKCc2p = normalize_form_kc_php( $col[1] );
+               assert( '$NFKCc2 === $NFKCc2p' );
+               $NFKCc3 = normalize_form_kc( $col[2] );
+               $NFKCc3p = normalize_form_kc_php( $col[2] );
+               assert( '$NFKCc3 === $NFKCc3p' );
+               $NFKCc4 = normalize_form_kc( $col[3] );
+               $NFKCc4p = normalize_form_kc_php( $col[3] );
+               assert( '$NFKCc4 === $NFKCc4p' );
+               $NFKCc5 = normalize_form_kc( $col[4] );
+               $NFKCc5p = normalize_form_kc_php( $col[4] );
+               assert( '$NFKCc5 === $NFKCc5p' );
 
                # c2 ==  NFC(c1) ==      NFC(c2) ==      NFC(c3)
-               assert('$col[1] === $NFCc1');
-               assert('$col[1] === $NFCc2');
-               assert('$col[1] === $NFCc3');
+               assert( '$col[1] === $NFCc1' );
+               assert( '$col[1] === $NFCc2' );
+               assert( '$col[1] === $NFCc3' );
 
                # c4 ==  NFC(c4) ==      NFC(c5)
-               assert('$col[3] === $NFCc4');
-               assert('$col[3] === $NFCc5');
+               assert( '$col[3] === $NFCc4' );
+               assert( '$col[3] === $NFCc5' );
 
                # c3 ==  NFD(c1) ==      NFD(c2) ==      NFD(c3)
-               assert('$col[2] === $NFDc1');
-               assert('$col[2] === $NFDc2');
-               assert('$col[2] === $NFDc3');
+               assert( '$col[2] === $NFDc1' );
+               assert( '$col[2] === $NFDc2' );
+               assert( '$col[2] === $NFDc3' );
 
                # c5 ==  NFD(c4) ==      NFD(c5)
-               assert('$col[4] === $NFDc4');
-               assert('$col[4] === $NFDc5');
+               assert( '$col[4] === $NFDc4' );
+               assert( '$col[4] === $NFDc5' );
 
                # c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5)
-               assert('$col[3] === $NFKCc1');
-               assert('$col[3] === $NFKCc2');
-               assert('$col[3] === $NFKCc3');
-               assert('$col[3] === $NFKCc4');
-               assert('$col[3] === $NFKCc5');
+               assert( '$col[3] === $NFKCc1' );
+               assert( '$col[3] === $NFKCc2' );
+               assert( '$col[3] === $NFKCc3' );
+               assert( '$col[3] === $NFKCc4' );
+               assert( '$col[3] === $NFKCc5' );
 
                # c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5)
-               assert('$col[4] === $NFKDc1');
-               assert('$col[4] === $NFKDc2');
-               assert('$col[4] === $NFKDc3');
-               assert('$col[4] === $NFKDc4');
-               assert('$col[4] === $NFKDc5');
+               assert( '$col[4] === $NFKDc1' );
+               assert( '$col[4] === $NFKDc2' );
+               assert( '$col[4] === $NFKDc3' );
+               assert( '$col[4] === $NFKDc4' );
+               assert( '$col[4] === $NFKDc5' );
        }
 }
 echo "done.\n";
 
 // Compare against http://en.wikipedia.org/wiki/UTF-8#Description
-function unichr($c) {
-       if ($c <= 0x7F) {
-               return chr($c);
-       } elseif ($c <= 0x7FF) {
-               return chr(0xC0 | $c >> 6) . chr(0x80 | $c & 0x3F);
-       } elseif ($c <= 0xFFFF) {
-               return chr(0xE0 | $c >> 12) . chr(0x80 | $c >> 6 & 0x3F)
-                       . chr(0x80 | $c & 0x3F);
-       } elseif ($c <= 0x10FFFF) {
-               return chr(0xF0 | $c >> 18) . chr(0x80 | $c >> 12 & 0x3F)
-                       . chr(0x80 | $c >> 6 & 0x3F)
-                       . chr(0x80 | $c & 0x3F);
+function unichr( $c ) {
+       if ( $c <= 0x7F ) {
+               return chr( $c );
+       } elseif ( $c <= 0x7FF ) {
+               return chr( 0xC0 | $c >> 6 ) . chr( 0x80 | $c & 0x3F );
+       } elseif ( $c <= 0xFFFF ) {
+               return chr( 0xE0 | $c >> 12 ) . chr( 0x80 | $c >> 6 & 0x3F )
+               . chr( 0x80 | $c & 0x3F );
+       } elseif ( $c <= 0x10FFFF ) {
+               return chr( 0xF0 | $c >> 18 ) . chr( 0x80 | $c >> 12 & 0x3F )
+               . chr( 0x80 | $c >> 6 & 0x3F )
+               . chr( 0x80 | $c & 0x3F );
        } else {
                return false;
        }
 }
 
-function unistr($c) {
-       return implode("", array_map("unichr", array_map("hexdec", explode(" ", $c))));
+function unistr( $c ) {
+       return implode( "", array_map( "unichr", array_map( "hexdec", explode( " ", $c ) ) ) );
 }
 
 function getRow( $f ) {
        $row = fgets( $f );
-       if( $row === false ) return false;
-       $row = rtrim($row);
+       if ( $row === false ) return false;
+       $row = rtrim( $row );
        $pos = strpos( $row, COMMENT );
        $pos2 = strpos( $row, ")" );
-       if( $pos === 0 ) return array($row);
+       if ( $pos === 0 ) return array( $row );
        $c = "";
 
-       if( $pos ) {
-               if($pos2) $c = substr( $row, $pos2 + 2 );
-               else      $c = substr( $row, $pos );
+       if ( $pos ) {
+               if ( $pos2 ) $c = substr( $row, $pos2 + 2 );
+               else      $c = substr( $row, $pos );
                $row = substr( $row, 0, $pos );
        }
 
        $ret = array();
-       foreach( explode( SEPARATOR, $row ) as $ent ) {
-               if( trim( $ent ) !== "" ) {
-                       $ret[] = unistr($ent);
+       foreach ( explode( SEPARATOR, $row ) as $ent ) {
+               if ( trim( $ent ) !== "" ) {
+                       $ret[] = unistr( $ent );
                }
        }
        $ret[] = $c;
index 443516b..6c925df 100644 (file)
  * @public
  */
 function codepointToUtf8( $codepoint ) {
-       if($codepoint <         0x80) return chr($codepoint);
-       if($codepoint <    0x800) return chr($codepoint >>      6 & 0x3f | 0xc0) .
-                                                                        chr($codepoint           & 0x3f | 0x80);
-       if($codepoint <  0x10000) return chr($codepoint >> 12 & 0x0f | 0xe0) .
-                                                                        chr($codepoint >>      6 & 0x3f | 0x80) .
-                                                                        chr($codepoint           & 0x3f | 0x80);
-       if($codepoint < 0x110000) return chr($codepoint >> 18 & 0x07 | 0xf0) .
-                                                                        chr($codepoint >> 12 & 0x3f | 0x80) .
-                                                                        chr($codepoint >>      6 & 0x3f | 0x80) .
-                                                                        chr($codepoint           & 0x3f | 0x80);
+       if ( $codepoint < 0x80 ) {
+               return chr( $codepoint );
+       }
+
+       if ( $codepoint < 0x800 ) {
+               return chr( $codepoint >> 6 & 0x3f | 0xc0 ) .
+                       chr( $codepoint & 0x3f | 0x80 );
+       }
+
+       if ( $codepoint < 0x10000 ) {
+               return chr( $codepoint >> 12 & 0x0f | 0xe0 ) .
+                       chr( $codepoint >> 6 & 0x3f | 0x80 ) .
+                       chr( $codepoint & 0x3f | 0x80 );
+       }
+
+       if ( $codepoint < 0x110000 ) {
+               return chr( $codepoint >> 18 & 0x07 | 0xf0 ) .
+                       chr( $codepoint >> 12 & 0x3f | 0x80 ) .
+                       chr( $codepoint >> 6 & 0x3f | 0x80 ) .
+                       chr( $codepoint & 0x3f | 0x80 );
+       }
 
        echo "Asked for code outside of range ($codepoint)\n";
        die( -1 );
@@ -60,10 +71,11 @@ function codepointToUtf8( $codepoint ) {
  */
 function hexSequenceToUtf8( $sequence ) {
        $utf = '';
-       foreach( explode( ' ', $sequence ) as $hex ) {
+       foreach ( explode( ' ', $sequence ) as $hex ) {
                $n = hexdec( $hex );
                $utf .= codepointToUtf8( $n );
        }
+
        return $utf;
 }
 
@@ -80,6 +92,7 @@ function utf8ToHexSequence( $str ) {
        foreach ( preg_split( '//u', $str, -1, PREG_SPLIT_NO_EMPTY ) as $cp ) {
                $buf .= sprintf( '%04x ', utf8ToCodepoint( $cp ) );
        }
+
        return rtrim( $buf );
 }
 
@@ -107,6 +120,7 @@ function utf8ToCodepoint( $char ) {
        if ( $length != strlen( $char ) ) {
                return false;
        }
+
        if ( $length == 1 ) {
                return ord( $char );
        }
@@ -116,7 +130,7 @@ function utf8ToCodepoint( $char ) {
        $z >>= $length;
 
        # Add in the free bits from subsequent bytes
-       for ( $i=1; $i < $length; $i++ ) {
+       for ( $i = 1; $i < $length; $i++ ) {
                $z <<= 6;
                $z |= ord( $char[$i] ) & 0x3f;
        }
@@ -136,5 +150,5 @@ function escapeSingleString( $string ) {
                array(
                        '\\' => '\\\\',
                        '\'' => '\\\''
-               ));
+               ) );
 }
index 99f73aa..56f1be2 100644 (file)
@@ -247,6 +247,23 @@ abstract class BagOStuff {
                return $res;
        }
 
+       /**
+        * Batch insertion
+        * @param array $data $key => $value assoc array
+        * @param int $exptime Either an interval in seconds or a unix timestamp for expiry
+        * @return bool success
+        * @since 1.24
+        */
+       public function setMulti( array $data, $exptime = 0 ) {
+               $res = true;
+               foreach ( $data as $key => $value ) {
+                       if ( !$this->set( $key, $value, $exptime ) ) {
+                               $res = false;
+                       }
+               }
+               return $res;
+       }
+
        /**
         * @param string $key
         * @param mixed $value
@@ -307,6 +324,23 @@ abstract class BagOStuff {
                return $this->incr( $key, - $value );
        }
 
+       /**
+        * Increase stored value of $key by $value while preserving its TTL
+        *
+        * This will create the key with value $init and TTL $ttl if not present
+        *
+        * @param string $key
+        * @param integer $ttl
+        * @param integer $value
+        * @param integer $init
+        * @return bool
+        * @since 1.24
+        */
+       public function incrWithInit( $key, $ttl, $value = 1, $init = 1 ) {
+               return $this->incr( $key, $value ) ||
+                       $this->add( $key, $init, $ttl ) || $this->incr( $key, $value );
+       }
+
        /**
         * Get the "last error" registered; clearLastError() should be called manually
         * @return int ERR_* constant for the "last error" registry
index 5a96f7b..f7dfe46 100644 (file)
@@ -250,6 +250,27 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                return $this->checkResult( false, $result );
        }
 
+       /**
+        * @param array $data
+        * @param int $exptime
+        * @return bool
+        */
+       public function setMulti( array $data, $exptime = 0 ) {
+               wfProfileIn( __METHOD__ );
+               foreach ( $data as $key => $value ) {
+                       $encKey = $this->encodeKey( $key );
+                       if ( $encKey !== $key ) {
+                               $data[$encKey] = $value;
+                               unset( $data[$key] );
+                       }
+               }
+               $this->debugLog( 'setMulti(' . implode( ', ', array_keys( $data ) ) . ')' );
+               $result = $this->client->setMulti( $data, $this->fixExpiry( $exptime ) );
+               wfProfileOut( __METHOD__ );
+               return $this->checkResult( false, $result );
+       }
+
+
        /* NOTE: there is no cas() method here because it is currently not supported
         * by the BagOStuff interface and other BagOStuff subclasses, such as
         * SqlBagOStuff.
index d6d49ae..e770b73 100644 (file)
@@ -211,6 +211,59 @@ class RedisBagOStuff extends BagOStuff {
                return $result;
        }
 
+       /**
+        * @param array $data
+        * @param int $expiry
+        * @return bool
+        */
+       public function setMulti( array $data, $expiry = 0 ) {
+               $section = new ProfileSection( __METHOD__ );
+
+               $batches = array();
+               $conns = array();
+               foreach ( $data as $key => $value ) {
+                       list( $server, $conn ) = $this->getConnection( $key );
+                       if ( !$conn ) {
+                               continue;
+                       }
+                       $conns[$server] = $conn;
+                       $batches[$server][] = $key;
+               }
+
+               $expiry = $this->convertToRelative( $expiry );
+               $result = true;
+               foreach ( $batches as $server => $batchKeys ) {
+                       $conn = $conns[$server];
+                       try {
+                               $conn->multi( Redis::PIPELINE );
+                               foreach ( $batchKeys as $key ) {
+                                       if ( $expiry ) {
+                                               $conn->setex( $key, $expiry, $this->serialize( $data[$key] ) );
+                                       } else {
+                                               $conn->set( $key, $this->serialize( $data[$key] ) );
+                                       }
+                               }
+                               $batchResult = $conn->exec();
+                               if ( $batchResult === false ) {
+                                       $this->debug( "setMulti request to $server failed" );
+                                       continue;
+                               }
+                               foreach ( $batchResult as $value ) {
+                                       if ( $value === false ) {
+                                               $result = false;
+                                       }
+                               }
+                       } catch ( RedisException $e ) {
+                               $this->handleException( $server, $conn, $e );
+                               $result = false;
+                       }
+               }
+
+               return $result;
+       }
+
+
+
        public function add( $key, $value, $expiry = 0 ) {
                $section = new ProfileSection( __METHOD__ );
 
index 8bf0c81..e6a8c45 100644 (file)
@@ -271,6 +271,76 @@ class SqlBagOStuff extends BagOStuff {
                return $values;
        }
 
+       /**
+        * @param array $data
+        * @param int $expiry
+        * @return bool
+        */
+       public function setMulti( array $data, $expiry = 0 ) {
+               $keysByTable = array();
+               foreach ( $data as $key => $value ) {
+                       list( $serverIndex, $tableName ) = $this->getTableByKey( $key );
+                       $keysByTable[$serverIndex][$tableName][] = $key;
+               }
+
+               $this->garbageCollect(); // expire old entries if any
+
+               $result = true;
+               $exptime = (int)$expiry;
+               foreach ( $keysByTable as $serverIndex => $serverKeys ) {
+                       try {
+                               $db = $this->getDB( $serverIndex );
+                       } catch ( DBError $e ) {
+                               $this->handleWriteError( $e, $serverIndex );
+                               $result = false;
+                               continue;
+                       }
+
+                       if ( $exptime < 0 ) {
+                               $exptime = 0;
+                       }
+
+                       if ( $exptime == 0 ) {
+                               $encExpiry = $this->getMaxDateTime( $db );
+                       } else {
+                               if ( $exptime < 3.16e8 ) { # ~10 years
+                                       $exptime += time();
+                               }
+                               $encExpiry = $db->timestamp( $exptime );
+                       }
+                       foreach ( $serverKeys as $tableName => $tableKeys ) {
+                               $rows = array();
+                               foreach ( $tableKeys as $key ) {
+                                       $rows[] = array(
+                                               'keyname' => $key,
+                                               'value' => $db->encodeBlob( $this->serialize( $data[$key] ) ),
+                                               'exptime' => $encExpiry,
+                                       );
+                               }
+
+                               try {
+                                       $db->commit( __METHOD__, 'flush' );
+                                       $db->replace(
+                                               $tableName,
+                                               array( 'keyname' ),
+                                               $rows,
+                                               __METHOD__
+                                       );
+                                       $db->commit( __METHOD__, 'flush' );
+                               } catch ( DBError $e ) {
+                                       $this->handleWriteError( $e, $serverIndex );
+                                       $result = false;
+                               }
+
+                       }
+
+               }
+
+               return $result;
+       }
+
+
+
        /**
         * @param string $key
         * @param mixed $value
index 49e810c..b7cc490 100644 (file)
@@ -400,6 +400,9 @@ class ParserOutput extends CacheTime {
         * retrieved given the page ID or via a DB join when given the page
         * title.
         *
+        * Since 1.23, page_props are also indexed by numeric value, to allow
+        * for efficient "top k" queries of pages wrt a given property.
+        *
         * setProperty() is thus used to propagate properties from the parsed
         * page to request contexts other than a page view of the currently parsed
         * article.
index 7f63bb2..b709498 100644 (file)
@@ -431,7 +431,7 @@ class TransactionProfiler {
                                        list( $method, $realtime ) = $info;
                                        $msg .= sprintf( "%d\t%.6f\t%s\n", $i, $realtime, $method );
                                }
-                               $this->debugGroup( 'DBPerformance', $msg );
+                               wfDebugLog( 'DBPerformance', $msg );
                        }
                        unset( $this->mDBTrxHoldingLocks[$name] );
                        unset( $this->mDBTrxMethodTimes[$name] );
diff --git a/includes/resourceloader/ResourceLoaderLanguageNamesModule.php b/includes/resourceloader/ResourceLoaderLanguageNamesModule.php
new file mode 100644 (file)
index 0000000..73b6ea7
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Resource loader module for providing language names.
+ *
+ * By default these names will be autonyms however other extensions may
+ * provided language names in the context language (e.g. cldr extension)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Ed Sanders
+ * @author Trevor Parscal
+ */
+
+/**
+ * ResourceLoader module for populating language specific data.
+ */
+class ResourceLoaderLanguageNamesModule extends ResourceLoaderModule {
+
+       protected $targets = array( 'desktop', 'mobile' );
+
+
+       /**
+        * @param $context ResourceLoaderContext
+        * @return array
+        */
+       protected function getData( ResourceLoaderContext $context ) {
+               return Language::fetchLanguageNames(
+                       $context->getLanguage(),
+                       'all'
+               );
+       }
+
+       /**
+        * @param $context ResourceLoaderContext
+        * @return string JavaScript code
+        */
+       public function getScript( ResourceLoaderContext $context ) {
+               return Xml::encodeJsCall( 'mw.language.setData', array(
+                       $context->getLanguage(),
+                       'languageNames',
+                       $this->getData( $context )
+               ) );
+       }
+
+       public function getDependencies() {
+               return array( 'mediawiki.language.init' );
+       }
+
+       /**
+        * @param ResourceLoaderContext $context
+        * @return int UNIX timestamp
+        */
+       public function getModifiedTime( ResourceLoaderContext $context ) {
+               return max( 1, $this->getHashMtime( $context ) );
+       }
+
+       /**
+        * @param ResourceLoaderContext $context
+        * @return string Hash
+        */
+       public function getModifiedHash( ResourceLoaderContext $context ) {
+               return md5( serialize( $this->getData( $context ) ) );
+       }
+
+}
index 8dc5946..d0f0541 100644 (file)
@@ -117,6 +117,75 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                return $this->configVars[$hash];
        }
 
+       /**
+        * Recursively get all explicit and implicit dependencies for to the given module.
+        *
+        * @param array $registryData
+        * @param string $moduleName
+        * @return array
+        */
+       protected static function getImplicitDependencies( Array $registryData, $moduleName ) {
+               static $dependencyCache = array();
+
+               // The list of implicit dependencies won't be altered, so we can
+               // cache them without having to worry.
+               if ( !isset( $dependencyCache[$moduleName] ) ) {
+
+                       if ( !isset( $registryData[$moduleName] ) ) {
+                               // Dependencies may not exist
+                               $dependencyCache[$moduleName] = array();
+                       } else {
+                               $data = $registryData[$moduleName];
+                               $dependencyCache[$moduleName] = $data['dependencies'];
+
+                               foreach ( $data['dependencies'] as $dependency ) {
+                                       // Recursively get the dependencies of the dependencies
+                                       $dependencyCache[$moduleName] = array_merge(
+                                               $dependencyCache[$moduleName],
+                                               self::getImplicitDependencies( $registryData, $dependency )
+                                       );
+                               }
+                       }
+               }
+
+               return $dependencyCache[$moduleName];
+       }
+
+       /**
+        * Optimize the dependency tree in $this->modules and return it.
+        *
+        * 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.
+        *
+        * This way we can reasonably reduce the amout of module registration
+        * data send to the client.
+        *
+        * @param Array &$registryData Modules keyed by name with properties:
+        *  - string 'version'
+        *  - array 'dependencies'
+        *  - string|null 'group'
+        *  - string 'source'
+        *  - string|false 'loader'
+        */
+       public static function compileUnresolvedDependencies( Array &$registryData ) {
+               foreach ( $registryData as $name => &$data ) {
+                       if ( $data['loader'] !== false ) {
+                               continue;
+                       }
+                       $dependencies = $data['dependencies'];
+                       foreach ( $data['dependencies'] as $dependency ) {
+                               $implicitDependencies = self::getImplicitDependencies( $registryData, $dependency );
+                               $dependencies = array_diff( $dependencies, $implicitDependencies );
+                       }
+                       // Rebuild keys
+                       $data['dependencies'] = array_values( $dependencies );
+               }
+       }
+
+
        /**
         * Get registration code for all modules.
         *
@@ -157,6 +226,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        );
                }
 
+               self::compileUnresolvedDependencies( $registryData );
+
                // Register sources
                $out .= ResourceLoader::makeLoaderSourcesScript( $resourceLoader->getSources() );
 
index 0553880..dcec5dd 100644 (file)
@@ -167,7 +167,7 @@ class RevDel_RevisionItem extends RevDel_Item {
        }
 
        public function getAuthorNameField() {
-               return 'user_name'; // see Revision::selectUserFields()
+               return 'rev_user_text';
        }
 
        public function canView() {
index aca8c96..891962b 100644 (file)
@@ -492,7 +492,7 @@ class ImportReporter extends ContextSource {
                        $comment = $detail; // quick
                        $dbw = wfGetDB( DB_MASTER );
                        $latest = $title->getLatestRevID();
-                       $nullRevision = Revision::newNullRevision( $dbw, $title->getArticleID(), $comment, true );
+                       $nullRevision = Revision::newNullRevision( $dbw, $title->getArticleID(), $comment, true, $this->getUser() );
                        if ( !is_null( $nullRevision ) ) {
                                $nullRevision->insertOn( $dbw );
                                $page = WikiPage::factory( $title );
index c10a618..1d06071 100644 (file)
@@ -33,6 +33,7 @@ class SpecialNewFiles extends IncludableSpecialPage {
                $pager = new NewFilesPager( $this->getContext(), $par );
 
                if ( !$this->including() ) {
+                       $this->setTopText();
                        $form = $pager->getForm();
                        $form->prepareForm();
                        $form->displayForm( '' );
@@ -47,6 +48,25 @@ class SpecialNewFiles extends IncludableSpecialPage {
        protected function getGroupName() {
                return 'changes';
        }
+
+       /**
+        * Send the text to be displayed above the options
+        */
+       function setTopText() {
+               global $wgContLang;
+
+               $message = $this->msg( 'newimagestext' )->inContentLanguage();
+               if ( !$message->isDisabled() ) {
+                       $this->getOutput()->addWikiText(
+                               Html::rawElement( 'p',
+                                       array( 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ),
+                                       "\n" . $message->plain() . "\n"
+                               ),
+                               /* $lineStart */ false,
+                               /* $interface */ false
+                       );
+               }
+       }
 }
 
 /**
index f1a31a5..f770307 100644 (file)
@@ -527,7 +527,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
        }
 
        /**
-        * Create a input to filter changes by categories
+        * Create an input to filter changes by categories
         *
         * @param FormOptions $opts
         * @return array
index 0c4252e..6eee861 100644 (file)
@@ -360,14 +360,16 @@ class SpecialSearch extends SpecialPage {
                $out->addHtml( "<div class='searchresults'>" );
 
                // prev/next links
+               $prevnext = null;
                if ( $num || $this->offset ) {
                        // Show the create link ahead
                        $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
-                       $prevnext = $this->getLanguage()->viewPrevNext( $this->getPageTitle(), $this->offset, $this->limit,
-                               $this->powerSearchOptions() + array( 'search' => $term ),
-                               max( $titleMatchesNum, $textMatchesNum ) < $this->limit
-                       );
-                       //$out->addHTML( "<p class='mw-search-pager-top'>{$prevnext}</p>\n" );
+                       if ( $totalRes > $this->limit || $this->offset ) {
+                               $prevnext = $this->getLanguage()->viewPrevNext( $this->getPageTitle(), $this->offset, $this->limit,
+                                       $this->powerSearchOptions() + array( 'search' => $term ),
+                                       max( $titleMatchesNum, $textMatchesNum ) < $this->limit
+                               );
+                       }
                        wfRunHooks( 'SpecialSearchResults', array( $term, &$titleMatches, &$textMatches ) );
                } else {
                        wfRunHooks( 'SpecialSearchNoResults', array( $term ) );
@@ -386,10 +388,8 @@ class SpecialSearch extends SpecialPage {
                        if ( $numTextMatches > 0 && $numTitleMatches > 0 ) {
                                // if no title matches the heading is redundant
                                $out->wrapWikiMsg( "==$1==\n", 'textmatches' );
-                       } elseif ( $totalRes == 0 ) {
-                               # Don't show the 'no text matches' if we received title matches
-                               # $out->wrapWikiMsg( "==$1==\n", 'notextmatches' );
                        }
+
                        // show interwiki results if any
                        if ( $textMatches->hasInterwikiResults() ) {
                                $out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(), $term ) );
@@ -413,7 +413,7 @@ class SpecialSearch extends SpecialPage {
                }
                $out->addHtml( "</div>" );
 
-               if ( $num || $this->offset ) {
+               if ( $prevnext ) {
                        $out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
                }
        }
index c635ebb..95bd31e 100644 (file)
@@ -3130,14 +3130,18 @@ class Language {
         * @param string $number
         * @return string
         */
-       function parseFormattedNumber( $number ) {
+       public function parseFormattedNumber( $number ) {
                $s = $this->digitTransformTable();
                if ( $s ) {
+                       // eliminate empty array values such as ''. (bug 64347)
+                       $s = array_filter( $s );
                        $number = strtr( $number, array_flip( $s ) );
                }
 
                $s = $this->separatorTransformTable();
                if ( $s ) {
+                       // eliminate empty array values such as ''. (bug 64347)
+                       $s = array_filter( $s );
                        $number = strtr( $number, array_flip( $s ) );
                }
 
index a06f055..766bc2e 100644 (file)
        "user-mail-no-addy": "Ujoe kirém surat-e ngön hana alamat surat-e.",
        "user-mail-no-body": "Droëneuh ka neucuba kirém e-surat soh ngon that paneuk",
        "changepassword": "Gantoe lageuem rahsia",
-       "resetpass_announce": "Droëneuh kaneutamöng ngon kode siat nyang geukirém rot e-surat. Keu neusambông nyan droëneuh jeuët neupeutamöng narit rahsia barô",
+       "resetpass_announce": "Keu neutamöng log, droëneuh suwah neupeugöt lageuëm rahsia barô",
        "resetpass_header": "Gantoë lageuëm rahsia nan ureuëng ngui",
        "oldpassword": "Lageuëm rahsia awai:",
        "newpassword": "Lageuëm rahsia barô:",
        "shown-title": "Peuleumah $1 {{PLURAL:$1|hasé}} tiëp laman",
        "viewprevnext": "Eu ($1 {{int:pipe-separator}} $2)($3)",
        "searchmenu-exists": "'''Na laman ngön nan \"[[:$1]]\" bak wiki nyoe.'''",
-       "searchmenu-new": "'''Peugöt laman \"[[:$1]]\" bak wiki nyoë!'''",
+       "searchmenu-new": "<strong>Peugöt laman \"[[:$1]]\" bak wiki nyoë!</strong> {{PLURAL:$2|0=|Eu cit laman nyang geurumpok nibak meunita droëneuh.|Eu cit hasé mita nyang geurumpok.}}",
        "searchprofile-articles": "Laman asoë",
        "searchprofile-project": "Laman Beunantu ngön Buët",
        "searchprofile-images": "Multimedia",
index 7e721ac..a65a93a 100644 (file)
        "ncategories": "$1টা {{PLURAL:$1|শ্ৰেণী|শ্ৰেণী}}",
        "ninterwikis": "$1 {{PLURAL:$1|ইণ্টাৰৱিকি|ইণ্টাৰৱিকিসমূহ}}",
        "nlinks": "$1 {{PLURAL:$1|সংযোগ|সংযোগ}}",
-       "nmembers": "{{PLURAL:$1|সদস্য|$1 সদস্যবৃন্দ}}",
+       "nmembers": "{{PLURAL:|$1 টা প্ৰবন্ধ বা উপশ্ৰেণী|$1 টা প্ৰবন্ধ বা উপশ্ৰেণী}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|জন সদস্য}}",
        "nrevisions": "$1টা {{PLURAL:$1|সংশোধন|সংশোধন}}",
        "nviews": "$1 {{PLURAL:$1|টা দৰ্শন|টা দৰ্শন}}",
        "table_pager_empty": "ফলাফল নাই",
        "autosumm-blank": "পৃষ্ঠাটো খালী কৰা হ'ল",
        "autosumm-replace": "পৄষ্ঠাখনক \"$1\"ৰে সলনি কৰা হ'ল",
-       "autoredircomment": "[[$1]]-à¦\95 পুনৰ্নিৰ্দেশ কৰা হ'ল",
+       "autoredircomment": "[[$1]]-লà§\88 পুনৰ্নিৰ্দেশ কৰা হ'ল",
        "autosumm-new": "\"$1\" দি পৃষ্ঠা সৃষ্টি কৰা হ'ল",
        "lag-warn-normal": "$1 {{PLURAL:$1|ছেকেণ্ড|ছেকেণ্ড}} তকৈ নতুন পৰিৱৰ্তনসমূহ এই তালিকাত দেখুওৱা নহবও পাৰে।",
        "lag-warn-high": "উচ্চ ডাটাবেইচ চাৰ্ভাৰ পলমৰ বাবে, $1 {{PLURAL:$1|ছেকেণ্ড|ছেকেণ্ড}} তকৈ নতুন পৰিৱৰ্তনসমূহ এই তালিকাত দেখুওৱা নহবও পাৰে।",
index 682823a..5af1e4d 100644 (file)
        "jumptonavigation": "навігацыі",
        "jumptosearch": "пошуку",
        "view-pool-error": "Прабачце, у цяперашні момант сэрвэры перагружаныя.\nЗанадта шмат удзельнікаў спрабуюць праглядзець гэтую старонку.\nКалі ласка, пачакайце і паспрабуйце зайсьці пазьней.\n\n$1",
+       "generic-pool-error": "Выбачайце, у цяперашні момант сэрвэры перагружаныя.\nЗашмат удзельнікаў спрабуе праглядзець гэтую старонку.\nКалі ласка, пачакайце перад тым, як зноў паспрабаваць загрузіць гэтую старонку.",
        "pool-timeout": "Скончыўся час чаканьня блякаваньня",
        "pool-queuefull": "Чарга запытаў поўная",
        "pool-errorunknown": "Невядомая памылка",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "recentchanges-legend-newpage": "(глядзіце таксама [[Special:NewPages|сьпіс новых старонак]])",
        "rcnotefrom": "Ніжэй знаходзяцца зьмены з <strong>$2</strong> (да <strong>$1</strong> на старонку).",
-       "rclistfrom": "Паказаць зьмены з $3 $2",
+       "rclistfrom": "Паказаць зьмены з $2 $3",
        "rcshowhideminor": "$1 дробныя праўкі",
        "rcshowhideminor-show": "Паказаць",
        "rcshowhideminor-hide": "Схаваць",
        "listgrouprights-namespaceprotection-restrictedto": "Правы, якія дазваляюць удзельніку рэдагаваць",
        "trackingcategories": "Катэгорыі, якія патрабуюць увагі",
        "trackingcategories-summary": "На гэтай старонцы пералічаныя катэгорыя, які патрабуюць увагі і якія аўтаматычна запаўняюцца праграмным забесьяпчэньнем MediaWiki. Іх назвы могуць быць зьмененыя рэдагаваньнем сыстэмных паведамленьняў у прасторы назваў {{ns:8}}.",
+       "trackingcategories-msg": "Катэгорыя, якая патрабуе ўвагі",
+       "trackingcategories-name": "Назва паведамленьня",
+       "trackingcategories-desc": "Крытэр уключэньня ў катэгорыю",
+       "noindex-category-desc": "Гэтая старонка не індэксуецца пошукавымі робатамі, таму што на ёй маецца магічнае слова <code><nowiki>__NOINDEX__</nowiki></code>, а старонка знаходзіцца ў прасторы назваў, дзе дазволны гэты сьцяг.",
+       "index-category-desc": "На старонцы знаходзіцца магічнае слова <code><nowiki>__INDEX__</nowiki></code> (пры гэтым старонка знаходзіцца ў прасторы назваў, дзе дазволены гэты сьцяг), таму яна індэксуецца пошукавымі робатамі ў тых выпадках, калі звычайна гэтага не адбываецца.",
+       "post-expand-template-inclusion-category-desc": "Пасьля разгортваньня ўсіх шаблёнаў, памер старонкі перавысіў <code>$wgMaxArticleSize</code>, таму некаторыя шаблёны не былі паказаныя цалкам.",
        "mailnologin": "Няма адрасу атрымальніка",
        "mailnologintext": "Вам неабходна [[Special:UserLogin|ўвайсьці ў сыстэму]] і мець пацьверджаны адрас электроннай пошты ў Вашых [[Special:Preferences|наладах]], каб дасылаць лісты іншым удзельнікам.",
        "emailuser": "Даслаць ліст",
index 7b8fc11..212bd56 100644 (file)
        "permalink": "བརྟན་འཇགས་ཀྱི་སྦྲེལ་མཐུད།",
        "print": "དཔར་བ།",
        "view": "ལྟ་བ།",
+       "view-foreign": "$1 ལ་གཟིགས་རོགས།",
        "edit": "རྩོམ་སྒྲིག",
+       "edit-local": "ས་ཁུལ་གྱི་འགྲེལ་བརྗོད་ལ་རྩོམ་སྒྲིག།",
        "create": "གསར་སྐྲུན།",
+       "create-local": "ས་ཁུལ་འགྲེལ་བརྗོད་གསར་སྐྲུན།",
        "editthispage": "ངོས་འདི་བཟོ་བཅོས་བྱེད་པ།",
        "create-this-page": "ཤོག་ངོས་འདི་སྐྲུན་པ།",
        "delete": "སུབས།",
        "jumptonavigation": "ཕྱོགས་ཁྲིད།",
        "jumptosearch": "འཚོལ།",
        "view-pool-error": "དགོངས་པ་མ་ཚོམས་རོགས། སྤྱོད་མི་མང་དག་ཞིག་གི་ཤོག་ངོས་འདིར་གཟིགས་ཞིང་འདུག་པས། གནས་སྐབས་རིང་ཞབས་ཞུ་འཕྲུལ་ཆས་ཐེག་བརྒལ་བྱས་འདུག། \nཤོག་ངོས་འདིར་བསྐྱར་དུ་མ་གཟིགས་གོང་ཡུད་ཙམ་རིང་སྒུག་རོགས་གནང། $1",
+       "generic-pool-error": "དགོངས་པ་མ་ཚོམས་རོགས། སྤྱོད་མི་མང་དག་ཞིག་གི་ཡོངས་ཁུངས་འདིར་གཟིགས་ཞིང་འདུག་པས། གནས་སྐབས་རིང་ཞབས་ཞུ་འཕྲུལ་ཆས་ཐེག་བརྒལ་བྱས་འདུག། ཡོངས་ཁུངས་འདིར་བསྐྱར་དུ་མ་གཟིགས་གོང་ཡུད་ཙམ་ཞིག་ངང་སྒུག་གནང་རོགས།།",
        "pool-timeout": "ཟྭ་རྒྱག་སྒུག་ཡུན་གྱི་དུས་ཚོད་རྫོགས་སོང།",
        "pool-queuefull": "སྤྱི་པའི་ཐེབས་རྩའི་བསྟར་པ་ཁེངས་འདུག།",
        "pool-errorunknown": "ངོས་མ་ཟིན་པའི་ནོར་འཁྲུལ།",
+       "pool-servererror": "($1) ,ཐུན་མོང་ཡ་ལན་གི་ཞབས་ཞུ་གནས་སྐབས་རིང་མིན་འདུག།",
        "aboutsite": "{{SITENAME}}ཡི་སྐོར།",
        "aboutpage": "Project:སྐོར།",
        "copyright": "དེ་མིན་གྱི་མཆན་འགྲེལ་ཡོད་ན་མ་གཏོགས། དྲ་བའི་ནང་དོན་ $1 སྟེང་དུ་ཡོད།",
        "ok": "འགྲིག",
        "retrievedfrom": "\"$1\"ལས་སླར་རྙེད་སོང།",
        "youhavenewmessages": "ཁྱེད་ལ་འཕྲིན་གསར་$1($2)ཡོད།",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|ཁྱེད་རང་ལ་}}{{PLURAL:$3|སྤྱོད་མི་གཞན་|$3 སྤྱོད་མི་}}($2)ནས་ $1 འདུག།།",
        "youhavenewmessagesmanyusers": "ཁྱེད་ལ་ $1 སྤྱོད་མི་མང་པོ་ཞིག་ནས་ ($2)འདུག།",
        "newmessageslinkplural": "{{PLURAL:$1|འཕྲིན་ཐུང་གསར་པ་ཞིག་|999= འཕྲིན་ཐུང་གསར་པ།}}",
        "newmessagesdifflinkplural": "མཐའ་མའི་ {{PLURAL:$1|འགྱུར་བཅོས།|999=འགྱུར་བཅོས།}}",
        "enterlockreason": "བཀག་སྡོམ་བྱས་དགོས་རྐྱེན་བཀོད་རོགས དེ་མིན་བཀག་སྡོམ་འདི་དུས་ཚོད་ནམ་ཞིག་ལ་བཀྲོལ་རྒྱུ་ཡིན་མིན་སོགས་བཀོད་རོགས།",
        "readonlytext": "རྨང་གཞི་གྲངས་མཛོད་འདི་གནས་སྐབས་བཀག་སྡོམ་བྱས་འདུག། ཕལ་ཆེར་རྨང་གཞི་གྲངས་མཛོད་འདི་ཉར་འཚག་བྱད་བཞིན་འདུག། \n$1 རྒྱུ་རྐྱེན་འདི་འོག་དོ་དམ་པས་བཀག་སྡོམ་བྱས་འདུག།",
        "missing-article": "གཞི་གྲངས་མཛོད་ནང་ཤོག་ངོས་ཀྱི་ཡི་གེ་བཙལ་ཐུབ་ཀྱི་མི་འདུག་པས། \"$1\" $2 \nཕལ་ཆེར་འདི་གཤམ་ཀྱི་འགོག་རྐྱེན་ལོ་རྒྱུས་སུབ་པ་འམ་དུས་ཡོལ་ཀྱི་ཁྱད་པར་སོགས་ཀྱི་རྒྱུ་རྐྱེན་ཡིན།\nགལ་སྲིད་དེ་ལྟར་མིན་ཚེ། ཕལ་ཆེར་ཁྱེད་ཀྱི་ནོར་སྐྱོན་འཙལ་རྙེད་བྱང་བས།  [[Special:ListUsers/sysop|administrator]], དྲ་རྒྱའི་ས་ཚིགས་འདི་ཐོག་ཞུ་ཡིག་འབུལ་གནང་ཡོང་བ་མཁྱེན།",
+       "readonly_lag": "གཞི་གྲངས་མཛོད་རང་འགུལ་གི་སྒོ་ཐེབས་འདུག།",
        "internalerror": "ནང་ལོག་ནོར་སྐྱོན།",
        "internalerror_info": "ནང་ལོགས་ནོར་སྐྱོན། $1",
        "filecopyerror": "\"$1\" \"$2\"ལ་འདྲ་བཤུ་བྱེད་མ་ཐུབ།",
        "cannotdelete": "ཤོག་ངོས་འམ་ཡིག་ཆ་ \"$1\" འདི་སུབས་ཐུབ་མ་ཀྱི་མིན་འདུག། ཕལ་ཆེར་གཞན་ཞིག་གི་སུབས་ཚར་འདུག།",
        "cannotdelete-title": "ཤོག་ངོས་ \"$1\" འདི་སུབས་ཐུབ་མ་སོང།",
        "delete-hook-aborted": "འབྲི་སུབས་འདི་བཀག་འགོག་བྱས་སོང། རྒྱུ་རྐྱེན་བྲིས་མིན་འདུག།",
+       "no-null-revision": "\"$1\" ཤོག་ངོས་འདིར་བསྐྱར་བཅོས་གསར་སྐྲུན་བྱེད་ཐུབ་མ་སོང།",
        "badtitle": "ཁ་བྱང་སྐྱོན་ཅན།",
+       "badtitletext": "རེ་སྐུལ་བྱས་པའི་ཤོག་ངོས་འདི་སྟོང་པའམ་ཡང་ན་ཁ་བྱང་ནོར་འདུག། ཁ་བྱང་འབྲི་སྟངས་ནོར་ཡོད་སྲིད།",
+       "perfcached": "གཤམ་གི་གྲངས་ཐོ་འདི་སྦས་སྐུངས་རེད་འདུག་པས་དུས་ཐོག་གསར་འཇོག་བྱེད་མི་ཐུབ། མང་མཐར་ཡང་ {{PLURAL:$1|གྲུབ་འབྲས་}} ཙམ་སྦས་སྐུངས་ནང་འདུག།",
+       "perfcachedts": "གཤམ་གི་གྲངས་ཐོ་འདི་སྦས་སྐུངས་རེད་འདུག། མཐའ་མའི་དུས་ཐོག་གསར་འཇོག་$1 མང་མཐར་ཡང་ {{PLURAL:$1|གྲུབ་འབྲས་}} ཙམ་སྦས་སྐུངས་ནང་འདུག།",
        "viewsource": "ཁོངས་ལ་ལྟ་བ།",
        "actionthrottled": "བྱ་འགུལ་ཁེགས་སོང་།",
        "namespaceprotected": "ཁྱེད་ལ་'''$1''' མིང་གནས་ནང་གི་ཤོག་ངོས་བཟོ་བཅོས་ཀྱི་ཆོག་མཆན་མེད།",
index d1458cc..4bc60d0 100644 (file)
@@ -13,7 +13,7 @@
        "tog-underline": "КӀел сиз хьакха хьажорган:",
        "tog-hideminor": "Къайладаха кигийра нисдарш оц могӀама керла хийцамехь",
        "tog-hidepatrolled": "Къайладаха гӀаролладина нисдарш оц могӀама керла нисдаршкахь",
-       "tog-newpageshidepatrolled": "Къайлайаха гlароллайина агlонаш оц могlама керла агlонашкахь",
+       "tog-newpageshidepatrolled": "Къайлаяха гӀароллайина агӀонаш оьцу могӀама керла агӀонашкахь",
        "tog-extendwatchlist": "Шорбина тlехьажарна могlам, ша беригге а хийцамаш чубогlуш, тlяхьабина боцурш а",
        "tog-usenewrc": "Лелабе дика могӀам керла чу хийцамашна (оьшу JavaScript)",
        "tog-numberheadings": "Ша шех хlитто терахь корташна",
        "november-date": "Ноябрь $1",
        "december-date": "Декабрь $1",
        "pagecategories": "{{PLURAL:$1|1=Категори|Категореш}}",
-       "category_header": "Агlонаш оц категоречохь «$1»",
+       "category_header": "АгӀонаш категоречохь «$1»",
        "subcategories": "Бухаркатегореш",
        "category-media-header": "Файлаш оцу категори чохь «$1»",
        "category-empty": "''ХӀара категори хӀинца йаьсса ю.''",
        "jumpto": "Дехьа гӀо:",
        "jumptonavigation": "Навигаци",
        "jumptosearch": "лаха",
-       "view-pool-error": "Бехк цабиллар доьха, хӀинц гӀулкхдириг йоьттина ю.\nКаьчна дуккха дехарш хӀокху агӀонтӀе хьажарца.\nДехар до, собардеш а юха хьажа хӀокху агӀонтӀе жим тӀаьхьо.\n\n$1",
+       "view-pool-error": "Бехк цабиллар доьха, хӀинц сервераш йоьттина ю.\nКаьчна дуккха дехарш хӀокху агӀонтӀе хьажарца.\nДехар до, собардеш а юха хьажа хӀокху агӀонтӀе жим тӀаьхьо.\n\n$1",
+       "generic-pool-error": "Бехк цабиллар доьха, хӀинц сервер йоьттина ю.\nКаьчна дуккха дехарш хӀокху агӀонтӀе хьажарца.\nДехар до, собардеш а юха хьажа хӀокху агӀонтӀе жим тӀаьхьо.",
        "pool-timeout": "Блоктоха еза хан тӀех йаьлла",
        "pool-queuefull": "Дехаршан чоь юьззина ю",
        "pool-errorunknown": "Дойзаш доцу гlалат",
        "statistics-header-users": "Декъашхойн жамӀа",
        "statistics-header-hooks": "Кхин статистика",
        "statistics-articles": "Яззамаш",
-       "statistics-pages": "Агlонаш",
+       "statistics-pages": "АгӀонаш",
        "statistics-pages-desc": "Массо вики агlонаш, дийцаре агlонашцани, дlасахьаждарш а кхин дерш.",
        "statistics-files": "Чуйаьхна файлаш",
        "statistics-edits": "Нисдаран дукхалла {{grammar:genitive|{{SITENAME}}}} дlа йолайаларца",
        "listusers-desc": "Харжа къезиг хиларца",
        "usereditcount": "$1 {{PLURAL:$1|нисдар|нисдарш}}",
        "usercreated": "{{GENDER:$3|дӀавазвелла|дӀаязелла}} $1 $2",
-       "newpages": "Керла агlонаш",
+       "newpages": "Керла агӀонаш",
        "newpages-username": "Декъашхо:",
        "ancientpages": "Яззамаш оцу терахьца тӀаьххьара тадар дина долу",
        "move": "ЦӀе хийца",
        "allarticles": "Массо агӀонаш",
        "allinnamespace": "Массо агlонаш оцу цlери анахь «$1»",
        "allpagessubmit": "Кхочушдé",
-       "allpagesprefix": "Лаха агlонаш, дlайуьлалуш йолу:",
+       "allpagesprefix": "Лаха агӀонаш, дӀайолалуш йолу:",
        "allpagesbadtitle": "Цамагош йолу агӀон цӀе. Коьрта могӀан юкъах ю юкъарвики меттанашан юкъе тӀечӀагӀйина йолу хьаьрк йа магийна доцу оцу коьрта моӀанца символаш йа кхин.",
-       "allpages-bad-ns": "{{SITENAME}} кху чохь ана цlераш яц «$1».",
+       "allpages-bad-ns": "{{SITENAME}} кху чохь ана цӀераш яц «$1».",
        "allpages-hide-redirects": "Къайлаяха дӀасахьажийнарш",
        "cachedspecial-refresh-now": "Хьажа тӀехьарчу версега.",
        "categories": "Категореш",
        "move-talk-subpages": "ЦӀе хийца бухара агӀонаши а агӀонашан дийцаре а ($1  кхаччалц)",
        "movepage-page-exists": "Агӏо $1 йолуш ю цундела и ша юху дӏаязъян йиш яц.",
        "movepage-page-moved": "АгӀона $1 цӀе хийцина → $2.",
-       "movelogpage": "Цlераш хийцаран тептар",
+       "movelogpage": "ЦӀераш хийцаран тептар",
        "movelogpagetext": "Лахахьа гойтуш ю цӀе хийцина агӀонаш.",
        "movesubpage": "{{PLURAL:$1|1=Бухара агӀо|Бухара агӀонаш}}",
        "movesubpagetext": "ХӀокху агӀона $1 {{PLURAL:$1|1=бухара агӀо ю|бухара агӀонаш ю}}.",
        "specialpages": "Леррина агlонаш",
        "specialpages-note": "* Гуттарлера белха агlонаш.\n* <strong class=\"mw-specialpagerestricted\">Кlеззиг таронаш йолу леррина агlонаш.</strong>",
        "specialpages-group-maintenance": "Жамlаш гlирса хьашташ кхочушдар",
-       "specialpages-group-other": "Ð\9aÑ\85ин Ð³lÑ\83ллакÑ\85ан Ð°Ð³lонаш",
+       "specialpages-group-other": "Ð\9aÑ\85ин Ð±ÐµÐ»Ñ\85ан Ð°Ð³Ó\80онаш",
        "specialpages-group-login": "Системин чугӀо / дӀаяздар кхолла",
        "specialpages-group-changes": "Керла нисдарш а тéптарш",
        "specialpages-group-media": "Жамlаш оцу медиа-гlирсашан а чуяхарш",
        "specialpages-group-users": "Декъашхой а бакъонаш",
-       "specialpages-group-highuse": "Уггаре дукха лелайо агlонаш",
+       "specialpages-group-highuse": "Уггаре дукха лелайо агӀонаш",
        "specialpages-group-pages": "АгӀонийн могӀанаш",
        "specialpages-group-pagetools": "ГӀирсаш оцу агӀонашан",
        "specialpages-group-wiki": "Хаамаш а гӀирсаш а",
-       "specialpages-group-redirects": "Дlасахьажош йолу гlуллакхан агlонаш",
+       "specialpages-group-redirects": "ДӀасахьажош йолу белхан агӀонаш",
        "specialpages-group-spam": "Спаман дуьхьала гӀирсаш",
        "blankpage": "Йаьсса агlо",
        "tags": "Болш болу хийцаман къастам",
index 2c3bf61..30b1cb3 100644 (file)
        "vector-action-move": "بیگوازەوە",
        "vector-action-protect": "بیپارێزە",
        "vector-action-undelete": "سڕینەوە بگەڕێنەوە",
-       "vector-action-unprotect": "پاراستنی بگۆڕە",
+       "vector-action-unprotect": "پاراستن بگۆڕە",
        "vector-view-create": "دروستکردن",
        "vector-view-edit": "دەستکاریی بکە",
        "vector-view-history": "مێژووەکەی ببینە",
        "views": "بینینەکان",
        "toolbox": "ئامرازەکان",
        "userpage": "بینینی پەڕەی بەکارھێنەر",
-       "projectpage": "په‌ڕه‌ی پرۆژه‌ نیشانبده‌",
+       "projectpage": "پەڕەی پرۆژە نیشان بدە",
        "imagepage": "پەڕەی پەڕگە نیشان بدە",
-       "mediawikipage": "په‌ڕه‌ی په‌یام نیشانبده‌",
+       "mediawikipage": "پەڕەی پەیام نیشان بدە",
        "templatepage": "په‌ڕه‌ی داڕێژە ببینە‌",
        "viewhelppage": "په‌ڕه‌ی یارمه‌تی نیشانبده‌",
        "categorypage": "په‌ڕه‌ی هاوپۆل نیشانبده‌",
        "viewsourceold": "سەرچاوەکەی ببینە",
        "editlink": "دەستکاری",
        "viewsourcelink": "سەرچاوەکەی ببینە",
-       "editsectionhint": "دەستکاری کردنی بەشی: $1",
+       "editsectionhint": "دەستکاریکردنی بەش: $1",
        "toc": "پێرست",
        "showtoc": "نیشانیبدە",
        "hidetoc": "بیشارەوە",
-       "collapsible-collapse": "کۆیبکەوە",
-       "collapsible-expand": "بڵاویبکەوە",
+       "collapsible-collapse": "کۆی بکەوە",
+       "collapsible-expand": "بڵاوی بکەوە",
        "thisisdeleted": "$1 نیشان بدە یا بھێنەوە؟",
        "viewdeleted": "$1 نیشان بده‌؟",
        "restorelink": "{{PLURAL:$1|یەک گۆڕانکاریی سڕاو|$1 گۆڕانکاریی سڕاو}}",
        "nstab-category": "پۆل",
        "nosuchaction": "کردارێک بەم شێوە نییە",
        "nosuchactiontext": "ئەو چالاکییەی لە لایەن بەستەرەوە دیاریکراوە ناتەواوە.\nلەوانەیە بە هەڵە بەستەرەکەت نووسیبێت، یان بەستەرێکی هەڵەی بە دواوە بێت.\nلەوانەیە ئەمە نیشانەی هەڵەیەک بێت لەو نەرمەکاڵایەی کە بەکاردێت لە لایەن {{SITENAME}}.",
-       "nosuchspecialpage": "په‌ڕه‌ی تایبه‌تی له‌و شێوه‌یه‌ نییه‌",
+       "nosuchspecialpage": "پەڕەی تایبەتی ئاوا بوونی نییە",
        "nospecialpagetext": "<strong>پەڕەیەکی تایبەت دەخوازیت کە بوونی نیە.</strong>\n\nلیستێکی پەڕە تایبەتە دروستەکان لە [[Special:SpecialPages|{{int:specialpages}}]] لە بەردەست‌دایە.",
        "error": "هه‌ڵه‌",
        "databaseerror": "ھەڵەی بنکەدراوه",
        "enterlockreason": "هۆیەک بۆ قوفڵ‌کردنەکە بنووسە کە  تێیدا کاتی کردنەوەی قۆفڵەکە باس کرابێت",
        "readonlytext": "بنکەدراوەکە لەم کاتەدا  لەبەر چاکسازی ئاسایی بۆ نوسینی نوێ و دەستکاری قوفڵ کراوه. دوای ئەوە ئەگرێتەوە بۆ ئاستی خۆی.\n\nئەو بەڕێوبەرەی کە قوفڵی کردووه ئەم ڕوون‌کردنەوەی نووسیوە : $1",
        "missing-article": "داتابەیسەکە نەیتوانی دەقی پەڕەیەک بەناوی «$1» $2  بدۆزێتەوە کە دەبوا بیدۆزیبایەتەوە.\n\nئەمە زیاتر لە بەدواچوونی بەستەری جیاوازی یان مێژووی کۆنی پەڕەیەکی سڕدراو ڕوودەدات.\n\nئەگەر وا نەبێت، ئەوا ڕەنگە گرفتێکت لەم نەرمامێرەدا دۆزیبێتەوە.\nتکایە ئەمە بە ئاماژەدان بە ناونیشانی URLـەکەیەوە بە [[Special:ListUsers/sysop|بەڕێوبەرێک]] ڕاپۆرت بدە.",
-       "missingarticle-rev": "(Ù¾Û\8cاچوونەوە#: $1)",
+       "missingarticle-rev": "(Ù¾Û\8eداچوونەوە#: $1)",
        "missingarticle-diff": "(جیاوازی: $1، $2)",
        "readonly_lag": "بنكه‌دراوه‌كه‌ به‌شێوه‌ی خۆكار به‌ندكراوه‌، له‌كاتێكدا بنكه‌دراوه‌ی ڕاژه‌كاره‌كه‌ ڕۆڵی له‌خۆگرتن ده‌گێڕێت",
        "internalerror": "ھەڵەی ناوخۆیی",
        "cannotdelete-title": "ناکرێ پەڕەی «$1» بسڕدرێتەوە",
        "delete-hook-aborted": "سڕینەوە لە لایەن قولاپەوە ھەڵوەشێنرایەوە.\nھۆکارەکەی لەبەر دەست نییە.",
        "no-null-revision": "نەتوانرا پێداچوونەوەی خاڵیی بۆ پەڕەی \"$1\" درووست بکرێت",
-       "badtitle": "ناونیشانی خراپ",
+       "badtitle": "سەردێڕی خراپ",
        "badtitletext": "سەرناوی پەڕەی داواکراو بەتاڵە، واڵایە یان سەرناوێکی نێوان-زمانی یان نێوانی-ویکییە کە بە شێوەیەکی ھەڵە بەستەری بۆ دراوە.\nڕەنگە یەک یان چەند کاراکتەری تێدا بێت کە ناکرێت لە سەرناوەکاندا بەکار بھێنرێت.",
        "perfcached": "داتای خوارەوە پاشەکەوتکراوەیە و لەوانەیە بەڕۆژنەکرابێتەوە. لانی زۆر {{PLURAL:$1|یەک ئەنجام|$1 ئەنجام}} لە cacheدا لەبەردەستدایە.",
        "perfcachedts": "داتای خوارەوە cacheکراوە و دوایین جار لە $1 نوێ کراوەتەوە. لە cacheدا لانی زۆر {{PLURAL:$4|یەک ئەنجام|$4 ئەنجام}} لەبەردەستە.",
        "passwordreset-username": "ناوی بەکارھێنەری:",
        "passwordreset-domain": "پاوان:",
        "passwordreset-capture": "بینینی ئیمەیڵی ئەنجام؟",
-       "passwordreset-email": "ئەدرەسی ئیمەیڵ:",
+       "passwordreset-email": "ناونیشانی ئیمەیل:",
        "passwordreset-emailtitle": "وردەکارییەکانی ھەژمار لە {{SITENAME}}",
        "passwordreset-emailtext-ip": "‫کەسێک (لەوانەیە خۆت، بە ناونیشانی ئایپیی $1) داوای ڕیسێتکردنەوەی تێپەڕوشەکەت لە {{SITENAME}}دا ($4) کردووە. {{PLURAL:$3|ھەژماری بەکارھێنەریی ژێرەوە پەیوەندیی ھەیە|ھەژمارە بەکارھێنەرییەکانی ژێرەوە پەیوەندییان ھەیە}} بەم ناونیشانەی ئیمەیلەوە:\n\n$2\n\n{{PLURAL:$3|ئەم تێپەڕوشە کاتییە|ئەم تێپەڕوشە کاتییانە}} لە {{PLURAL:$5|ڕۆژێک|$5 ڕۆژ}}دا بەسەردەچێت.\nدەبێ بچیتە ژوورەوە و ھەر ئێستا تێپەڕوشەیەکی نوێ ھەڵبژێریت. ئەگەر کەسێکی تر ئەم داواکارییەی کردووە،\nیان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، دەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
        "passwordreset-emailtext-user": "‫بەکارھێنەر $1 لە {{SITENAME}} ڕیسێتکردنەوەی تێپەڕوشەکەت لە {{SITENAME}}دا ($4) کردووە. {{PLURAL:$3|ھەژماری بەکارھێنەریی ژێرەوە پەیوەندیی ھەیە|ھەژمارە بەکارھێنەرییەکانی ژێرەوە پەیوەندییان ھەیە}} بەم ناونیشانەی ئیمەیلەوە:\n\n$2\n\n{{PLURAL:$3|ئەم تێپەڕوشە کاتییە|ئەم تێپەڕوشە کاتییانە}} لە {{PLURAL:$5|ڕۆژێک|$5 ڕۆژ}}دا بەسەردەچێت.\nدەبێ بچیتە ژوورەوە و ھەر ئێستا تێپەڕوشەیەکی نوێ ھەڵبژێریت. ئەگەر کەسێکی تر ئەم داواکارییەی کردووە، یان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، \nدەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
        "passwordreset-emailsent": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا.",
        "passwordreset-emailsent-capture": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا، کە لە ژێرەوە نیشان دراوە.",
        "passwordreset-emailerror-capture": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا، کە لە ژێرەوە نیشان دراوە، بەڵام ناردنەکەی بۆ {{GENDER:$2|بەکارھێنەر}} سەرکەوتوو نەبوو: $1",
-       "changeemail": "ئەدرەسی ئیمەیڵ بگۆڕە",
-       "changeemail-header": "ئەدرەسی ئیمەیلی ھەژمار بگۆڕە",
+       "changeemail": "ناونیشانی ئیمەیل بگۆڕە",
+       "changeemail-header": "ناونیشانی ئیمەیلی ھەژمار بگۆڕە",
        "changeemail-no-info": "بۆ گەیشتنی راستەوخۆ بەم پەڕە دەبێت بچیتە ژوورەوە.",
        "changeemail-oldemail": "ئەدرەسی ئیمەیڵی ئێستا:",
-       "changeemail-newemail": "ئەدرەسی ئیمەیڵی نوێ:",
+       "changeemail-newemail": "ناونیشانی ئیمەیلی نوێ:",
        "changeemail-none": "(ھیچ)",
        "changeemail-password": "تێپەڕوشەکەت لە {{SITENAME}}:",
-       "changeemail-submit": "ئەمەیڵ بگۆڕە",
+       "changeemail-submit": "ئەمەیل بگۆڕە",
        "changeemail-cancel": "ھەڵیوەشێنەوە",
        "bold_sample": "دەقی ئەستوور",
        "bold_tip": "دەقی ئەستوور",
        "cantcreateaccount-text": "درووست‌کردنی هەژمارە بۆ ناونیشانی ئای‌پی ('''$1''') لە لایەن [[User:$3|$3]] داخراوە.<br /><br />\n$3 هۆکاری \"$2\" خستوەتەڕوو",
        "viewpagelogs": "لۆگەکانی ئەم پەڕەیە ببینە",
        "nohistory": "هیچ مێژوویەکی دەستکاری نییە بۆ ئەم پەڕەیە.",
-       "currentrev": "دÙ\88اÛ\8cÛ\8cÙ\86 Ù¾Û\8cاچوونەوە",
+       "currentrev": "دÙ\88اÛ\8cÛ\8cÙ\86 Ù¾Û\8eداچوونەوە",
        "currentrev-asof": "دوایین پێداچوونەوەی $1",
-       "revisionasof": "Ù\88Û\95Ú© Ù¾Û\8cاچوونەوەی $1",
+       "revisionasof": "Ù\88Û\95Ú© Ù¾Û\8eداچوونەوەی $1",
        "revision-info": "پێداچوونەوی $1 لە لایەن $2",
        "previousrevision": "→پیاچوونەوەی کۆنتر",
-       "nextrevision": "Ù¾Û\8cاچوونەوەی نوێتر←",
-       "currentrevisionlink": "Ù¾Û\8cاچوونەوەی ئێستا",
+       "nextrevision": "Ù¾Û\8eداچوونەوەی نوێتر←",
+       "currentrevisionlink": "Ù¾Û\8eداچوونەوەی ئێستا",
        "cur": "ئێستا",
        "next": "پاش",
        "last": "پێشوو",
        "mypreferences": "ھەڵبژاردەکان",
        "prefs-edits": "ژمارەی گۆڕانکارییەکان:",
        "prefs-skin": "پێستە",
-       "skin-preview": "پێش بینین",
+       "skin-preview": "پێشبینین",
        "datedefault": "ھەڵنەبژێردراو",
        "prefs-labs": "کەرەسەکانی تاقیگەکان",
        "prefs-user-pages": "پەڕە بەکارھێنەرییەکان",
        "prefs-personal": "پرۆفایلی بەکارھێنەر",
        "prefs-rc": "دوایین گۆڕانکارییەکان",
-       "prefs-watchlist": "Ù\84Û\8cستی چاودێری",
+       "prefs-watchlist": "Ù¾Û\8eرستی چاودێری",
        "prefs-watchlist-days": "ژمارەی ڕۆژەکان بۆ نیشاندان لە لیستی چاودێری:",
        "prefs-watchlist-days-max": "ئەوپەڕی $1 {{PLURAL:$1|ڕۆژە|ڕۆژە}}",
        "prefs-watchlist-edits": "ئەوپەڕی ژمارەی گۆڕانکارییەکان بۆ نیشاندان لە لیستی چاودێریی پەرەپێدراو:",
        "timezoneuseoffset": "دیکە (ناتەواویەکان دیاری بکە)",
        "servertime": "کاتی ڕاژەکار:",
        "guesstimezone": "لە وێبگەڕەکە بیگرە",
-       "timezoneregion-africa": "ئافریقا",
+       "timezoneregion-africa": "ئەفریقا",
        "timezoneregion-america": "ئەمریکا",
        "timezoneregion-antarctica": "ئانتارکتیکا",
        "timezoneregion-arctic": "ئارکتیک",
        "timezoneregion-pacific": "ئۆقیانووسی ئارام",
        "allowemail": "ڕێگە بدە بە بەکارھێنەرانی تر کە ئیمەیلم بۆ بنێرن",
        "prefs-searchoptions": "گەڕان",
-       "prefs-namespaces": "بۆشاییناوەکان",
+       "prefs-namespaces": "بۆشایی ناوەکان",
        "defaultns": "دەنا لەم بۆشاییی ناوانەدا بگەڕێ:",
        "default": "بنچینەیی",
        "prefs-files": "پەڕگەکان",
        "userrights-changeable-col": "ئەو گرووپانەی دەتوانی بیگۆڕی",
        "userrights-unchangeable-col": "ئەو گرووپانەی ناتوانی بیگۆڕی",
        "group": "گرووپ:",
-       "group-user": "بەکارهێنەران",
+       "group-user": "بەکارھێنەران",
        "group-autoconfirmed": "بەکارھێنەرانی پەسندکراوی خۆگەڕ",
        "group-bot": "بۆتەکان",
        "group-sysop": "بەڕێوەبەران",
        "right-siteadmin": "داخستن و کردنەوەی بنکەدراو",
        "right-override-export-depth": "هەناردنی لاپەڕەکان کە لاپەڕەکانی بەستەر پێ‌دراو تا قووڵایی 5 لەخۆ بگرێت",
        "right-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
+       "right-passwordreset": "دیتنی ئیمەیلەکانی ڕێکخستنەوەی تێپەڕوشە",
        "newuserlogpage": "لۆگی دروستکردنی بەکارھێنەر",
        "newuserlogpagetext": "ئەمە لۆگێکی دروستکردنی بەکارھێنەرە.",
        "rightslog": "لۆگی مافەکانی بەکارھێنەر",
        "rightslogtext": "ئەمە لۆگی دەستکاری مافەکانی بەکار‌هێنەرە.",
        "action-read": "خوێندنەوەی ئەم پەڕە",
        "action-edit": "دەستکاریی ئەم پەڕەیە",
-       "action-createpage": "درووست‌کردنی لاپەڕە",
-       "action-createtalk": "درووست‌کردنی لەپەڕەکانی وتووێژ",
+       "action-createpage": "دروستکردنی پەڕەکان",
+       "action-createtalk": "دروستکردنی پەڕەکانی وتووێژ",
        "action-createaccount": "درووست‌کردنی هەژمارەی ئەم بەکارهێنەرە",
        "action-minoredit": "نیشان‌کردنی ئەم دەستکاریە وەک بچووک",
-       "action-move": "گواستنەوەی ئەم پەڕە",
+       "action-move": "گواستنەوەی ئەم پەڕەیە",
        "action-move-subpages": "گواستنەوەی ئەم پەڕەیە و ژێرپەڕەکانی",
-       "action-move-rootuserpages": "Ú¯Ù\88استÙ\86Û\95Ù\88Û\95Û\8c Ø¨Ù\86Û\95رÛ\95تÛ\8c Ù\84اپÛ\95Ú\95Û\95کاÙ\86Û\8c Ø¨Û\95کارÙ\87ێنەر",
+       "action-move-rootuserpages": "Ú¯Ù\88استÙ\86Û\95Ù\88Û\95Û\8c Ø¨Ù\86Û\95رÛ\95تÛ\8c Ù¾Û\95Ú\95Û\95کاÙ\86Û\8c Ø¨Û\95کارھێنەر",
        "action-movefile": "ئەم پەڕگەیە بگوازەوە",
        "action-upload": "ئەم پەڕەیە بار بکە",
        "action-reupload": "سەرنووسینی ئەم پەڕگە وا هەیە",
        "action-upload_by_url": "ئەم پەرگەیە لە ناونیشانێکی ئینتەرنێتی بار بکە",
        "action-writeapi": "کەڵک وەر گرتن لە نووسینی API",
        "action-delete": "ئەم پەڕەیە بسڕەوە",
-       "action-deleterevision": "سÚ\95Û\8cÙ\86Û\8c Ø¦Û\95Ù\85 Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88ە",
-       "action-deletedhistory": "دÛ\8cتÙ\86Û\8c Ù\85Û\8eÚ\98Ù\88Ù\88Û\8c Ø³Ú\95اÙ\88Û\95Û\8c Ø¦Û\95Ù\85 Ù\84اپÛ\95Ú\95ە",
+       "action-deleterevision": "سÚ\95Û\8cÙ\86Û\95Ù\88Û\95Û\8c Ø¦Û\95Ù\85 Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95Û\8cە",
+       "action-deletedhistory": "دÛ\8cتÙ\86Û\8c Ù\85Û\8eÚ\98Ù\88Ù\88Û\8c Ø³Ú\95اÙ\88Û\95Û\8c Ø¦Û\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cە",
        "action-browsearchive": "گەران لە نێو لاپەڕە سڕاوەکان",
        "action-undelete": "گەڕانەوەی ئەم لاپەڕە",
        "action-suppressrevision": "چاوپێداخشان و هاردنوەی ئەم لاپەڕە شاراوە",
        "action-suppressionlog": "دیتنی ئەم لۆگە ئەهلیە",
        "action-block": "بەربەست کردنی ئەم بەکارهێنەرە بۆ دەستکاری‌کردن",
-       "action-protect": "گۆڕانی ئاستی پارێزراوی بۆ ئەم لاپەڕە",
+       "action-protect": "گۆڕینی ئاستی پاراستن بۆ ئەم پەڕەیە",
        "action-rollback": "گەڕاندنەوەی خێرای دەستکاریەکانی دوایین بەکارھێنەر کە پەڕەیەکی دیاریکراوی دەستکاری کردووە",
        "action-import": "ھاوردنی پەڕەکان لە ویکییەکی ترەوە",
        "action-importupload": "ھاوردنی پەڕەکان لە پەڕگەیەکی بارکراو",
        "action-sendemail": "ناردنی ئیمەیلەکان",
        "action-viewmywatchlist": "دیتنی پێرستی چاودێریت",
        "nchanges": "$1 {{PLURAL:$1|گۆڕانکاری}}",
+       "enhancedrc-history": "مێژوو",
        "recentchanges": "دوایین گۆڕانکارییەکان",
        "recentchanges-legend": "ھەڵبژاردەکانی دوایین گۆڕانکارییەکان",
        "recentchanges-summary": "لەم پەڕەیەدا شوێنی دوایین گۆڕانکارییەکانی ویکی بکەوە.",
        "rcshowhideanons-show": "نیشان بدە",
        "rcshowhideanons-hide": "بشارەوە",
        "rcshowhidepatr": "گۆرانکارییە پاس دراوەکان $1",
+       "rcshowhidepatr-show": "نیشان بدە",
        "rcshowhidemine": "دەستکارییەکانم $1",
        "rcshowhidemine-show": "نیشان بدە",
        "rcshowhidemine-hide": "بشارەوە",
        "filedesc": "کورتە",
        "fileuploadsummary": "کورتە:",
        "filereuploadsummary": "گۆرانکارییەکانی پەڕگە:",
-       "filestatus": "بارودۆخی مافی لەبەرگرتنەوە:",
+       "filestatus": "ڕەوشی مافی لەبەرگرتنەوە:",
        "filesource": "سەرچاوە:",
        "ignorewarning": "چاوپۆشان لە ئاگادارییەکان و پاشەکەوت کردن بە هەر شێوەیەک",
        "ignorewarnings": "گوێ مەدە بە ئاگادارییەکان",
        "unusedtemplateswlh": "بەستەرەکانی تر",
        "randompage": "پەڕەیەک بە هەڵکەوت",
        "randompage-nopages": "هیچ لاپەڕەیەک لەم {{PLURAL:$2|ناوبۆشاییەدا|ناوبۆشاییانەدا}} نیە: $1.",
+       "randomincategory-selectcategory-submit": "بڕۆ",
        "randomredirect": "ڕەوانەکەری ھەرمەکی",
        "randomredirect-nopages": "لە ناوبۆشایی \"$1\" هیچ ڕەوانکەرێک نییە.",
        "statistics": "ئامارەکان",
        "mostrevisions": "پەڕەکان بە زۆرترین پێداچوونەوەکان",
        "prefixindex": "ھەموو پەڕەکان بە پێشگرەوە",
        "prefixindex-namespace": "هەموو پەڕەکان بەپێشگری (بۆشایی ناوی $1)",
+       "prefixindex-strip": "پێشگری ناو پێرست بقرتێنە",
        "shortpages": "پەڕە کورتەکان",
        "longpages": "پەڕە درێژەکان",
        "deadendpages": "پەڕە بنبەستەکان",
        "protectedpages-indef": "تەنیا پاراستنە بێسنوورەکان",
        "protectedpages-cascade": "تەنیا پاراستنە زنجیرییەکان",
        "protectedpagesempty": "هیچ لاپەڕەیک ئێستا بەم دیاریکراوانە نەپارێزراوە.",
+       "protectedpages-page": "پەڕە",
        "protectedtitles": "سەرناوە پارێزراوەکان",
        "protectedtitlesempty": "ھیچ سەرناوێک بەم سنوورانەوە ئێستا نەپارێزراوە.",
        "listusers": "پێرستی بەکارھێنەران",
        "listusers-editsonly": "تەنیا ئەو بەکارھێنەرانە نیشان بدە کە دەستکارییان کردووە",
        "listusers-creationsort": "ڕیزکردن بە پێی ڕێکەوتی دروستکردن",
+       "listusers-desc": "ڕیزکردنی بەرەوە ژێر",
        "usereditcount": "$1 {{PLURAL:$1|دەستکاری|دەستکاری}}",
        "usercreated": "لە $1، $2 {{GENDER:$3|دروست کراوە}}",
        "newpages": "پەڕە نوێکان",
        "listgrouprights-removegroup-self": "لابردنی {{PLURAL:$2|گرووپ|گرووپەکان}} لە سەر ھەژماری خۆی: $1",
        "listgrouprights-addgroup-self-all": "زیادکردنی ھەموو گرووپەکان بۆ سەر ھەژماری خۆی",
        "listgrouprights-removegroup-self-all": "لابردنی هەموو گرووپەکان له‌ سه‌ر هه‌ژماری خۆ",
-       "listgrouprights-namespaceprotection-namespace": "بۆشاییی ناو",
+       "listgrouprights-namespaceprotection-header": "سنوورداریی بۆشایی ناو",
+       "listgrouprights-namespaceprotection-namespace": "بۆشایی ناو",
+       "listgrouprights-namespaceprotection-restrictedto": "مافی رێ‌پێدراوی بەکارھێنەر بۆ دەستکاری",
        "trackingcategories-name": "ناوی پەیام",
        "mailnologin": "ناونیشان بۆ ناردن نییه‌",
        "mailnologintext": "ده‌بێ له‌ [[Special:UserLogin|ژووره‌وه‌]] بیت و ناونیشانێکی بڕواپێ‌کراوی ئی‌مه‌یلت له‌ ناو [[Special:Preferences|هه‌ڵبژارده‌کان]] دیاری کردبێت تا بتوانی ئی‌مه‌یل بنێریت بۆ به‌کارهێنه‌رانی دیکه‌.",
index 1a7cd6f..ed5232a 100644 (file)
        "jumptonavigation": "navigace",
        "jumptosearch": "hledání",
        "view-pool-error": "Promiňte, servery jsou momentálně přetíženy.\nTuto stránku si právě prohlíží příliš mnoho uživatelů.\nPřed tím, než ji zkusíte načíst znovu, chvíli počkejte.\n\n$1",
+       "generic-pool-error": "Promiňte, servery jsou momentálně přetíženy.\nTento zdroj si právě prohlíží příliš mnoho uživatelů.\nProsím, před dalším pokusem o přístup chvíli počkejte.",
        "pool-timeout": "Při čekání na zámek vypršel časový limit",
        "pool-queuefull": "Fronta ve fondu je plná",
        "pool-errorunknown": "Neznámá chyba",
        "rollbacklinkcount-morethan": "vrácení více než $1 {{PLURAL:$1|editace|editací}} zpět",
        "rollbackfailed": "Nešlo vrátit zpět",
        "cantrollback": "Nelze vrátit zpět poslední editaci, neboť poslední přispěvatel je jediným autorem této stránky.",
-       "alreadyrolled": "Nelze vrátit zpět poslední editaci [[:$1]] od uživatele [[User:$2|$2]] ([[User talk:$2|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), protože někdo jiný již stránku editoval nebo vrátil tuto změnu zpět.\n\nPoslední editaci této stránky {{PLURAL:$3|provedl|provedla|provedl uživatel}} [[User:$3|$3]] ([[User talk:$3|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "Nelze vrátit zpět poslední editaci [[:$1]] od uživatele [[User:$2|$2]] ([[User talk:$2|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]), protože někdo jiný již stránku editoval nebo vrátil tuto změnu zpět.\n\nPoslední editaci této stránky {{GENDER:$3|provedl|provedla|provedl uživatel}} [[User:$3|$3]] ([[User talk:$3|diskuse]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Shrnutí editace bylo: ''„$1“''.",
        "revertpage": "Editace uživatele „[[Special:Contributions/$2|$2]]“ ([[User talk:$2|diskuse]]) vráceny do předchozího stavu, jehož autorem je „[[User:$1|$1]]“",
        "revertpage-nouser": "Editace skrytého uživatele vráceny do předchozího stavu, jehož {{GENDER:$1|autorem|autorkou}} je „[[User:$1|$1]]“",
        "unblockiptext": "Tímto formulářem je možno obnovit právo blokované IP adresy či uživatele opět přispívat do {{grammar:2sg|{{SITENAME}}}}.",
        "ipusubmit": "Odblokovat",
        "unblocked": "{{GENDER:$1|||Uživatel}} [[User:$1|$1]] {{GENDER:$1|byl odblokován|byla odblokována|byl odblokován}}.",
-       "unblocked-range": "$1 bylo odblokováno",
-       "unblocked-id": "Blok $1 byl zrušen",
+       "unblocked-range": "Rozsah $1 byl odblokován.",
+       "unblocked-id": "Blok $1 byl zrušen.",
        "blocklist": "Zablokovaní uživatelé",
        "ipblocklist": "Zablokovaní uživatelé",
        "ipblocklist-legend": "Hledat zablokovaného uživatele",
        "change-blocklink": "změnit blok",
        "contribslink": "příspěvky",
        "emaillink": "poslat e-mail",
-       "autoblocker": "{{GENDER:|Byl jste automaticky zablokován|Byla jste automaticky zablokována|Byli jste automaticky zablokováni}}, protože vaši IP adresu nedávno {{GENDER:$1|používal uživatel|používala uživatelka}} „[[User:$1|$1]]“.\nDůvod zablokování {{GENDER:$1|uživatele $1|uživatelky $1}}: „$2“",
+       "autoblocker": "Automatické zablokování kvůli tomu, že vaši IP adresu nedávno {{GENDER:$1|používal uživatel|používala uživatelka}} „[[User:$1|$1]]“.\nDůvod zablokování {{GENDER:$1|uživatele $1|uživatelky $1}}: „$2“",
        "blocklogpage": "Kniha zablokování",
        "blocklog-showlog": "{{GENDER:$1|Tento uživatel byl dříve blokován.|Tato uživatelka byla dříve blokována.|Tento uživatel byl dříve blokován.}}\nZde je pro přehled zobrazen výpis z knihy zablokování:",
        "blocklog-showsuppresslog": "Tento uživatel byl zablokován a skryt. Zde je pro přehled zobrazen výpis záznamu utajení:",
        "ipb_expiry_temp": "Blokování skrytých uživatelských jmen by měla být trvalá.",
        "ipb_hide_invalid": "Tento účet nelze utajit; má více než $1 {{PLURAL:$1|editaci|editace|editací}}.",
        "ipb_already_blocked": "„$1“ již je zablokován.",
-       "ipb-needreblock": "$1 je již zablokován(a). Chcete změnit nastavení bloku?",
+       "ipb-needreblock": "$1 je již {{GENDER:zablokován|zablokována}}. Chcete změnit nastavení bloku?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Jiné zablokování|Jiná zablokování}}",
        "unblock-hideuser": "Tohoto uživatele nemůžete odblokovat, protože jeho uživatelské jméno bylo skryto.",
        "ipb_cant_unblock": "Chyba: Blokování s ID $1 nebylo nalezeno. Uživatel již možná byl odblokován.",
        "sorbs_create_account_reason": "Vaše IP adresa je uvedena na seznamu DNSBL jako otevřený proxy server. Z této adresy si nemůžete založit účet",
        "xffblockreason": "IP adresa uvedená v hlavičce X-Forwarded-For, ať už vaše, nebo patřící proxy serveru, který používáte, byla zablokována. Zdůvodnění tohoto zablokování: $1",
        "cant-see-hidden-user": "Uživatel, kterého se snažíte blokovat, už byl zablokován a skryt. Jelikož nemáte oprávnění hideuser, nemůžete si nastavení bloku tohoto uživatele prohlédnout ani ho změnit.",
-       "ipbblocked": "Nemůžete blokovat nebo odblokovávat jiné uživatele, {{GENDER:|sám|sama|sám}} jste {{GENDER:|zablokován|zablokována|zablokován}}",
-       "ipbnounblockself": "Nemáte dovoleno odblokovat {{GENDER:|sám|sama|sám}} sebe",
+       "ipbblocked": "Nemůžete blokovat nebo odblokovávat jiné uživatele, {{GENDER:|sám|sama|sám}} jste {{GENDER:|zablokován|zablokována|zablokován}}.",
+       "ipbnounblockself": "Nemáte dovoleno odblokovat {{GENDER:|sám|sama|sám}} sebe.",
        "lockdb": "Zamknout databázi",
        "unlockdb": "Odemknout databázi",
        "lockdbtext": "Pokud zamknete databázi, znemožníte ostatním editovat, upravovat nastavení, sledované stránky apod. Potvrďte, že to opravdu chcete udělat a že odemknete databázi hned po opravách.",
        "lockedbyandtime": "({{gender:$1|zamkl|zamkla|zamkl}} $1 $2 v $3)",
        "move-page": "Přesunout „$1“",
        "move-page-legend": "Přesunout stránku",
-       "movepagetext": "Použitím tohoto formuláře změníte název stránky a přesunete i celou její historii na nový název.\nPůvodní název se stane přesměrováním na nový název.\nPřesměrování na původní název můžete nechat aktualizovat automaticky.\nPokud nenecháte, nezapomeňte poté zkontrolovat [[Special:DoubleRedirects|dvojitá]] nebo [[Special:BrokenRedirects|přerušená]] přesměrování.\nJe na vaší zodpovědnosti zajistit, aby odkazy stále vedly tam, kam mají.\n\nStránku '''není možno''' přejmenovat, pokud pod cílovým názvem již nějaká stránka existuje, s výjimkou situace, kdy je cílová stránka přesměrováním na tuto stránku a nemá žádnou historii editací.\nTo znamená, že stránku můžete přesunout zpět na původní název, pokud uděláte chybu, a že nemůžete přepsat existující stránku.\n\n'''Upozornění!'''\nPřejmenování oblíbené stránky může být drastická a nečekaná změna;\nujistěte se, že chápete důsledky svého kroku před tím, než změnu provedete.",
-       "movepagetext-noredirectfixer": "Použitím tohoto formuláře změníte název stránky a přesunete i celou její historii na nový název.\nPůvodní název se stane přesměrováním na nový název.\nNezapomeňte poté zkontrolovat [[Special:DoubleRedirects|dvojitá]] nebo [[Special:BrokenRedirects|přerušená]] přesměrování.\nJe na vaší zodpovědnosti zajistit, aby odkazy stále vedly tam, kam mají.\n\nStránku '''není možno''' přejmenovat, pokud pod cílovým názvem již nějaká stránka existuje, s výjimkou situace, kdy je cílová stránka prázdná nebo je přesměrováním na tuto stránku a nemá žádnou historii editací.\nTo znamená, že stránku můžete přesunout zpět na původní název, pokud uděláte chybu, a že nemůžete přepsat existující stránku.\n\n'''Upozornění!'''\nPřejmenování oblíbené stránky může být drastická a nečekaná změna; ujistěte se, prosím, že chápete důsledky svého kroku před tím, než změnu provedete.",
-       "movepagetalktext": "Přidružená diskusní stránka, pokud existuje, bude automaticky přesunuta společně se stránkou, '''pokud:'''\n* Dosud neexistuje neprázdná diskusní stránka pod novým jménem a\n* nezrušíte křížek ve formuláři.\n\nV těchto případech musíte přesunout nebo sloučit stránky manuálně, jestliže si to přejete.",
+       "movepagetext": "Použitím tohoto formuláře změníte název stránky a přesunete i celou její historii na nový název.\nPůvodní název se stane přesměrováním na nový název.\nPřesměrování na původní název můžete nechat aktualizovat automaticky.\nPokud nenecháte, nezapomeňte poté zkontrolovat [[Special:DoubleRedirects|dvojitá]] nebo [[Special:BrokenRedirects|přerušená]] přesměrování.\nJe vaší zodpovědností zajistit, aby odkazy stále vedly tam, kam mají.\n\nStránku '''není možno''' přejmenovat, pokud pod cílovým názvem již nějaká stránka existuje, s výjimkou situace, kdy je cílová stránka přesměrováním na tuto stránku a nemá žádnou historii editací.\nTo znamená, že stránku můžete přesunout zpět na původní název, pokud uděláte chybu, a že nemůžete přepsat existující stránku.\n\n'''Upozornění!'''\nPřejmenování oblíbené stránky může být drastická a nečekaná změna;\npředtím, než změnu provedete, se ujistěte, že chápete důsledky svého kroku.",
+       "movepagetext-noredirectfixer": "Použitím tohoto formuláře změníte název stránky a přesunete i celou její historii na nový název.\nPůvodní název se stane přesměrováním na nový název.\nNezapomeňte poté zkontrolovat [[Special:DoubleRedirects|dvojitá]] nebo [[Special:BrokenRedirects|přerušená]] přesměrování.\nJe vaší zodpovědností zajistit, aby odkazy stále vedly tam, kam mají.\n\nStránku '''není možno''' přejmenovat, pokud pod cílovým názvem již nějaká stránka existuje, s výjimkou situace, kdy je cílová stránka prázdná nebo je přesměrováním na tuto stránku a nemá žádnou historii editací.\nTo znamená, že stránku můžete přesunout zpět na původní název, pokud uděláte chybu, a že nemůžete přepsat existující stránku.\n\n'''Upozornění!'''\nPřejmenování oblíbené stránky může být drastická a nečekaná změna; předtím, než změnu provedete, se prosím ujistěte, že chápete důsledky svého kroku.",
+       "movepagetalktext": "Přidružená diskusní stránka, existuje-li, bude automaticky přesunuta společně se stránkou, '''pokud:'''\n* dosud neexistuje neprázdná diskusní stránka pod novým jménem a\n* nezrušíte křížek ve formuláři.\n\nV těchto případech musíte přesunout nebo sloučit stránky manuálně, přejete-li si to.",
        "movearticle": "Přesunout stránku:",
        "moveuserpage-warning": "'''Upozornění:''' Chystáte se přesunout uživatelskou stránku. Uvědomte si prosím, že bude přesunuta pouze tato stránka, ale uživatel ''nebude'' přejmenován.",
        "movenologintext": "Pro přesouvání stránek se musíte [[Special:UserLogin|přihlásit]].",
        "movenotallowed": "Nemáte oprávnění k přesunu stránek.",
-       "movenotallowedfile": "Nemáte právo přesouvat soubory",
+       "movenotallowedfile": "Nemáte právo přesouvat soubory.",
        "cant-move-user-page": "Nemáte oprávnění přesouvat uživatelské stránky.",
        "cant-move-to-user-page": "Nemáte oprávnění přesouvat na uživatelskou stránku (pouze na podstránku uživatelské stránky).",
        "newtitle": "Na nový název:",
        "export-submit": "Exportovat",
        "export-addcattext": "Přidat stránky z kategorie:",
        "export-addcat": "Přidat",
-       "export-addnstext": "Přidat stránky z jmenného prostoru:",
+       "export-addnstext": "Přidat stránky ze jmenného prostoru:",
        "export-addns": "Přidat",
        "export-download": "Nabídnout uložení jako soubor",
        "export-templates": "Zahrnout šablony",
        "tooltip-ca-history": "Starší verze této stránky.",
        "tooltip-ca-protect": "Zamknout tuto stránku.",
        "tooltip-ca-unprotect": "Změnit zámek této stránky.",
-       "tooltip-ca-delete": "Smazat tuto stránku.",
-       "tooltip-ca-undelete": "Obnovit editace této stránky provedené před jejím smazáním.",
+       "tooltip-ca-delete": "Smazat tuto stránku",
+       "tooltip-ca-undelete": "Obnovit editace této stránky provedené před jejím smazáním",
        "tooltip-ca-move": "Přesunout tuto stránku",
        "tooltip-ca-watch": "Přidat tuto stránku mezi sledované",
        "tooltip-ca-unwatch": "Vyjmout tuto stránku ze sledovaných",
        "tooltip-ca-nstab-user": "Zobrazit uživatelskou stránku",
        "tooltip-ca-nstab-media": "Zobrazit stránku souboru",
        "tooltip-ca-nstab-special": "Toto je speciální stránka, kterou nelze editovat.",
-       "tooltip-ca-nstab-project": "Zobrazit stránku o wiki.",
-       "tooltip-ca-nstab-image": "Zobrazit stránku obrázku.",
-       "tooltip-ca-nstab-mediawiki": "Zobrazit systémovou zprávu.",
-       "tooltip-ca-nstab-template": "Zobrazit šablonu.",
-       "tooltip-ca-nstab-help": "Zobrazit stránku nápovědy.",
-       "tooltip-ca-nstab-category": "Zobrazit kategorii.",
+       "tooltip-ca-nstab-project": "Zobrazit stránku o wiki",
+       "tooltip-ca-nstab-image": "Zobrazit stránku obrázku",
+       "tooltip-ca-nstab-mediawiki": "Zobrazit systémovou zprávu",
+       "tooltip-ca-nstab-template": "Zobrazit šablonu",
+       "tooltip-ca-nstab-help": "Zobrazit stránku nápovědy",
+       "tooltip-ca-nstab-category": "Zobrazit kategorii",
        "tooltip-minoredit": "Označit změnu jako malou editaci",
        "tooltip-save": "Uložit vaše změny",
        "tooltip-preview": "Zobrazit náhled vašich změn; prosíme, zobrazte si ho před uložením!",
        "metadata-help": "Tento soubor obsahuje dodatečné informace, poskytnuté zřejmě digitálním fotoaparátem nebo scannerem, kterým byl pořízen. Pokud byl soubor od té doby změněn, některé údaje mohou být neplatné.",
        "metadata-expand": "Zobrazit podrobnosti",
        "metadata-collapse": "Skrýt podrobnosti",
-       "metadata-fields": "Položky metadat obrázků uvedené v této zprávě budou na stránce s popisem vypsána vždy. Pro zobrazení ostatních bude třeba kliknout na „zobrazit podrobnosti“.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "Položky metadat obrázků uvedené v této zprávě budou na stránce s popisem vypsány vždy. Pro zobrazení ostatních bude třeba kliknout na „zobrazit podrobnosti“.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Šířka",
        "exif-imagelength": "Výška",
        "exif-bitspersample": "Bitů na složku",
        "exif-saturation": "Sytost",
        "exif-sharpness": "Ostrost",
        "exif-devicesettingdescription": "Popis nastavení zařízení",
-       "exif-subjectdistancerange": "Vzdálenost k předmětu",
+       "exif-subjectdistancerange": "Vzdálenost od předmětu",
        "exif-imageuniqueid": "Unikátní ID obrázku",
        "exif-gpsversionid": "Verze GPS tagu",
        "exif-gpslatituderef": "Severní/jižní zeměpisná šířka",
        "exif-gpsdestlongitude": "Zeměpisná délka předmětu",
        "exif-gpsdestbearingref": "Reference pro směr k předmětu",
        "exif-gpsdestbearing": "Směr k předmětu",
-       "exif-gpsdestdistanceref": "Jednotka vzdálenosti k předmětu",
-       "exif-gpsdestdistance": "Vzdálenost k předmětu",
+       "exif-gpsdestdistanceref": "Jednotka vzdálenosti od předmětu",
+       "exif-gpsdestdistance": "Vzdálenost od předmětu",
        "exif-gpsprocessingmethod": "Označení metody zpracování GPS dat",
        "exif-gpsareainformation": "Označení GPS oblasti",
        "exif-gpsdatestamp": "Datum podle GPS",
        "exif-originalimageheight": "Výška obrázku před oříznutím",
        "exif-originalimagewidth": "Šířka obrázku před oříznutím",
        "exif-compression-1": "Nekomprimovaný",
-       "exif-compression-2": "1-rozměrné modifikované Huffmanovo kódování délky běhu CCITT Group 3",
+       "exif-compression-2": "1rozměrné modifikované Huffmanovo kódování délky běhu CCITT Group 3",
        "exif-compression-3": "Kódování faxů CCITT Group 3",
        "exif-compression-4": "Kódování faxů CCITT Group 4",
        "exif-compression-6": "JPEG (starý)",
index 1223dd8..28620ce 100644 (file)
        "permalink": "Dolen barhaol",
        "print": "Argraffu",
        "view": "Darllen",
+       "view-foreign": "Gweld ar $1",
        "edit": "Golygu",
+       "edit-local": "Golygu'r disgrifiad ar y wici hwn",
        "create": "Dechrau",
+       "create-local": "Ychwanegu disgrifiad ar y wici hwn",
        "editthispage": "Golygwch y dudalen hon",
        "create-this-page": "Creu'r dudalen",
        "delete": "Dileu",
        "search-result-score": "Perthnasedd: $1%",
        "search-redirect": "(ailgyfeiriad $1)",
        "search-section": "(adran $1)",
+       "search-file-match": "(yn cyfateb i gynnwys y ffeil)",
        "search-suggest": "Ai am hyn y chwiliwch: $1",
        "search-interwiki-caption": "Chwaer-brosiectau",
        "search-interwiki-default": "Y canlyniadau o $1:",
        "pageswithprop-prophidden-binary": "gwerth y briodwedd ddeuol, a guddiwyd ($1)",
        "doubleredirects": "Ailgyfeiriadau dwbl",
        "doubleredirectstext": "Mae pob rhes yn cynnwys cysylltiad i'r ddau ail-gyfeiriad cyntaf, ynghyd â chyrchfan yr ail ailgyfeiriad. Fel arfer bydd hyn yn rhoi'r gwir dudalen y dylai'r tudalennau cynt gyfeirio ati.\nGosodwyd <del>llinell</del> drwy'r eitemau sydd eisoes wedi eu datrys.",
-       "double-redirect-fixed-move": "Symudwyd [[$1]], a'i droi'n ailgyfeiriad at [[$2]]",
-       "double-redirect-fixed-maintenance": "Yn ailosod yr ailgyfeiriad dwbl o [[$1]] i [[$2]].",
+       "double-redirect-fixed-move": "Symudwyd [[$1]]. Cafodd ei diweddaru'n awtomatig, a'i droi'n ailgyfeiriad i [[$2]].",
+       "double-redirect-fixed-maintenance": "Yn ailosod yr ailgyfeiriad dwbl o [[$1]] i [[$2]], yn rhan o waith cynnal a chadw awtomatig.",
        "double-redirect-fixer": "Y bot ailgyfeirio",
        "brokenredirects": "Ailgyfeiriadau wedi'u torri",
        "brokenredirectstext": "Mae'r ailgyfeiriadau isod yn cysylltu â thudalennau nad ydynt ar gael:",
        "listgrouprights-removegroup-self": "Yn gallu tynnu {{PLURAL:$2|grŵp}} oddi ar eich cyfrif eich hunan: $1",
        "listgrouprights-addgroup-self-all": "Yn gallu ychwanegu'r holl grwpiau at eich cyfrif eich hunan",
        "listgrouprights-removegroup-self-all": "Yn gallu tynnu'r holl grwpiau oddi ar eich cyfrif eich hunan",
+       "trackingcategories-name": "Enw'r neges",
+       "trackingcategories-nodesc": "Dim disgrifiad ar gael.",
+       "trackingcategories-disabled": "Categorïau yr analluogwyd",
        "mailnologin": "Does dim cyfeiriad i'w anfon iddo",
        "mailnologintext": "Rhaid eich bod wedi [[Special:UserLogin|mewngofnodi]]\na bod cyfeiriad e-bost dilys yn eich [[Special:Preferences|dewisiadau]]\ner mwyn medru anfon e-bost at ddefnyddwyr eraill.",
        "emailuser": "Anfon e-bost at y defnyddiwr hwn",
        "unwatchthispage": "Stopio gwylio",
        "notanarticle": "Ddim yn erthygl/ffeil",
        "notvisiblerev": "Y diwygiad wedi cael ei ddileu",
-       "watchlist-details": "{{PLURAL:$1|Nid oes dim tudalennau|Mae $1 dudalen|Mae $1 dudalen|Mae $1 tudalen|Mae $1 thudalen|Mae $1 o dudalennau}} ar eich rhestr wylio, heb gynnwys tudalennau sgwrs.",
+       "watchlist-details": "{{PLURAL:$1|Nid oes dim tudalennau|Mae $1 dudalen|Mae $1 dudalen|Mae $1 tudalen|Mae $1 thudalen|Mae $1 o dudalennau}} ar eich rhestr wylio, heb gynnwys tudalennau sgwrs ar wahan.",
        "wlheader-enotif": "Galluogwyd hysbysiadau trwy e-bost.",
        "wlheader-showupdated": "Mae tudalennau sydd wedi newid ers i chi eu gweld ddiwethaf wedi'u '''hamlygu'''.",
        "wlnote2": "Isod, fe welwch y newidiadau yn ystod {{PLURAL:$1|yr awr|yr awr|y ddwyawr ddiwethaf|teirawr diwethaf|<strong>$1</strong> awr diwethaf}}, hyd at $2, $3.",
        "contributions-title": "Cyfraniadau'r defnyddiwr $1",
        "mycontris": "Cyfraniadau",
        "contribsub2": "Gan {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Nid oes cyfrif o'r enw \"$1\" wedi ei gofrestru yma.",
        "nocontribs": "Heb ddod o hyd i newidiadau gyda'r meini prawf hyn.",
        "uctop": "(cyfredol)",
        "month": "Cyfraniadau hyd at fis (ac yn gynharach):",
index 8674deb..80187d8 100644 (file)
        "jumptonavigation": "Navigation",
        "jumptosearch": "Suche",
        "view-pool-error": "Entschuldigung, die Server sind im Moment überlastet.\nZu viele Benutzer versuchen, diese Seite zu besuchen.\nBitte warte einige Minuten, bevor du es noch einmal versuchst.\n\n$1",
+       "generic-pool-error": "Leider sind die Server derzeit überlastet.\nZu viele Benutzer wollen diese Ressource ansehen.\nBitte warte einen Moment, bevor du sie erneut aufrufst.",
        "pool-timeout": "Zeitablauf während des Wartens auf die Sperrung",
        "pool-queuefull": "Poolwarteschlange ist voll",
        "pool-errorunknown": "Unbekannter Fehler",
        "gotaccountlink": "Anmelden",
        "userlogin-resetlink": "Die Anmeldedaten vergessen?",
        "userlogin-resetpassword-link": "Passwort vergessen?",
-       "userlogin-helplink2": "Hilfe bei der Anmeldung",
+       "userlogin-helplink2": "Hilfe beim Anmelden",
        "userlogin-loggedin": "Du bist bereits als {{GENDER:$1|$1}} angemeldet.\nBenutze das unten stehende Formular, um dich unter einem anderen Benutzernamen anzumelden.",
        "userlogin-createanother": "Ein weiteres Benutzerkonto erstellen",
        "createacct-emailrequired": "E-Mail-Adresse",
        "showhideselectedversions": "Gewählte Versionen zeigen/verstecken",
        "editundo": "rückgängig machen",
        "diff-empty": "(kein Unterschied)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Eine dazwischenliegende Version|$1 dazwischenliegende Versionen}} des gleichen Benutzers werden nicht angezeigt)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Eine dazwischenliegende Version des gleichen Benutzers wird|$1 dazwischenliegende Versionen des gleichen Benutzers werden}} nicht angezeigt)",
        "diff-multi-otherusers": "({{PLURAL:$1|Eine dazwischenliegende Version|$1 dazwischenliegende Versionen}} von {{PLURAL:$2|einem anderen Benutzer|$2 Benutzern}} werden nicht angezeigt)",
        "diff-multi-manyusers": "({{PLURAL:$1|$1 dazwischenliegende Versionen}} von mehr als {{PLURAL:$2|$2 Benutzern}}, die nicht angezeigt werden)",
        "difference-missing-revision": "{{PLURAL:$2|Eine Version|$2 Versionen}} dieser Unterschiedsanzeige ($1) {{PLURAL:$2|wurde|wurden}} nicht gefunden.\n\nDieser Fehler wird normalerweise von einem veralteten Link zur Versionsgeschichte einer Seite verursacht, die zwischenzeitlich gelöscht wurde.\nEinzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch] vorhanden.",
index 12670c0..aa49210 100644 (file)
        "databaseerror-textcl": "Zu ğetaya erdamalumati persayışi ameya meydan.",
        "databaseerror-query": "Perskerdış:$1",
        "databaseerror-function": "Fonksiyon: $1",
-       "databaseerror-error": "Xırab: $1",
+       "databaseerror-error": "Xeta: $1",
        "laggedslavemode": "Diqet: Pel de newe vıraşteyi belka çini .",
        "readonly": "database kılit biyo",
        "enterlockreason": "Database kılit biyo",
        "formerror": "Xeta: Form nêerşawiyeno",
        "badarticleerror": "Kar  ke şıma kenê, qebul nêbi.",
        "cannotdelete": "Pel  \"$1\" o ke şıma nişane kerd hewn a neşı.\nBelka yewna ten kerdo hewn a.",
-       "cannotdelete-title": "Å\9fıma  \"$1\" nê Å\9fenê besternê.",
+       "cannotdelete-title": "Å\9eıma nêÅ\9fenê pela \"$1\" besterê",
        "delete-hook-aborted": "Esterıtışi terefê çengeli ra ibtal bi.\nQet tesrih beyan nêbi.",
        "no-null-revision": "Qandé \"$1\" zew rewizyono newe névıraziya.",
        "badtitle": "Sernameo xırabın",
        "zip-unsupported": "Dosya MediaWiki ra ZIP dosyaya nêwanêna yana derganiya ZIP de cı aya pıro nina. Kontrolê emeleyey oyo veş nêbeno.",
        "uploadstash": "Nımıtışê barkerdışi",
        "uploadstash-summary": "Na pela barkerdış (yana hewna barbenayış dı) hema hewna wiki'dedosyeyê ke nêpêseryayê enarê rasayış gre danop. Enê dosyay o ke a dosya keno bar tek o şena a dosya bıvino.",
-       "uploadstash-clear": "Dosyeyê ke idareten bıvıryê ena besternê",
+       "uploadstash-clear": "Dosyeyanê ke idareten vuriyenê inan bestere",
        "uploadstash-nofiles": "Dosyeyê ke idareten bıvıryê çınyê.",
        "uploadstash-badtoken": "Karkerdışê cı nêbı, muhtemelen desture şımayê timarkerdışi zeman do şıma ravêrdo. Fına bıcerbnê.",
        "uploadstash-errclear": "Besternayışê dosyayan nêbı",
        "download": "bar ke",
        "unwatchedpages": "Pelanê seyrnibiyeyî",
        "listredirects": "Listeya Hetenayışan",
+       "listduplicatedfiles": "Lista dosyeyanê ke kopyaya cı vêniyena",
        "unusedtemplates": "Şablonê ke nê xebtênê",
        "unusedtemplatestext": "no pel, {{ns:template}} pelê ke pelê binan de nêaseni, ninan keno.",
        "unusedtemplateswlh": "linkanê binî",
        "pageswithprop-prophidden-binary": "Erca dıdıyına ($1) nımneyé",
        "doubleredirects": "Serşıkıtışê dıleti",
        "doubleredirectstext": "no pel pelê ray motışani liste keno.\ngıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.\n<del>serê ey nuşteyi</del> safi biye.",
-       "double-redirect-fixed-move": "[[$1]] kırışiya, hıni ray dana [[$2]] no pel",
-       "double-redirect-fixed-maintenance": "raçarnayışo dıletê [[$1]] ra  pela da [[$2]] timarêno",
+       "double-redirect-fixed-move": "[[$1]] kırışiye.\nNa otomatikmen biye rocaniye û nıka [[$2]] ser şıknena.",
+       "double-redirect-fixed-maintenance": "Serkışışteno dıletê [[$1]] ra  pela da [[$2]] vuriyeno.",
        "double-redirect-fixer": "Fixerî redirek bike",
        "brokenredirects": "Hetenayışê vengi",
        "brokenredirectstext": "Redireksiyonê ey ki pelanê hama çiniyeno ra link dano:",
        "deadendpagestext": "Ena pelan ke {{SITENAME}} de zerrî ey de link çini yo.",
        "protectedpages": "Pelê pawıtiyey",
        "protectedpages-indef": "têna pawıteyê bêmuddeti",
-       "protectedpages-summary": "têna pawıteyê têdimî",
+       "protectedpages-summary": "Listeya ena peler newke pawıtiya.Sername de  ena lista rê pawıte vıraştışi rê [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] bıvinê.",
        "protectedpages-cascade": "Kilit biyaye ke teyna cascadiye",
        "protectedpages-noredirect": "Hetenayışan bınımnê",
        "protectedpagesempty": "pê ney parametreyan pelê pawiteyi çinî",
        "listgrouprights-removegroup-self-all": "şıma hesabê xo ra eşkeni heme gruban bıveci",
        "listgrouprights-namespaceprotection-namespace": "Caynaman",
        "trackingcategories-name": "Namey mesaci",
+       "trackingcategories-desc": "Qritera kategoriya definayış",
        "trackingcategories-disabled": "Kategoriya feal niya",
        "mailnologin": "adresa erşawıtışi/ruşnayişi çina.",
        "mailnologintext": "qey karberanê binan re e-posta erşawıtış de gani şıma [[Special:UserLogin|hesab aker]]ê [[Special:Preferences|pelê tercihani]] de gani yew e-postayo meqbul bıbo.",
        "protect-locked-blocked": "seviyeya qedexe biyayeyan nevuriyeno.\n'''$1''' eyarê peli:",
        "protect-locked-dblock": "semedê kılidê database ya aktifi şıma neeşkeni seviyeya pawıtışi buvurni.\n'''$1''' eyarê no peli:",
        "protect-locked-access": "Karber hesabê şıma nêşeno  staryaye sewiyey ena peler bıvurno.\nHesıbyayê sazê pela da '''$1''' enêyê:",
-       "protect-cascadeon": "Ena pele nıka kılit biya. Çınki ena pele zerre listeyê {{PLURAL:$1|pele, ki|peleyan, which li}} bınê \"cascading protection\"iyo.\nTı eşkeno seviyeye kılit kerdışi bıvurno, feqat tı nıeşken \"cascading protection\"i bıvurno.",
+       "protect-cascadeon": "Ena pele nıka kılit biya. Çınki ena pele zerre listeyê {{PLURAL:$1|pele ke|peleyan ke}} bınê \"cascading protection\"iyo.\nTı şenê seviyeye kılit kerdışi bıvurnê, feqat tı nêşenê \"cascading protection\"i bıvurno.",
        "protect-default": "Destur bıde karberan pêrune",
        "protect-fallback": "Tenya karberanê be izna \"$1\" rê destur bıde",
        "protect-level-autoconfirmed": "Karberanê neweyan u qeyd-nêbiyaoğan kılit ke",
        "contributions-title": "Dekerdenê karber de $1",
        "mycontris": "İştıraqi",
        "contribsub2": "Qandê {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Hesabê karberi \"$1\" qeyd nêbiyo.",
        "nocontribs": "Ena kriteriya de vurnayîş çini yo.",
        "uctop": "(weziyet)",
        "month": "Aşme:",
        "htmlform-chosen-placeholder": "Opsiyon weçine",
        "sqlite-has-fts": "$1 tam-metn destegê cı geyrayışiya piya",
        "sqlite-no-fts": "$1 tam-metn bê destegê cı geyrayışi",
-       "logentry-delete-delete": "$1 pera $3 {{GENDER:$2|besternê}}",
+       "logentry-delete-delete": "$1 pela $3 {{GENDER:$2|esterıte}}",
        "logentry-delete-restore": "$1 pela $3 {{GENDER:$2|peyser arde}}",
        "logentry-delete-event": "$1 $3: $4 de asayışê {{PLURAL:$5|cıkerdışi|cıkerdışan}} {{GENDER:$2|vurna}}",
        "logentry-delete-revision": "$1 pela $3: $4 de asayışê {{PLURAL:$5|yew revizyoni|$5 revizyonan}} {{GENDER:$2|vurna}}",
index 9bb0f14..969741c 100644 (file)
        "virus-badscanner": "Araat kinooturon: Awu otutunan pongkowili giuk: ''$1''",
        "virus-scanfailed": "nolibai pongkowili (code $1)",
        "virus-unknownscanner": "tantobgiuk awu otutunan:",
-       "logouttext": "'''Baino nakalabus log ko noh.'''\n\nMilo ko do monilombus mongoguno {{SITENAME}} poinlisok, toi <span class='plainlinks'>[$1 sumuang log koh kawagu]</span> miagal ngaran di tiinu toi mongoguno ngaran suai.\nBirio do kipipiro bolikon popokito do maso poinsuang log koh poh gisom no do opugas nu dangkob do pogigihumnu.",
+       "logouttext": "'''Baino nakalabus log ko noh.'''\n\nBirio do kipipiro bolikon popokito do maso poinsuang log koh poh gisom noh do opugas nu dangkob do pogigihumnu.",
        "welcomeuser": "Kotobian dongkorikatan, $1!",
        "welcomecreation-msg": "Nowonsoi noh akaunnu.\nSoroho noh do mongolon do [[Special:Preferences|{{SITENAME}} komoisaannu]].",
        "yourname": "Ngarandait:",
+       "userlogin-yourname": "Ngaranmoguno",
+       "userlogin-yourname-ph": "Posurato ngaranmogunonu",
+       "createacct-another-username-ph": "Posuango o ngaranmoguno",
        "yourpassword": "Kaatalib:",
+       "userlogin-yourpassword": "Borospalapus",
+       "userlogin-yourpassword-ph": "Posurato borospanalibnu",
+       "createacct-yourpassword-ph": "Posuango borospanalib",
        "yourpasswordagain": "Mintaipo kaatalib:",
+       "createacct-yourpasswordagain": "Kompomo borospanalib",
+       "createacct-yourpasswordagain-ph": "Posuango kaagu borospanalib",
        "remembermypassword": "Soroho ot loginku id popogihuman diti (gisom solinaid do $1 {{PLURAL:$1|tadau|madau}})",
+       "userlogin-remembermypassword": "Potilombuso oku do poinsuang log",
+       "userlogin-signwithsecure": "Gunoo noputan noumoligan",
        "yourdomainname": "Damin nu:",
        "password-change-forbidden": "Awu koh kopongolon kaatalib id wiki diti.",
        "externaldberror": "Haro nokosilap pongintutunan bingdata toi awu ko pasagaon monginwagu takaun poinsoliwannu.",
        "logout": "Lumabus log",
        "userlogout": "Lumabus log",
        "notloggedin": "Amu nokolog sumuang",
+       "userlogin-noaccount": "Ingaa poh takaun?",
+       "userlogin-joinproject": "Tanud {{SITENAME}}",
        "nologin": "Ingaa akaun? $1",
        "nologinlink": "Pomonsoi do akaun",
        "createaccount": "Pomonsoi do takaun",
        "gotaccount": "Kitakaun? $1",
        "gotaccountlink": "Sumuang log",
        "userlogin-resetlink": "Nolihuan ahal loginnu?",
+       "userlogin-resetpassword-link": "Nolihuan borospanalibnu?",
+       "userlogin-helplink2": "Sokodung do sumuang log",
        "createaccountmail": "Gunoo nunu nopo kaatalib om pootodo id surat-i ii poinsurat id siriba diti",
        "createaccountreason": "Sabab:",
        "badretype": "Kaatalib pinosuang awu kopisangai.",
index fa44243..cad3b0f 100644 (file)
        "jumpto": "Và a:",
        "jumptonavigation": "Navigasiòun",
        "jumptosearch": "Sērca",
-       "view-pool-error": "In cól mumèint ché i terminêl în trôp câregh.\nTrôp utèint în drē serchêr ed vèder cla pàgina ché.\nSpèta soquânt minût préma ed pruvêr incòra a carghêr la pgina.\n\n$1",
+       "view-pool-error": "A s' în deşpiêş mó in cól mumèint ché i terminêl în trôp câregh.\nTrôp utèint în drē serchêr ed vèder cla pàgina ché.\nSpèta soquânt minût préma ed pruvêr incòra a carghêr la pàgina.\n\n$1",
+       "generic-pool-error": "A s' în deşpiêş mó in cól mumèint ché i terminêl în trôp câregh.\nTrôp utèint în drē serchêr ed vèder cla risōrsa ché.\nSpèta soquânt minût préma ed pruvêr incòra a carghêr la risōrsa.",
        "pool-timeout": "Tèimp che gh'é da spetêr préma dal sblôch.",
        "pool-queuefull": "A ghé la fîla, trôpa gînta a vōl vèder la pàgina, prōva tra soquânt minût",
        "pool-errorunknown": "Erōr mìa cgnusû",
index 4c844c3..b3ada83 100644 (file)
     "jumptonavigation": "navigation",
     "jumptosearch": "search",
     "view-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this page.\nPlease wait a while before you try to access this page again.\n\n$1",
+    "generic-pool-error": "Sorry, the servers are overloaded at the moment.\nToo many users are trying to view this resource.\nPlease wait a while before you try to access this resource again.",
     "pool-timeout": "Timeout waiting for the lock",
     "pool-queuefull": "Pool queue is full",
     "pool-errorunknown": "Unknown error",
     "file-no-thumb-animation": "<strong>Note: Due to technical limitations, thumbnails of this file will not be animated.</strong>",
     "file-no-thumb-animation-gif": "<strong>Note: Due to technical limitations, thumbnails of high resolution GIF images such as this one will not be animated.</strong>",
     "newimages": "Gallery of new files",
+    "newimagestext": "-",
     "imagelisttext": "Below is a list of <strong>$1</strong> {{PLURAL:$1|file|files}} sorted $2.",
     "newimages-summary": "This special page shows the last uploaded files.",
     "newimages-legend": "Filter",
index 752e8fe..5c0c9ca 100644 (file)
        "recentchanges-label-minor": "Ĉi tiu estas eta redakto",
        "recentchanges-label-bot": "Ĉi tiu redakto estis farita per roboto.",
        "recentchanges-label-unpatrolled": "Ĉi tiu redakto ne jam estis patrolata.",
-       "recentchanges-label-plusminus": "La paĝa grandeco ŝanĝiĝis je ĉi tiu nombro de batoj",
+       "recentchanges-label-plusminus": "La paĝa grandeco ŝanĝiĝis je ĉi tiu nombro de bajtoj",
        "recentchanges-legend-heading": "'''Klarigo:'''",
        "recentchanges-legend-newpage": "(vidu ankaŭ [[Special:NewPages|liston de novaj paĝoj]])",
-       "rcnotefrom": "Sube estas ŝanĝoj ekde <strong>$2</strong> ({{PLURAL:$1|lasta|lastaj}} <strong>$1</strong>).",
+       "rcnotefrom": "Malsupre estas ŝanĝoj ekde <strong>$2</strong> ({{PLURAL:$1|lasta|lastaj}} <strong>$1</strong>).",
        "rclistfrom": "Montri novajn ŝanĝojn ekde \"$3 $2\"",
        "rcshowhideminor": "$1 redaktetojn",
        "rcshowhideminor-show": "Montri",
index f4b2ae9..e3e7a53 100644 (file)
        "jumptonavigation": "navegación",
        "jumptosearch": "buscar",
        "view-pool-error": "Lo sentimos, los servidores están sobrecargados en este momento.\nHay demasiados usuarios que están tratando de ver esta página.\nEspera un momento antes de tratar de acceder nuevamente a esta página.\n\n$1",
+       "generic-pool-error": "Lo sentimos, los servidores están sobrecargados por el momento.\nHay demasiados usuarios tratando de ver esta página.\nIntentes acceder nuevamente a esta página dentro de un rato.",
        "pool-timeout": "Tiempo limite agotado para el bloqueo",
        "pool-queuefull": "La cola de trabajo está llena",
        "pool-errorunknown": "Error desconocido",
        "recentchanges-legend-heading": "'''Leyenda:'''",
        "recentchanges-legend-newpage": "(véase también la [[Special:NewPages|lista de páginas nuevas]])",
        "rcnotefrom": "A continuación se presentan los cambios desde <strong> $2 </strong> (hasta <strong> $1 </strong> se muestra).",
-       "rclistfrom": "Mostrar nuevos cambios desde $3 $2",
+       "rclistfrom": "Mostrar nuevos cambios desde $2, $3",
        "rcshowhideminor": "$1 ediciones menores",
        "rcshowhideminor-show": "Mostrar",
        "rcshowhideminor-hide": "Ocultar",
index 0464b4e..516e755 100644 (file)
        "jumptonavigation": "navigeerimiskast",
        "jumptosearch": "otsi",
        "view-pool-error": "Serverid on hetkel üle koormatud.\nLiiga palju kasutajaid üritab seda lehte vaadata.\nPalun oota hetk, enne kui uuesti proovid.\n\n$1",
+       "generic-pool-error": "Kahjuks on serverid praegu üle koormatud.\nLiiga palju kasutajaid proovivad seda ressurssi vaadata.\nPalun oota natuke, enne kui proovid uuesti selle ressursi juurde pääseda.",
        "pool-errorunknown": "Teadmata tõrge",
        "aboutsite": "{{GRAMMAR:genitive|{{SITENAME}}}} tiitelandmed",
        "aboutpage": "Project:Tiitelandmed",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "expensive-parserfunction-warning": "'''Hoiatus:''' See lehekülg kasutab liialt palju aeglustavaid laiendusfunktsioone. Neid võiks kasutada vähem kui {{PLURAL:$2|ühel|$2}} korral, praegu on kasutatud {{PLURAL:$1|ühel|$1}} korral.",
-       "expensive-parserfunction-category": "Liiga palju aeglasi laiendusfunktsioone kasutavad leheküljed",
+       "expensive-parserfunction-category": "Leheküljed, kus on liiga palju kulukaid parserifunktsioone",
        "post-expand-template-inclusion-warning": "'''Hoiatus:''' Väljakutsutavate mallide hulk on liiga suur, mõningaid malle ei näidata.",
        "post-expand-template-inclusion-category": "Leheküljed, kus mallide väljakutsumise limiit on ületatud",
        "post-expand-template-argument-warning": "'''Hoiatus:''' See lehekülg sisaldab argumendina vähemalt üht malli, mille määratud maht on liiga suur.\nNeed argumendid on välja jäetud.",
-       "post-expand-template-argument-category": "Malli vahele jäetud argumente sisaldavad leheküljed",
+       "post-expand-template-argument-category": "Leheküljed, kus malli argumendid on välja jäänud",
        "parser-template-loop-warning": "Mallid moodustavad tsükli: [[$1]]",
        "parser-template-recursion-depth-warning": "Malli rekursiivse kasutamise limiit on ületatud ($1)",
        "language-converter-depth-warning": "Keeleteisendaja sügavuspiir ületatud ($1)",
        "pageswithprop-prophidden-binary": "kahendatribuudi väärtus peidetud ($1)",
        "doubleredirects": "Kahekordsed ümbersuunamised",
        "doubleredirectstext": "Käesolev leht esitab loendi lehtedest, mis sisaldavad ümbersuunamisi teistele ümbersuunamislehtedele.\nIgal real on ära toodud esimene ja teine ümbersuunamisleht ning samuti teise ümbersuunamislehe sihtmärk, mis tavaliselt on esialgse ümbersuunamise tegelik siht, millele see otse osutama peakski.\n<del>Läbikriipsutatud</del> kirjed on kohendatud.",
-       "double-redirect-fixed-move": "[[$1]] on teisaldatud, see suunab nüüd leheküljele [[$2]].",
-       "double-redirect-fixed-maintenance": "Parandatakse kahekordne suunamine leheküljelt [[$1]] leheküljele [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] on teisaldatud.\nLehekülg uuendati automaatselt ja see suunab nüüd leheküljele [[$2]].",
+       "double-redirect-fixed-maintenance": "Hooldustöö käigus parandati automaatselt kahekordne suunamine leheküljelt [[$1]] leheküljele [[$2]].",
        "double-redirect-fixer": "Ümbersuunamiste parandaja",
        "brokenredirects": "Vigased ümbersuunamised",
        "brokenredirectstext": "Järgmised leheküljed on ümber suunatud olematutele lehekülgedele:",
        "mailnologin": "Saatja aadress puudub",
        "mailnologintext": "Pead olema [[Special:UserLogin|sisse logitud]] ja sul peab [[Special:Preferences|eelistustes]] olema kehtiv e-posti aadress, et saata teistele kasutajatele e-kirju.",
        "emailuser": "Saada sellele kasutajale e-kiri",
-       "emailuser-title-target": "Sellele {{GENDER:$1|kasutajale}} e-kirja saatmine",
+       "emailuser-title-target": "{{GENDER:$1|Kasutajale}} e-kirja saatmine",
        "emailuser-title-notarget": "Kasutajale e-kirja saatmine",
        "emailpage": "Saada kasutajale e-kiri",
        "emailpagetext": "Alloleva vormi kaudu saad sellele {{GENDER:$1|kasutajale}} e-kirja saata. Et kasutaja saaks vastata, täidetakse kirja saatja väli e-posti aadressiga, mille oled sisestanud [[Special:Preferences|oma eelistuste leheküljel]].",
index c8bdab8..68f8f6c 100644 (file)
        "jumptonavigation": "ناوبری",
        "jumptosearch": "جستجو",
        "view-pool-error": "متأسفانه سرورها در حال حاضر دچار بار اضافی هستند.\nتعداد زیادی از کاربران دارند تلاش می‌کنند که این صفحه را ببینند.\nلطفاً قبل از تلاش دوباره برای دیدن این صفحه مدتی صبر کنید.\n\n$1",
+       "generic-pool-error": "متأسفانه سرورها در حال حاضر دچار بار اضافی هستند.\nتعداد زیادی از کاربران دارند تلاش می‌کنند که این صفحه را ببینند.\nلطفاً قبل از تلاش دوباره برای دیدن این صفحه مدتی صبر کنید.",
        "pool-timeout": "اتمام مهلت انتظار برای قفل",
        "pool-queuefull": "صف مخزن پر است",
        "pool-errorunknown": "خطای ناشناخته",
        "pageswithprop-prophidden-binary": "جزییات مقدار مخفی باینری ($1)",
        "doubleredirects": "تغییرمسیرهای دوتایی",
        "doubleredirectstext": "این صفحه فهرستی از صفحه‌های تغییرمسیری را ارائه می‌کند که به صفحهٔ تغییرمسیر دیگری اشاره می‌کنند.\nهر سطر دربردارندهٔ پیوندهایی به تغییرمسیر اول و دوم و همچنین مقصد تغییرمسیر دوم است، که معمولاً صفحهٔ مقصد واقعی است و نخستین تغییرمسیر باید به آن اشاره کند.\nموارد <del>خط خورده</del> درست شده‌اند.",
-       "double-redirect-fixed-move": "[[$1]] انتقال داده شده‌است، و در حال حاضر تغییرمسیری به [[$2]] است",
-       "double-redirect-fixed-maintenance": "رÙ\81ع ØªØºÛ\8cÛ\8cرÙ\85سÛ\8cر Ø¯Ù\88تاÛ\8cÛ\8c Ø§Ø² [[$1]] Ø¨Ù\87 [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] انتقال داده شده‌است.\n\nبه صورت خودکار به‌روز شده‌است و  تغییرمسیری به [[$2]] داده شد.",
+       "double-redirect-fixed-maintenance": "رÙ\81ع Ø®Ù\88دکار ØªØºÛ\8cÛ\8cرÙ\85سÛ\8cر Ø¯Ù\88تاÛ\8cÛ\8c Ø§Ø² [[$1]] Ø¨Ù\87 [[$2]] Ø¯Ø± Ø±Ù\88Ù\86د Ù\86Ú¯Ù\87دارÛ\8c.",
        "double-redirect-fixer": "تعمیرکار تغییرمسیرها",
        "brokenredirects": "تغییرمسیرهای خراب",
        "brokenredirectstext": "تغییرمسیرهای زیر به یک صفحهٔ ناموجود پیوند دارند:",
index c799bca..1ba24c5 100644 (file)
        "permalink": "Ikilinkki",
        "print": "Tulosta",
        "view": "Näytä",
-       "view-foreign": "Katso kohdetta $1",
+       "view-foreign": "Näytä $1",
        "edit": "Muokkaa",
        "edit-local": "Muokkaa paikallista kuvausta",
        "create": "Luo sivu",
        "filepage-nofile-link": "Tämän nimistä tiedostoa ei ole olemassa, mutta voit [$1 tallentaa sen].",
        "uploadnewversion-linktext": "Tallenna uusi versio tästä tiedostosta",
        "shared-repo-from": "kohteesta $1",
-       "shared-repo": "jaettu mediavarasto",
+       "shared-repo": "yhteinen mediavarasto",
        "upload-disallowed-here": "Et voi tallentaa uutta tiedostoa tämän tilalle.",
        "filerevert": "Tiedoston $1 palautus",
        "filerevert-legend": "Tiedoston palautus",
        "pageswithprop-prophidden-long": "Pitkä tekstimuotoinen ominaisuuden arvo piilotettu ($1)",
        "pageswithprop-prophidden-binary": "ominaisuuden binääriarvo on piilotettu ($1)",
        "doubleredirects": "Kaksinkertaiset ohjaukset",
-       "doubleredirectstext": "Tässä listassa on ohjaussivut, jotka ohjaavat toiseen ohjaussivuun.\nJokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen ohjauksen kohteen ensimmäiseen riviin, eli yleensä ”oikeaan” kohteeseen, johon ensimmäisen ohjauksen pitäisi osoittaa.\n<del>Yliviivatut</del> kohteet on korjattu.",
+       "doubleredirectstext": "Tällä sivulla on lueteltu ne sivut, jotka ohjaavat toiseen ohjaussivuun.\nJokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen ohjauksen kohteeseen, joka on yleensä ”oikea” kohdesivu, johon ensimmäisen ohjauksen pitäisi johtaa.\n<del>Yliviivatut</del> kohteet on korjattu.",
        "double-redirect-fixed-move": "[[$1]] on siirretty.\nSe on automaattisesti päivitetty ja se ohjaa nyt sivulle [[$2]].",
        "double-redirect-fixed-maintenance": "Korjataan automaattisesti kaksinkertainen ohjaus sivulta [[$1]] sivulle [[$2]].",
        "double-redirect-fixer": "Ohjausten korjaaja",
        "booksources-go": "Siirry",
        "booksources-text": "Alla linkkejä ulkopuolisiin sivustoihin, joilla myydään uusia ja käytettyjä kirjoja. Sivuilla voi myös olla lisätietoa kirjoista.",
        "booksources-invalid-isbn": "Annettu ISBN-numero ei ole kelvollinen. Tarkista alkuperäisestä lähteestä kirjoitusvirheiden varalta.",
-       "specialloguserlabel": "Käyttäjä",
-       "speciallogtitlelabel": "Kohde",
+       "specialloguserlabel": "Suorittaja:",
+       "speciallogtitlelabel": "Kohde (sivu tai käyttäjä):",
        "log": "Lokit",
        "all-logs-page": "Kaikki julkiset lokit",
        "alllogstext": "Tämä on yhdistetty lokien näyttö.\nVoit rajoittaa listaa valitsemalla lokityypin, käyttäjän tai sivun johon muutos on kohdistunut. Jälkimmäiset ovat kirjainkokoherkkiä.",
index 219cb75..1b008ea 100644 (file)
        "tog-hidepatrolled": "Masquer les modifications surveillées dans les modifications récentes",
        "tog-newpageshidepatrolled": "Masquer les pages surveillées dans la liste des nouvelles pages",
        "tog-extendwatchlist": "Étendre la liste de suivi pour afficher toutes les modifications et pas uniquement les plus récentes",
-       "tog-usenewrc": "Grouper les changements par page dans les modifications récentes et la liste de suivi (nécessite JavaScript)",
+       "tog-usenewrc": "Grouper les changements par page dans les modifications récentes et la liste de suivi",
        "tog-numberheadings": "Numéroter automatiquement les titres de section",
        "tog-showtoolbar": "Afficher la barre d'outils de modification (nécessite JavaScript)",
        "tog-editondblclick": "Modifier des pages sur double-clic (nécessite JavaScript)",
        "jumptonavigation": "navigation",
        "jumptosearch": "rechercher",
        "view-pool-error": "Désolé, les serveurs sont surchargés en ce moment.\nTrop d'utilisateurs cherchent à consulter cette page.\nVeuillez attendre un moment avant de retenter l'accès à cette page.\n\n$1",
+       "generic-pool-error": "Désolé, les serveurs sont surchargés pour le moment.\nTrop d’utilisateurs essayent de consulter cette ressource.\nVeuillez attendre un peu avant de réessayer d’accéder à celle-ci.",
        "pool-timeout": "Délai d'attente dépassé",
        "pool-queuefull": "La file d'attente est pleine",
        "pool-errorunknown": "Erreur inconnue",
index 162e666..cb72471 100644 (file)
        "permalink": "Ceangal buan",
        "print": "Clò-bhuail",
        "view": "Seall",
+       "view-foreign": "Seall air $1",
        "edit": "Deasaich",
+       "edit-local": "Deasaich an tuairisgeul ionadail",
        "create": "Cruthaich",
+       "create-local": "Cuir tuairisgeul ionadail ris",
        "editthispage": "Deasaich an duilleag seo",
        "create-this-page": "Cruthaich an duilleag seo",
        "delete": "Sguab às",
        "loginlanguagelabel": "Cànan: $1",
        "suspicious-userlogout": "Chaidh d' iarrtas airson clàradh a-mach a dhiùltadh a chionn 's gu bheil coltas gun deach a chur le brabhsair briste no le progsaidh tasglannaidh.",
        "createacct-another-realname-tip": "Cha leig thu leas innse dè am fìor-ainm a tha ort.\nMa bheir thu seachad e, thèid seo a chleachdadh gus urram a thoirt dha na h-ùghdaran airson an cuid obrach.",
+       "pt-login": "Log a-steach",
+       "pt-login-button": "Log a-steach",
+       "pt-createaccount": "Cruthaich cunntas",
+       "pt-userlogout": "Log a-mach",
        "php-mail-error-unknown": "Mearachd neo-aithichte san fheart mail() aig PHP.",
        "user-mail-no-addy": "Cha do ghabh am post-d a chur leis nach robh seòladh puist-d ann.",
        "user-mail-no-body": "Bha bodhaig na teachdaireachd bàn no air leth goirid.",
        "changepassword": "Atharraich facal-faire",
-       "resetpass_announce": "Chlàraich thu a-steach le còd sealach a fhuair thu air a' phost-d.\nGus an clàradh a-steach a choileadh, tha agad ri facal-faire ùr a shuidheachadh an-seo:",
+       "resetpass_announce": "Gus an clàradh a-steach a choileanadh, tha agad ri facal-faire ùr a shuidheachadh.",
        "resetpass_header": "Atharraich facal-faire a' chunntais",
        "oldpassword": "Seann fhacal-faire",
        "newpassword": "Facal-faire ùr",
        "retypenew": "Ath-sgrìobh am facal-faire ùr",
        "resetpass_submit": "Suidhich am facal-faire 's clàraich a-steach",
        "changepassword-success": "Chaidh am facal-faire agad atharrachadh!",
+       "changepassword-throttled": "Dh'fheuch thu ri clàradh a-steach ro thric o chionn ghoirid.\nFuirich ort $1 mus feuch thu ris a-rithist.",
        "resetpass_forbidden": "Cha ghabh na faclan-faire atharrachadh",
        "resetpass-no-info": "Feumaidh tu clàradh a-steach mus dèan thu inntrigeadh dìreach dhan duilleag seo.",
        "resetpass-submit-loggedin": "Atharraich am facal-faire",
        "recentchanges-label-minor": "Seo mùthadh beag",
        "recentchanges-label-bot": "'S e bot a rinn an deasachadh seo",
        "recentchanges-label-unpatrolled": "Cha deach freiceadan tron deasachadh seo fhathast",
+       "recentchanges-label-plusminus": "Seo meud atharrachadh na duilleige ann am byte",
+       "recentchanges-legend-newpage": "(faic [[Special:NewPages|liosta nan duilleagan ùra]] cuideachd)",
        "rcnotefrom": "Gheibhear na mùthaidhean a-mach o '''$2''' (gu ruige '''$1''') gu h-ìosal.",
        "rclistfrom": "Seall na mùthaidhean ùra a-mach o $3 $2",
        "rcshowhideminor": "$1 mùthaidhean beaga",
        "notanarticle": "Chan e duilleag susbaint a tha ann",
        "watchlist-details": "Tha {{PLURAL:$1|$1 duilleag|$1 dhuilleag|$1 duilleagan|$1 duilleag}} air do chlàr-faire, gun luaidh air na duilleagan deasbaireachd.",
        "wlheader-showupdated": "Tha clò '''trom''' air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
+       "wlnote2": "Chì thu na h-atharraichean {{PLURAL:$1|san uair|san <strong>$1</strong> uair|san <strong>$1</strong> uair|san <strong>$1</strong> uair|sna <strong>$1</strong> uairean|sna <strong>$1</strong> uair}} a thìde seo chaidh aig $3 air $2.",
        "wlshowlast": "Seall na $1 uairean a thìde mu dheireadh $2 làithean mu dheireadh $3",
        "watchlist-options": "Roghainnean mo chlàir-faire",
        "watching": "'Ga chur air a' chlàr-fhaire...",
        "unwatching": "A' toirt far a' chlàir-fhaire...",
+       "enotif_reset": "Comharraich gun do thadhladh air gach duilleag",
        "deletepage": "Sguab às duilleag",
        "confirm": "Daingnich",
        "excontent": "stuth a bh' ann: '$1'",
index 7572b17..93f4260 100644 (file)
        "jumptonavigation": "navegación",
        "jumptosearch": "procura",
        "view-pool-error": "Sentímolo, os servidores están sobrecargados nestes intres.\nHai moitos usuarios intentando ver esta páxina.\nPor favor, agarde un anaco antes de intentar acceder á páxina de novo.\n\n$1",
+       "generic-pool-error": "Sentímolo, os servidores están sobrecargados nestes intres.\nHai moitos usuarios intentando ver este recurso.\nPor favor, agarde un anaco antes de intentar acceder ao recurso de novo.",
        "pool-timeout": "Tempo límite de espera para o peche",
        "pool-queuefull": "A cola está chea",
        "pool-errorunknown": "Erro descoñecido",
index fcf7069..d12a211 100644 (file)
        "enotif_lastvisited": "તમારી પાછલી મુલાકાત પછી થયેલા બધા ફેરફારો માટે $1 જુઓ",
        "enotif_lastdiff": "આ ફેરફાર જોવા $1 જુઓ",
        "enotif_anon_editor": "અનામિ સભ્ય $1",
-       "enotif_body": "પ્રિય $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nફેરફારોનો સારાંશ: $PAGESUMMARY $PAGEMINOREDIT\n\nસંપાદકનો સંપર્ક:\nઇ-મેલ: $PAGEEDITOR_EMAIL\nવિકિ: $PAGEEDITOR_WIKI\n\nજ્યાં સુધી તમે પ્રવેશ કરીને આ પાનાની મુલાકાત નહી લો ત્યાં સુધી તેમાં ભવિષ્યમાં થનાર કોઇ પણ ફેરફારની સૂચના તમને મળશે નહિ. તમે તમારી ધ્યાન સૂચિમાં તમે જોયેલા પાના સંબંધી સૂચનાને લાગતા વિલપોમાં ફેરફાર કરી શકો છો.\n\n\nઆપની વિશ્વાસુ {{SITENAME}} સૂચના પ્રણાલી   \n\n--\nઇમેલ સૂચના પ્રણાલી બદલવા માટે મુલાકાત લો\n{{canonicalurl:{{#special:Preferences}}}}\n\nતમારી ધ્યાનસૂચિની વિક્લ્પ ગોઠવણી માટે મુલાકાત લો\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nધ્યાનસૂચિમાંથી પાનું હટાવવા માટે મુલાકાત લો\n$UNWATCHURL\n\nમંતવ્યો અને વધુ મદદ માટે\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_body": "પ્રિય $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nફેરફારોનો સારાંશ: $PAGESUMMARY $PAGEMINOREDIT\n\nસંપાદકનો સંપર્ક:\nઇમેલ: $PAGEEDITOR_EMAIL\nવિકિ: $PAGEEDITOR_WIKI\n\nજ્યાં સુધી તમે પ્રવેશ કરીને આ પાનાની મુલાકાત નહી લો ત્યાં સુધી તેમાં ભવિષ્યમાં થનાર કોઇ પણ ફેરફારની સૂચના તમને મળશે નહિ. તમે તમારી ધ્યાન સૂચિમાં તમે જોયેલા પાના સંબંધી સૂચનાને લાગતા વિકલ્પોમાં ફેરફાર કરી શકો છો.\n\n\nઆપની વિશ્વાસુ {{SITENAME}} સૂચના પ્રણાલી   \n\n--\nઇમેલ સૂચના પ્રણાલી બદલવા માટે, મુલાકાત લો\n{{canonicalurl:{{#special:Preferences}}}}\n\nતમારી ધ્યાનસૂચિની વિક્લ્પ ગોઠવણી માટે, મુલાકાત લો\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nધ્યાનસૂચિમાંથી પાનું હટાવવા માટે, મુલાકાત લો\n$UNWATCHURL\n\nમંતવ્યો અને વધુ મદદ માટે:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
        "created": "બનાવ્યું",
        "changed": "બદલ્યું",
        "deletepage": "પાનું હટાવો",
index 01bfcfb..c3bf6d8 100644 (file)
        "jumptonavigation": "ניווט",
        "jumptosearch": "חיפוש",
        "view-pool-error": "מצטערים, השרתים עמוסים כרגע.\nיותר מדי משתמשים מנסים לצפות בדף זה.\nאנא המתינו זמן מה לפני שתנסו שוב לצפות בדף.\n\n$1",
+       "generic-pool-error": "מצטערים, השרתים עמוסים כרגע.\nיותר מדי משתמשים מנסים לצפות במשאב הזה.\nאנא המתינו זמן מה לפני שתנסו שוב לצפות במשאב הזה.",
        "pool-timeout": "זמן ההמתנה לסיום הנעילה עבר",
        "pool-queuefull": "התור מלא",
        "pool-errorunknown": "שגיאה בלתי ידועה",
index 618e312..006655e 100644 (file)
        "rc_categories": "Ograniči na kategorije (odvojene znakom  \"|\")",
        "rc_categories_any": "Sve",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} poslije uređivanja",
-       "newsectionsummary": "/* $1 */ Novi odlomak",
+       "newsectionsummary": "/* $1 */ novi odlomak",
        "rc-enhanced-expand": "Pokaži detalje (potreban JavaScript)",
        "rc-enhanced-hide": "Sakrij detalje",
        "rc-old-title": "izvorno ime bilo je \"$1\"",
index 8b06b6d..c525e14 100644 (file)
        "permalink": "Trajny wotkaz",
        "print": "Ćišćeć",
        "view": "Wobhladać",
+       "view-foreign": "Na $1 sej wobhladać",
        "edit": "wobdźěłać",
        "edit-local": "Lokalny wopis wobdźěłać .",
        "create": "Wutworić",
        "pageswithprop-prophidden-binary": "binarna kajkostna hódnota schowana ($1)",
        "doubleredirects": "Dwójne daleposrědkowanja",
        "doubleredirectstext": "Tuta strona nalistuje strony, kotrež k druhim daleposrědkowanskim stronam dale posrědkuja.\nKóžda rjadka wobsahuje wotkazy k prěnjemu a druhemu daleposrědkowanju kaž tež cil druheho daleposrědkowanja, kotryž je zwjetša  \"woprawdźita\" cilowa strona, na kotruž prěnje daleposrědkowanje měło pokazać. <del>Přešmórnjene</del> zapiski su hižo sčinjene.",
-       "double-redirect-fixed-move": "[[$1]] bu přesunjeny, je nětko daleposrědkowanje do [[$2]]",
-       "double-redirect-fixed-maintenance": "Dwójne dalesposrědkowanje wot [[$1]] do [[$2]] so porjedźuje",
+       "double-redirect-fixed-move": "[[$1]] bu přesunjeny.\nJe so awtomatisce zaktualizował a posrědkuje so nětko do [[$2]].",
+       "double-redirect-fixed-maintenance": "Dwójne dalesposrědkowanje wot [[$1]] do [[$2]] so awtomatisce w wothladowanskim nadawku porjedźuje.",
        "double-redirect-fixer": "Porjedźer daleposrědkowanjow",
        "brokenredirects": "Skóncowane daleposrědkowanja",
        "brokenredirectstext": "Slědowace daleposrědkowanja wotkazuja na njeeksistowace strony:",
        "listgrouprights-removegroup-self": "Móže {{PLURAL:$2|skupinu|skupinje|skupiny|skupinow}} ze swójskeho konta wotstronić: $1",
        "listgrouprights-addgroup-self-all": "Móže wšě skupiny swójskemu kontu přidać",
        "listgrouprights-removegroup-self-all": "Móže wšě skupiny ze swójskeho konta wotstronić",
+       "listgrouprights-namespaceprotection-header": "Wobmjezowanja mjenoweho ruma",
+       "listgrouprights-namespaceprotection-namespace": "Mjenowy rum",
+       "listgrouprights-namespaceprotection-restrictedto": "Prawa, kotrež wužiwarjej wobdźěłowanje dowoleja",
+       "trackingcategories": "Slědowanske kategorije",
+       "trackingcategories-msg": "Slědowanska kategorija",
+       "trackingcategories-name": "Mjeno zdźělenki",
+       "trackingcategories-desc": "Kriterije za zapřijimanje kategorije",
+       "trackingcategories-nodesc": "Žane wopisanje k dispoziciji",
+       "trackingcategories-disabled": "Kategorija je znjemóžnjena",
        "mailnologin": "Njejsy přizjewjeny.",
        "mailnologintext": "Dyrbiš [[Special:UserLogin|přizjewjeny]] być a płaćiwu e-mejlowu adresu w swojich [[Special:Preferences|nastajenjach]] měć, zo by druhim wužiwarjam mejlki pósłać móhł.",
        "emailuser": "Wužiwarjej mejlku pósłać",
        "unwatchthispage": "wobkedźbowanje skónčić",
        "notanarticle": "njeje nastawk",
        "notvisiblerev": "Wersija bu wušmórnjena",
-       "watchlist-details": "{{PLURAL:$1|$1 wobkedźbowana strona|$1 wobkedźbowanej stronje|$1 wobkedźbowane strony|$1 wobkedźbowanych stronow}}, diskusijne strony wuwzate.",
+       "watchlist-details": "{{PLURAL:$1|$1 wobkedźbowana strona|$1 wobkedźbowanej stronje|$1 wobkedźbowane strony|$1 wobkedźbowanych stronow}}, bjeztoho zo so diskusijne strony dźělene liča.",
        "wlheader-enotif": "E-mejlowa zdźělenska słužba je zmóžnjena.",
        "wlheader-showupdated": "Strony, kotrež su so po twojim poslednim wopyće změnili, so '''tučne''' pokazuja.",
        "wlnote2": "Slěduja změny {{PLURAL:$1|zańdźeneje hodźiny|zańdźeneju <strong>$1</strong> hodźinow|zańdźenych <strong>$1</strong> hodźin}} Staw: $2, $3.",
        "contributions-title": "Wužiwarske přinoški wot „$1“",
        "mycontris": "Přinoški",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Wužiwarske konto \"$1\" njeje zregistrowane.",
        "nocontribs": "Žane změny, kotrež podatym kriterijam wotpowěduja.",
        "uctop": "(aktualny)",
        "month": "wot měsaca (a do toho):",
index f779cff..bc7a1b2 100644 (file)
        "jumpto": "Vai a:",
        "jumptonavigation": "navigazione",
        "jumptosearch": "ricerca",
-       "view-pool-error": "In questo momento i server sono sovraccarichi.\nTroppi utenti stanno tentando di visualizzare questa pagina.\nAttendere qualche minuto prima di riprovare a caricare la pagina.\n\n$1",
+       "view-pool-error": "Spiacenti, in questo momento i server sono sovraccarichi.\nTroppi utenti stanno tentando di visualizzare questa pagina.\nAttendi qualche minuto prima di riprovare a caricare la pagina.\n\n$1",
+       "generic-pool-error": "Spiacenti, in questo momento i server sono sovraccarichi.\nTroppi utenti stanno tentando di visualizzare questa risorsa.\nAttendi qualche minuto prima di riprovare a caricare la risorsa.",
        "pool-timeout": "Timeout durante l'attesa dello sblocco",
        "pool-queuefull": "La coda del pool è piena",
        "pool-errorunknown": "Errore sconosciuto",
        "listusers-desc": "Ordina in senso decrescente",
        "usereditcount": "$1 {{PLURAL:$1|contributo|contributi}}",
        "usercreated": "{{GENDER:$3|Creato/a}} il $1 alle $2",
-       "newpages": "Pagine più recenti",
+       "newpages": "Nuove pagine",
        "newpages-username": "Nome utente:",
        "ancientpages": "Pagine meno recenti",
        "move": "Sposta",
index aa4d003..5ffe4f1 100644 (file)
        },
        "tog-underline": "Сілтеменің астын сызу:",
        "tog-hideminor": "Жуықтағы өзгерістерден шағын өңдемелерді жасыру",
-       "tog-hidepatrolled": "Тексерілген өңдеулерді соңғы өзгерістер тізімінде көрсетпеу",
-       "tog-newpageshidepatrolled": "ТекÑ\81еÑ\80Ñ\96лген Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð¶Ð°Ò£Ð° Ð±ÐµÑ\82Ñ\82еÑ\80 Ñ\82Ñ\96зÑ\96мÑ\96нде ÐºÓ©Ñ\80Ñ\81еÑ\82пеу",
-       "tog-extendwatchlist": "Ð\91аÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мдÑ\96 Ò±Ð»Ò\93айÑ\82Ñ\83 (баÑ\80лÑ\8bÒ\9b Ð¶Ð°Ñ\80амдÑ\8b Ó©Ð·Ð³ÐµÑ\80Ñ\96Ñ\81Ñ\82еÑ\80дÑ\96 ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\83)",
+       "tog-hidepatrolled": "Тексерілген өңдеулерді жуықтағы өзгерістер тізімінде көрсетпеу",
+       "tog-newpageshidepatrolled": "ТекÑ\81еÑ\80Ñ\96лген Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð¶Ð°Ò£Ð° Ð±ÐµÑ\82Ñ\82еÑ\80 Ñ\82Ñ\96зÑ\96мÑ\96нде Ð¶Ð°Ñ\81Ñ\8bÑ\80у",
+       "tog-extendwatchlist": "Ð\91аÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мдÑ\96 Ò±Ð»Ò\93айÑ\82Ñ\8bп Ð±Ð°Ñ\80лÑ\8bÒ\9b Ó©Ð·Ð³ÐµÑ\80Ñ\96Ñ\81Ñ\82еÑ\80дÑ\96 ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\83, ÐµÒ£ Ñ\81оңÒ\93Ñ\8bлаÑ\80дÑ\8b Ò\93ана ÐµÐ¼ÐµÑ\81",
        "tog-usenewrc": "Жуықтағы өзгерістер және бақылау тізімінде беті бойынша өзгерістерді топтау",
        "tog-numberheadings": "Мазмұн тақырыптарын автоматты нөмірлеу",
-       "tog-showtoolbar": "Өңдеу құралдарын көрсету",
+       "tog-showtoolbar": "Өңдеу құралдарын үстелін көрсету",
        "tog-editondblclick": "Қос шерту арқылы бетті өңдеу",
        "tog-editsectiononrightclick": "Бөлім тақырыбын оң нұқумен бөлім өңдеуін қосу",
-       "tog-watchcreations": "Ð\9cен Ð±Ð°Ñ\81Ñ\82аÒ\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81",
-       "tog-watchdefault": "Ð\9cен Ó©Ò£Ð´ÐµÐ³ÐµÐ½ Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81",
-       "tog-watchmoves": "Ð\9cен Ð¶Ñ\8bлжÑ\8bÑ\82Ò\9bан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81",
-       "tog-watchdeletion": "Ð\9cен Ð¶Ð¾Ð¹Ò\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81",
-       "tog-minordefault": "Әдепкіден барлық өңдемелерді шағын деп белгіле",
+       "tog-watchcreations": "Ð\9cен Ð±Ð°Ñ\81Ñ\82аÒ\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð¶Ó\99не Ð¼ÐµÐ½ Ð¶Ò¯ÐºÑ\82еген Ñ\84айлдаÑ\80дÑ\8b Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81Ñ\83",
+       "tog-watchdefault": "Ð\9cен Ó©Ò£Ð´ÐµÐ³ÐµÐ½ Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð¶Ó\99не Ñ\84айлдаÑ\80дÑ\8b Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81Ñ\83",
+       "tog-watchmoves": "Ð\9cен Ð¶Ñ\8bлжÑ\8bÑ\82Ò\9bан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð¶Ó\99не Ñ\84айлдаÑ\80дÑ\8b Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81Ñ\83",
+       "tog-watchdeletion": "Ð\9cен Ð¶Ð¾Ð¹Ò\93ан Ð±ÐµÑ\82Ñ\82еÑ\80дÑ\96 Ð¶Ó\99не Ñ\84айлдаÑ\80дÑ\8b Ð±Ð°Ò\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96не Ò\9bоÑ\81Ñ\83",
+       "tog-minordefault": "Әдепкі бойынша барлық өңдемелерді шағын деп белгілеу",
        "tog-previewontop": "Қарап шығу аумағын өңдеу терезесінің жоғарғы жағында көрсету",
-       "tog-previewonfirst": "Бірінші өңдегенде қарап шығу",
-       "tog-enotifwatchlistpages": "Бақылауыңыздағы бет өзгергенде е-поштаға хабарлама жіберу",
+       "tog-previewonfirst": "Бірінші өңдегенде алдын-ала қарап шығу",
+       "tog-enotifwatchlistpages": "Бақылауымдағы бет және файл өзгергенде е-поштаға хабарлама жіберу",
        "tog-enotifusertalkpages": "Талқылау бетім өзгергенде маған хат жібер",
        "tog-enotifminoredits": "Шағын өңдеме туралы да маған хат жібер",
        "tog-enotifrevealaddr": "Е-поштамның мекенжайын ескерту хаттарда аш",
        "tog-shownumberswatching": "Бақылап тұрған қатысушылардың санын көрсет",
        "tog-oldsig": "Қазіргі уақыттағы қолтаңбаңыз:",
-       "tog-fancysig": "Қолтаңбаны уикимәтін ретінде қарастыру (автоматты сілтеме қойылмайды)",
+       "tog-fancysig": "Қолтаңбаны уикимәтінге айналдыру (автоматты сілтеме қойылмайды)",
        "tog-uselivepreview": "Тура қарап шығуды қолдану (сынақтық)",
-       "tog-forceeditsummary": "Өңдеменің қысқаша мазмұндамасы бос қалғанда маған ескерт",
+       "tog-forceeditsummary": "Өңдеме түйіндемесі бос қалғанда маған ескерт",
        "tog-watchlisthideown": "Өңдемелерімді бақылау тізімінен жасыру",
        "tog-watchlisthidebots": "Бот өңдемелерін бақылау тізімінен жасыру",
        "tog-watchlisthideminor": "Шағын өңдемелерді бақылау тізімінде көрсетпеу",
-       "tog-watchlisthideliu": "Бақылау тізіміндегі қатысушылардың өңдеулерін көрсетпеу",
-       "tog-watchlisthideanons": "Ð\91аÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ндегÑ\96 Ð¶Ð°Ñ\81Ñ\8bÑ\80Ñ\8bн қатысушылардың өңдеулерін көрсетпеу",
+       "tog-watchlisthideliu": "Бақылау тізіміндегі кірген қатысушылардың өңдеулерін көрсетпеу",
+       "tog-watchlisthideanons": "Ð\91аÒ\9bÑ\8bлаÑ\83 Ñ\82Ñ\96зÑ\96мÑ\96ндегÑ\96 Ð°Ð½Ð¾Ð½Ð¸Ð¼ қатысушылардың өңдеулерін көрсетпеу",
        "tog-watchlisthidepatrolled": "Бақылау тізімінде тексерілген өңдеулерді көрсетпеу",
-       "tog-ccmeonemails": "Ð\91аÑ\81Ò\9bа Ò\9bаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8bÒ\93а Ð¶Ñ\96беÑ\80ген Ñ\85аÑ\82Ñ\8bмнÑ\8bÒ£ ÐºÓ©Ñ\88Ñ\96Ñ\80меÑ\81Ñ\96н Ð¼Ð°Ò\93ан Ð´Ð° Ð¶Ó©Ð½ÐµÐ»Ñ\82",
+       "tog-ccmeonemails": "Ð\91аÑ\81Ò\9bа Ò\9bаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8bÒ\93а Ð¶Ñ\96беÑ\80ген Ñ\85аÑ\82Ñ\8bмнÑ\8bÒ£ ÐµÑ\81еÑ\81Ñ\96н Ó©Ð·Ñ\96ме Ð¶Ó©Ð½ÐµÐ»Ñ\82Ñ\83",
        "tog-diffonly": "Нұсқалар айырмашылықтарының астында бет мағлұматын көрсетпеу",
        "tog-showhiddencats": "Жасырын санаттарды көрсету",
        "tog-norollbackdiff": "Шегіндіруден кейін нұсқалардың айырмашылығын көрсетпеу",
-       "tog-useeditwarning": "Өңдемесі сақталмаған парақшадан шығар кезде ескерту",
+       "tog-useeditwarning": "Өзгерістері сақталмаған өңделудегі беттен шығар кезде ескерту",
        "tog-prefershttps": "Кірген кезде қауіпсіз байланысуды әрқашан қолдану",
        "underline-always": "Әрқашан",
        "underline-never": "Ешқашан",
-       "underline-default": "Шолғыш бойынша",
-       "editfont-style": "ӨңдеÑ\83 Ð¶Ð¾Ð»Ñ\8bндаÒ\93Ñ\8b Ò\9bаÑ\80Ñ\96пÑ\82Ñ\96Ò£ Ñ\82Ò¯рі",
+       "underline-default": "Әдепкі мәнер не броузер",
+       "editfont-style": "ӨңдеÑ\83 Ð°Ñ\83маÒ\93Ñ\8bндаÒ\93Ñ\8b Ò\9bаÑ\80Ñ\96п Ð¼Ó\99нері",
        "editfont-default": "Негізгі браузер",
        "editfont-monospace": "Бірдей енді қаріп",
        "editfont-sansserif": "Ноқатсыз қаріп",
        "november-date": "Қараша $1",
        "december-date": "Желтоқсан $1",
        "pagecategories": "{{PLURAL:$1|Санат|Санат}}",
-       "category_header": "\"$1\" санатындағы беттер",
+       "category_header": "«$1» санатындағы беттер",
        "subcategories": "Санатшалар",
-       "category-media-header": "\"$1\" санатындағы медиа",
-       "category-empty": "''Бұл санатта ағымда еш бет немесе медиа жоқ.''",
-       "hidden-categories": "{{PLURAL:$1|Жасырын санат|Жасырын санаттар}}",
+       "category-media-header": "«$1» санатындағы медиа",
+       "category-empty": "<em>Бұл санатта қазіргі уақытта еш бет немесе медиа жоқ.</em>",
+       "hidden-categories": "{{PLURAL:$1|Жасырын санат|Жасырын санат}}",
        "hidden-category-category": "Жасырын санаттар",
        "category-subcat-count": "{{PLURAL:$2|Бұл санатта тек келесі санатша бар.|Бұл санатта келесі {{PLURAL:$1|санатша|$1 санатша}} бар (не барлығы $2).}}",
-       "category-subcat-count-limited": "Бұл санатта келесі $1 санатша бар.",
+       "category-subcat-count-limited": "Бұл санатта келесі {{PLURAL:$1|санатша|$1 санатша}} бар.",
        "category-article-count": "{{PLURAL:$2|Бұл санатта тек келесі бет бар.|Бұл санатта келесі {{PLURAL:$1|бет|$1 бет}} бар, барлығы $2 сыртында.}}",
        "category-article-count-limited": "Ағымдағы санатта келесі $1 бет бар.",
        "category-file-count": "{{PLURAL:$2|Бұл санатта тек келесі файл бар.|Бұл санатта келесі {{PLURAL:$1|файл|$1 файл}} бар, барлығы $2 сыртында.}}",
        "category-file-count-limited": "Ағымдағы санатта келесі $1 файл бар.",
        "listingcontinuesabbrev": "(жалғ.)",
        "index-category": "Индекстелген беттер",
-       "noindex-category": "Ð\98ндекÑ\81Ñ\82елмейÑ\82Ñ\96н беттер",
+       "noindex-category": "Ð\98ндекÑ\81Ñ\82елмеген беттер",
        "broken-file-category": "Ақаулы файлдық сілтемелері бар беттер",
        "about": "Жоба туралы",
        "article": "Мағлұмат беті",
        "create-this-page": "Осы бетті бастау",
        "delete": "Жою",
        "deletethispage": "Бұл бетті жою",
-       "undeletethispage": "Ð\96ойÑ\8bлÒ\93ан Ð±ÐµÑ\82Ñ\82Ñ\96 Ò\9bайÑ\82ару",
-       "undelete_short": "{{PLURAL:$1|өңдеме|$1 өңдеме}} жоюын болдырмау",
-       "viewdeleted_short": "{{PLURAL:$1|жойылған өңдеуді|$1 жойылған өңдеулерді }} көру",
+       "undeletethispage": "Ð\91ұл Ð±ÐµÑ\82Ñ\82Ñ\96 Ò\9bалпÑ\8bна ÐºÐµÐ»Ñ\82Ñ\96ру",
+       "undelete_short": "{{PLURAL:$1|өңдеме|$1 өңдеме}} жойылуын болдырмау",
+       "viewdeleted_short": "{{PLURAL:$1|жойылған өңдемені|$1 жойылған өңдемені }} көру",
        "protect": "Қорғау",
        "protect_change": "өзгерту",
        "protectthispage": "Бұл бетті қорғау",
        "unprotect": "Қорғалуын өзгерту",
-       "unprotectthispage": "Бұл беттің қорғауын өзгерту",
+       "unprotectthispage": "Бұл беттің қорғалуын өзгерту",
        "newpage": "Жаңа бет",
        "talkpage": "Бұл бетті талқылау",
        "talkpagelinktext": "Талқылауы",
        "jumptonavigation": "шарлау",
        "jumptosearch": "іздеу",
        "view-pool-error": "Кешіріңіз, қазір серверлер шектен тыс жүктелуде.\nОсы бетті қарауға өте көп сұраныс жасалды.\nӨтініш, күте тұрыңыз және осы бетке кіруге қайта әрекет жасаңыз.\n\n$1",
-       "pool-timeout": "Бұғатталу уақытын күту мерзімі өтті",
+       "generic-pool-error": "Кешіріңіз, қазір серверлер шектен тыс жүктелуде.\nОсы бетті қарауға өте көп сұраныс жасалды.\nӨтініш, күте тұрыңыз және осы бетке кіруге қайта әрекет жасаңыз.",
+       "pool-timeout": "Құлыпталу уақытын күту мерзімі өтті",
        "pool-queuefull": "Сұранымдар жинақтауышысы толық",
        "pool-errorunknown": "Белгісіз қате",
        "aboutsite": "{{SITENAME}} туралы",
        "policy-url": "Project:Ережелер",
        "portal": "Қауым порталы",
        "portal-url": "Project:Қауым порталы",
-       "privacy": "Жеке құпиясын сақтау",
-       "privacypage": "Project:Жеке құпиясын сақтау",
+       "privacy": "Құпиялық саясаты",
+       "privacypage": "Project:Құпиялық саясаты",
        "badaccess": "Рұқсат беру қатесі",
        "badaccess-group0": "Сұратылған әрекетіңізді орындауға рұқсат етілмейді.",
-       "badaccess-groups": "Ð\90Ñ\82алÒ\93ан Ó\99Ñ\80екеÑ\82Ñ\82Ñ\96 Ñ\82ек {{PLURAL:$2|Ñ\82опÑ\82аÑ\80дÑ\8bÒ£|Ñ\82опÑ\82Ñ\8bÒ£}} $1 Ò\9bаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8bлаÑ\80Ñ\8b Ò\93ана Ð°Ñ\82Ò\9bаÑ\80а Ð°Ð»Ð°Ð´Ñ\8b.",
-       "versionrequired": "MediaWiki $1 нұсқасы керек",
-       "versionrequiredtext": "Бұл бетті қолдану үшін MediaWiki $1 нұсқасы керек. [[Special:Version|Жүйе нұсқасы бетін]] қараңыз.",
-       "ok": "Жарайды",
+       "badaccess-groups": "СÑ\96з Ñ\81Ò±Ñ\80анÒ\93ан Ó\99Ñ\80екеÑ\82Ñ\82Ñ\96 Ñ\82ек Ñ\88екÑ\82елген {{PLURAL:$2|Ñ\82опÑ\82Ñ\8bÒ£|Ñ\82опÑ\82Ñ\8bÒ£}} Ò\9bаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8bлаÑ\80Ñ\8b Ò\93ана Ð°Ñ\82Ò\9bаÑ\80а Ð°Ð»Ð°Ð´Ñ\8b: $1.",
+       "versionrequired": "MediaWiki $1 нұсқасын қажет етеді",
+       "versionrequiredtext": "Бұл бетті пайдалану үшін MediaWiki $1 нұсқасын қажет етеді. \n[[Special:Version|Жүйе нұсқасы бетін]] қараңыз.",
+       "ok": "OK",
        "pagetitle": "$1 — {{SITENAME}}",
        "retrievedfrom": "«$1» бетінен алынған",
-       "youhavenewmessages": "Сізде $1 бар ($2).",
-       "youhavenewmessagesfromusers": "Сіз {{PLURAL:$3|басқа қатысушыдан|$3 қатысушыдан}} $1 алдыңыз ($2).",
-       "youhavenewmessagesmanyusers": "Сіз бірнеше қатысушыдан $1 алдыңыз ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Сізге}} $1 келді ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|Сізге}} {{PLURAL:$3|басқа қатысушыдан|$3 қатысушыдан}} $1 келді ($2).",
+       "youhavenewmessagesmanyusers": "Сізге бірнеше қатысушыдан $1 келді ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|жаңа хабарлама|999=жаңа хабарламалар}}",
        "newmessagesdifflinkplural": "соңғы {{PLURAL:$1|өзгеріс|999=өзгерістер}}",
        "youhavenewmessagesmulti": "$1 дегенде жаңа хабарламалар бар",
        "viewdeleted": "$1 қарайсыз ба?",
        "restorelink": "{{PLURAL:$1|жойылған өңдемені|$1 жойылған өңдемені}}",
        "feedlinks": "Арна:",
-       "feed-invalid": "Жарамсыз жазылымды арна түрі.",
-       "feed-unavailable": "Синдикация таспалары қолжетімсіз",
+       "feed-invalid": "Жарамсыз жазылым арна түрі.",
+       "feed-unavailable": "Синдикация арналары қолжетімсіз",
        "site-rss-feed": "$1 RSS арнасы",
        "site-atom-feed": "$1 Atom арнасы",
        "page-rss-feed": "«$1» — RSS арнасы",
        "page-atom-feed": "«$1» — Atom арнасы",
        "red-link-title": "$1 (мұндай бет жоқ)",
-       "sort-descending": "Кему бойынша ретке келтіру",
-       "sort-ascending": "Өсу бойынша ретке келтіру",
+       "sort-descending": "Кемуі бойынша ретке келтіру",
+       "sort-ascending": "Артуы бойынша ретке келтіру",
        "nstab-main": "Мақала",
-       "nstab-user": "Жеке бет",
+       "nstab-user": "Қатысушы беті",
        "nstab-media": "Медиа беті",
        "nstab-special": "Арнайы бет",
        "nstab-project": "Жоба беті",
        "nstab-image": "Файл",
        "nstab-mediawiki": "Хабарлама",
        "nstab-template": "Үлгі",
-       "nstab-help": "Анықтама",
+       "nstab-help": "Анықтама беті",
        "nstab-category": "Санат",
        "nosuchaction": "Мұндай әрекет жоқ",
-       "nosuchactiontext": "URL-дегі көрсетілген әрекет қате.\nБәлкім, Сіз URL теру барысында қате жібердіңіз немесе қате сілтеме бойынша өттіңіз.\nБұл сондай-ақ {{SITENAME}} жобасында қателікті көрсетуі мүмкін.",
+       "nosuchactiontext": "URL-дегі көрсетілген әрекет жарамсыз.\nМүмкін сіз URL теру барысында қате жібердіңіз немесе дұрыс емес сілтеме бойынша өттіңіз.\nБұл сондай-ақ {{SITENAME}} жобасында қолданылатын бағдарламалық жасақтама қатесін көрсетуі мүмкін.",
        "nosuchspecialpage": "Мұндай арнайы бет жоқ",
-       "nospecialpagetext": "<strong>СÑ\96здÑ\96Ò£ Ñ\81Ò±Ñ\80аÒ\93ан Ð°Ñ\80найÑ\8b Ð±ÐµÑ\82Ñ\96Ò£Ñ\96з Ð¶Ð¾Ò\9b.</strong>\n\nÐ\91аÑ\80 Ð°Ñ\80найÑ\8b Ð±ÐµÑ\82Ñ\82еÑ\80 Ñ\82Ñ\96зÑ\96мÑ\96: [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>СÑ\96здÑ\96Ò£ Ñ\81Ò±Ñ\80аÒ\93ан Ð°Ñ\80найÑ\8b Ð±ÐµÑ\82Ñ\96Ò£Ñ\96з Ð¶Ð°Ñ\80амÑ\81Ñ\8bз.</strong>\n\nÐ\96аÑ\80амдÑ\8b Ð°Ñ\80найÑ\8b Ð±ÐµÑ\82Ñ\82еÑ\80 Ñ\82Ñ\96зÑ\96мÑ\96н [[Special:SpecialPages|{{int:specialpages}}]] Ð´ÐµÐ³ÐµÐ½Ð½ÐµÐ½ Ñ\82аба Ð°Ð»Ð°Ñ\81Ñ\8bз.",
        "error": "Қате",
        "databaseerror": "Дерекқор қатесі",
-       "databaseerror-query": "Сұрау:$1",
-       "databaseerror-function": "Әрекет: $1",
-       "databaseerror-error": "Қате:$1",
-       "laggedslavemode": "'''Ескерту:''' Бетте жуықтағы жаңартулар болмауы мүмкін.",
+       "databaseerror-text": "Дерекқор қатесі кездесті.\nБұл бағдарламалық жасақтама қатесін білдіруі мүмкін.",
+       "databaseerror-textcl": "Дерекқор қатесі кездесті.",
+       "databaseerror-query": "Сұрау: $1",
+       "databaseerror-function": "Функция: $1",
+       "databaseerror-error": "Қате: $1",
+       "laggedslavemode": "<strong>Ескерту:</strong> Бетте жуықтағы жаңартулар болмауы мүмкін.",
        "readonly": "Дерекқоры құлыпталған",
        "enterlockreason": "Құлыптау себебін, қай уақытқа дейін құлыпталғанын кірістіріп, енгізіңіз.",
        "readonlytext": "Бұл дерекқор жаңадан жазу және басқа өзгерістер жасаудан ағымда құлыпталынған, мүмкін күнде-күн дерекқорды баптау үшін, бұны бітіргеннен соң қалыпты іске қайтарылады.\n\nҚұлыптаған әкімші бұны былай түсіндіреді: $1",
        "readonly_lag": "Жетек дерекқор серверлер басқасымен қадамланғанда осы дерекқор өздіктік құлыпталынған",
        "internalerror": "Ішкі қате",
        "internalerror_info": "Ішкі қатесі: $1",
-       "filecopyerror": "«$1» Ñ\84айлÑ\8b Â«$2» Ñ\84айлÑ\8bна ÐºÓ©Ñ\88Ñ\96Ñ\80Ñ\96лмеді.",
+       "filecopyerror": "«$1» Ñ\84айлÑ\8b Â«$2» Ñ\84айлÑ\8bна ÐµÑ\81еленбеді.",
        "filerenameerror": "«$1» файл атауы «$2» атауына өзгертілмеді.",
        "filedeleteerror": "«$1» файлы жойылмайды.",
        "directorycreateerror": "«$1» қалтасы құрылмады.",
        "badarticleerror": "Осындай әрекет мына бетте атқарылмайды.",
        "cannotdelete": "«$1» беті немесе файлы жойылмайды. \nМұны әлдебіреу әлдеқашан жойған болуы мүмкін.",
        "cannotdelete-title": "«$1» бетін жою мүмкін емес",
-       "delete-hook-aborted": "ТүзеÑ\82Ñ\83 Ñ\96лмек Ð°Ñ\80Ò\9bÑ\8bлÑ\8b Ñ\82оÒ\9bÑ\82аÑ\82ылды.\nҚосымша түсіндірмелер көрсетілмеген.",
-       "no-null-revision": "\"$1\" беті үшін жаңа бос нұсқасын бастау мүмкін болмады.",
+       "delete-hook-aborted": "Ð\96ойÑ\8bлÑ\83 Ñ\96лмек Ð°Ñ\80Ò\9bÑ\8bлÑ\8b Ð´Ð¾Ò\93аÑ\80ылды.\nҚосымша түсіндірмелер көрсетілмеген.",
+       "no-null-revision": "«$1» беті үшін жаңа бос нұсқасын бастау мүмкін болмады.",
        "badtitle": "Жарамсыз тақырып аты",
-       "badtitletext": "СұÑ\80алÒ\93ан Ð±ÐµÑ\82 Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bбÑ\8bнÑ\8bÒ£ Ð°Ñ\82Ñ\8b Ð¶Ð°Ñ\80амÑ\81Ñ\8bз, Ð±Ð¾Ñ\81, Ñ\82Ñ\96лаÑ\80алÑ\8bÒ\9b Ñ\81Ñ\96лÑ\82емеÑ\81Ñ\96 Ð½Ðµ Ñ\83ики-аÑ\80алÑ\8bÒ\9b Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bп Ð°Ñ\82Ñ\8b Ð±Ò±Ñ\80Ñ\8bÑ\81 ÐµÐ½Ð³Ñ\96зÑ\96лген.\nÐ\9cÑ\8bнда Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bп Ð°Ñ\82Ñ\8bнда Ò\9bолдалмайтын бірқатар таңбалар болуы мүмкін.",
-       "perfcached": "Келесі дерек бүркемеленген, сондықтан толықтай жаңаланбаған болуы мүмкін. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
-       "perfcachedts": "Келесі дерек бүркемеленген, соңғы жаңаланған кезі: $1. Кэште {{PLURAL:$4|жазбалардан}} артық сақталмайды..",
-       "querypage-no-updates": "Бұл беттің жаңартылуы ағымда өшірілген. Деректері қазір өзгертілмейді.",
+       "badtitletext": "СұÑ\80алÒ\93ан Ð±ÐµÑ\82 Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bбÑ\8bнÑ\8bÒ£ Ð°Ñ\82Ñ\8b Ð¶Ð°Ñ\80амÑ\81Ñ\8bз, Ð±Ð¾Ñ\81, Ñ\82Ñ\96лаÑ\80алÑ\8bÒ\9b Ñ\81Ñ\96лÑ\82емеÑ\81Ñ\96 Ð½Ðµ Ñ\83ики-аÑ\80алÑ\8bÒ\9b Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bп Ð°Ñ\82Ñ\8b Ð±Ò±Ñ\80Ñ\8bÑ\81 ÐµÐ½Ð³Ñ\96зÑ\96лген.\nÐ\9eнда Ñ\82аÒ\9bÑ\8bÑ\80Ñ\8bп Ð°Ñ\82Ñ\8bнда Ò\9bолданÑ\8bлмайтын бірқатар таңбалар болуы мүмкін.",
+       "perfcached": "Келесі дерек бүркемеленген, сондықтан толықтай жаңаланбаған болуы мүмкін. Кэште ең көбі {{PLURAL:$1|бір нәтиже|$1 нәтиже}} қолжетімді.",
+       "perfcachedts": "Келесі дерек бүркемеленген, соңғы жаңаланған кезі: $1. Кэште ең көбі {{PLURAL:$4|бір нәтиже|$4 нәтиже}} қолжетімді.",
+       "querypage-no-updates": "Бұл беттің жаңартылуы қазіргі уақытта өшірілген.\nДеректері қазір өзгертілмейді.",
        "viewsource": "Қайнарын қарау",
-       "viewsource-title": "$1 бетінің бастапқы мәтінін қарау",
+       "viewsource-title": "$1 бетінің қайнарын қарау",
        "actionthrottled": "Әрекет бәсеңдетілді",
-       "actionthrottledtext": "Спамға қарсы күрес есебінде, осы әрекетті қысқа уақытта тым көп рет орындауыңыз шектелінді, және бұл шектеу шамасынан асып кеткенсіз.\nБірнеше минуттан қайта байқап көріңіз.",
-       "protectedpagetext": "Ð\91ұл Ð±ÐµÑ\82 Ó©Ò£Ð´ÐµÑ\83 Ð½ÐµÐ¼ÐµÑ\81е Ð±Ð°Ñ\81Ò\9bа Ó©Ð·Ð³ÐµÑ\80Ñ\96Ñ\81Ñ\82еÑ\80 ÐµÐ½Ð³Ñ\96зÑ\96лмеÑ\81 үшін қорғалған.",
+       "actionthrottledtext": "Спамға қарсы күрес есебінде осы әрекетті қысқа уақытта тым көп рет орындауыңыз шектелінді және бұл шектеу шамасынан асып кетіпсіз.\nБірнеше минуттан кейін қайта байқап көріңіз.",
+       "protectedpagetext": "Ð\91ұл Ð±ÐµÑ\82 Ó©Ò£Ð´ÐµÑ\83 Ð½ÐµÐ¼ÐµÑ\81е Ð±Ð°Ñ\81Ò\9bа Ó\99Ñ\80екеÑ\82Ñ\82еÑ\80дÑ\96 Ð±Ð¾Ð»Ð´Ñ\8bÑ\80маÑ\83 үшін қорғалған.",
        "viewsourcetext": "Бұл беттің қайнарын қарауыңызға және көшіріп алуыңызға болады:",
-       "viewyourtext": "Осы бет арқылы \"өзіңіз жасаған өңдеулердің\" бастапқы мәтінін көруге және көшіруге мүмкіндігіңіз болады.",
-       "protectedinterface": "This page provides interface text for the software on this wiki, and is protected to prevent abuse.\nTo add or change translations for all wikis, please use [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project.",
-       "editinginterface": "'''Ескерту:''' Бағдарламалық жасақтаманың тілдесу мәтінін жетістіретін бетін өңдеп жатырсыз.\nБұл беттің өзгертуі басқа қатысушыларға пайдаланушылық тілдесуі қалай көрінетіне әсер етеді.\nБарлық уикилер үшін аудармаларды өзгерту немесе қосу үшін [//translatewiki.net/ translatewiki.net] МедиаУики жерлестіру жобасын пайдаланыңыз.",
-       "cascadeprotected": "Бұл бет өңдеуден қорғалған, себебі бұл келесі «баулы қорғауы» қосылған {{PLURAL:$1|беттің|беттердің}} кірікбеті:\n$2",
-       "namespaceprotected": "'''$1''' есім аясындағы беттерді өңдеу үшін рұқсатыңыз жоқ.",
-       "customcssprotected": "Сіздің бұл CSS-бетті өңдеуге рұқсатыңыз жоқ, себебі мұнда өзге қатысушының жеке баптаулары бар.",
-       "customjsprotected": "Сіздің бұл JavaScript бетін өңдеуге рұқсатыңыз жоқ, себебі мұнда өзге қатысушының жеке баптаулары бар.",
+       "viewyourtext": "Осы беттен <strong>өңдемелеріңіздің</strong> қайнарын қарай және көшіре аласыз.",
+       "protectedinterface": "Бұл бет осы уикидің бағдарламалық жасақтамасы үшін интерфейс мәтінін қамтамасыз етеді және қиянаттауды болдырмау үшін қорғалған. Барлық уикилер үшін аудармаларды қосу немесе өзгерту үшін [//translatewiki.net/ translatewiki.net] MediaWiki жерсіндіру жобасын қолданыңыз.",
+       "editinginterface": "<strong>Ескерту:</strong> Бағдарламалық жасақтаманың тілдесу мәтінін жетістіретін бетін өңдеп жатырсыз.\nБұл беттің өзгертілуі басқа қатысушыларға пайдаланушылық интерфейсін қалай көрінетіне әсер етеді.\nБарлық уикилер үшін аудармаларды өзгерту немесе қосу үшін [//translatewiki.net/ translatewiki.net] МедиаУики жерсіндіру жобасын пайдаланыңыз.",
+       "cascadeprotected": "Бұл бет өңдеуден қорғалған, себебі бұл келесі «баулы қорғауы» қосылған {{PLURAL:$1|бетке|беттерге}} кірістірілген:\n$2",
+       "namespaceprotected": "<strong>$1</strong> есім кеңістігіндегі беттерді өңдеу рұқсатыңыз жоқ.",
+       "customcssprotected": "Сіздің бұл CSS бетін өңдеуге рұқсатыңыз жоқ, себебі мұнда өзге қатысушының жеке баптауларынан тұрады.",
+       "customjsprotected": "Сіздің бұл JavaScript бетін өңдеуге рұқсатыңыз жоқ, себебі мұнда өзге қатысушының жеке баптауларынан тұрады.",
        "mycustomcssprotected": "Сізде CSS бетін өңдеуге рұқсатыңыз жоқ.",
        "mycustomjsprotected": "Сізде JavaScript бетін өңдеуге рұқсатыңыз жоқ.",
-       "myprivateinfoprotected": "СÑ\96зде Ð¶ÐµÐºÐµ Ð°Ò\9bпаÑ\80аÑ\82Ñ\82аÑ\80Ñ\8bÒ£Ñ\8bздÑ\8b өңдеу рұқсатыңыз жоқ.",
+       "myprivateinfoprotected": "СÑ\96зде Ð¶ÐµÐºÐµ Ð¼Ó\99лÑ\96меÑ\82Ñ\82еÑ\80Ñ\96Ò£Ñ\96здÑ\96 өңдеу рұқсатыңыз жоқ.",
        "mypreferencesprotected": "Сізде баптауларыңызды өңдеуге рұқсатыңыз жоқ.",
-       "ns-specialprotected": "{{ns:special}} есім аясындағы беттер өңдеуге келмейді.",
-       "titleprotected": "Бұл тақырып аты бастаудан [[User:$1|$1]] қорғады.\nКелтірілген себебі: ''$2''.",
-       "filereadonlyerror": "«$2» Ñ\81аÒ\9bÑ\82амаÑ\81Ñ\8b Â«Ñ\82ек Ò\9bана Ð¾Ò\9bÑ\83» Ñ\82Ó\99Ñ\80Ñ\82Ñ\96пÑ\82емеÑ\81Ñ\96нде Ñ\82Ò±Ñ\80Ò\93аÑ\81Ñ\8bн, Â«$1» Ñ\84айлÑ\8bн Ó©Ð·Ð³ÐµÑ\80Ñ\82Ñ\83 Ð¼Ò¯Ð¼ÐºÑ\96н ÐµÐ¼ÐµÑ\81.\nÐ\91ұл Ñ\82Ó\99Ñ\80Ñ\82Ñ\96пÑ\82еменÑ\96 Ò\9bондÑ\8bÑ\80Ò\93ан Ó\99кÑ\96мÑ\88Ñ\96 ÐºÐµÐ»ÐµÑ\81Ñ\96 Ñ\82Ò¯Ñ\81Ñ\96ндÑ\96Ñ\80менÑ\96 Ò\9bалдÑ\8bÑ\80дÑ\8b: Â«''$3''»",
-       "invalidtitle-knownnamespace": "\"$2\" есім кеңістік түрі және  \"$3\" мәтіні жарамсыз",
-       "invalidtitle-unknownnamespace": "Нөмері $1 белгісіз есім кеңістік түрі және \"$2\" мәтіні жарамсыз",
+       "ns-specialprotected": "Арнайы беттер өңдеуге келмейді.",
+       "titleprotected": "Бұл атауды бастаудан [[User:$1|$1]] қорғаған.\nКелтірілген себебі: «<em>$2</em>».",
+       "filereadonlyerror": "«$2» Ñ\84айл Ò\9bоÑ\80Ñ\8b Ñ\82ек Ò\9bана Ð¾Ò\9bÑ\83 Ñ\82Ó\99Ñ\80Ñ\82Ñ\96пÑ\82емеÑ\81Ñ\96нде Ñ\82Ò±Ñ\80Ò\93аÑ\81Ñ\8bн Â«$1» Ñ\84айлÑ\8bн Ó©Ð·Ð³ÐµÑ\80Ñ\82Ñ\83 Ð¼Ò¯Ð¼ÐºÑ\96н ÐµÐ¼ÐµÑ\81.\nÐ\91ұл Ñ\82Ó\99Ñ\80Ñ\82Ñ\96пÑ\82еменÑ\96 Ò\9bондÑ\8bÑ\80Ò\93ан Ó\99кÑ\96мÑ\88Ñ\96 ÐºÐµÐ»ÐµÑ\81Ñ\96 Ñ\82Ò¯Ñ\81Ñ\96ндÑ\96Ñ\80менÑ\96 Ò\9bалдÑ\8bÑ\80дÑ\8b: Â«$3»",
+       "invalidtitle-knownnamespace": "«$2» есім кеңістік түрі және  «$3» мәтіні жарамсыз",
+       "invalidtitle-unknownnamespace": "Нөмері $1 белгісіз есім кеңістік атауы және «$2» мәтіні жарамсыз",
        "exception-nologin": "Кірмегенсіз",
        "exception-nologin-text": "Бұл әрекетке немесе бетке қатынау үшін [[Special:Userlogin|кіріңіз]].",
        "exception-nologin-text-manual": "Бұл бетке қатынау немесе әрекетті орнындау үшін $1",
-       "virus-badscanner": "Ð\94Ò±Ñ\80Ñ\8bÑ\81 ÐµÐ¼ÐµÑ\81 Ñ\96Ñ\88Ò\9bÒ±Ñ\80Ñ\8bлÑ\8bм. Ð\91елгÑ\96Ñ\81Ñ\96з Ð²Ð¸Ñ\80Ñ\83Ñ\81 Ñ\81канеÑ\80Ñ\96: $1",
-       "virus-scanfailed": "Ñ\81канеÑ\80леÑ\83 Ð¾Ñ\80Ñ\8bндалмадÑ\8b (код $1)",
+       "virus-badscanner": "Ð\94Ò±Ñ\80Ñ\8bÑ\81 ÐµÐ¼ÐµÑ\81 Ñ\96Ñ\88Ò\9bÒ±Ñ\80Ñ\8bлÑ\8bм. Ð\91елгÑ\96Ñ\81Ñ\96з Ð²Ð¸Ñ\80Ñ\83Ñ\81 Ñ\81кайнеÑ\80Ñ\96: <em>$1</em>",
+       "virus-scanfailed": "Ñ\81кайнеÑ\80леÑ\83 Ð¾Ñ\80Ñ\8bндалмадÑ\8b (кодÑ\8b: $1)",
        "virus-unknownscanner": "белгісіз антивирус:",
-       "logouttext": "<strong>Ð\96үйеден Ñ\88Ñ\8bÒ\9bÑ\82Ñ\8bÒ£Ñ\8bз.</strong>\n\nÐ\90Ò£Ò\93аÑ\80Ñ\82па: Ð\9aейбÑ\96Ñ\80 Ð±ÐµÑ\82Ñ\82еÑ\80 Ñ\88олÒ\93Ñ\8bÑ\88Ñ\8bÒ£Ñ\8bздÑ\8bÒ£ ÐºÑ\8dÑ\88Ñ\96н Ñ\82азаÑ\80Ñ\82Ò\9bанÑ\88а Ó\99лÑ\96 Ð´Ðµ Ð¶Ò¯Ð¹ÐµÐ³Ðµ ÐºÑ\96Ñ\80Ñ\96п Ð¾Ñ\82Ñ\8bÑ\80Ò\93анÑ\8bÒ£Ñ\8bздай ÐºÓ©Ñ\80Ñ\96нÑ\83Ñ\96 Ð¼Ò¯Ð¼ÐºÑ\96н.",
+       "logouttext": "<strong>Ð\96үйеден Ñ\88Ñ\8bÒ\9bÑ\82Ñ\8bÒ£Ñ\8bз.</strong>\n\nÐ\9aейбÑ\96Ñ\80 Ð±ÐµÑ\82Ñ\82еÑ\80 Ð±Ñ\80оÑ\83зеÑ\80Ñ\96Ò£Ñ\96здÑ\96Ò£ ÐºÑ\8dÑ\88Ñ\96н Ñ\82азаÑ\80Ñ\82Ò\9bанÑ\88а Ó\99лÑ\96 Ð´Ðµ Ð¶Ò¯Ð¹ÐµÐ³Ðµ ÐºÑ\96Ñ\80Ñ\96п Ð¾Ñ\82Ñ\8bÑ\80Ò\93анÑ\8bÒ£Ñ\8bздай ÐºÓ©Ñ\80Ñ\96нÑ\83Ñ\96 Ð¼Ò¯Ð¼ÐºÑ\96ндÑ\96гÑ\96н ÐµÑ\81кеÑ\80Ñ\96Ò£Ñ\96з.",
        "welcomeuser": "Қош келдіңіз, $1!",
-       "welcomecreation-msg": "Сіздің тіркеліміңіз жасалынды.\n[[Special:Preferences|{{SITENAME}} баптауларыңызды]] өзгертуді ұмытпаңыз.",
+       "welcomecreation-msg": "Сіз тіркелдіңіз.\n{{SITENAME}} [[Special:Preferences|баптауларыңызды]] өзіңіз қалауыңыз бойынша өзгерте аласыз.",
        "yourname": "Қатысушы аты:",
        "userlogin-yourname": "Қатысушы есіміңіз",
        "userlogin-yourname-ph": "Қатысушы есіміңізді енгізіңіз",
-       "createacct-another-username-ph": "Қатысушы есіміңізді енгізіңіз",
+       "createacct-another-username-ph": "Қатысушы есімін енгізіңіз",
        "yourpassword": "Құпия сөз:",
        "userlogin-yourpassword": "Құпия сөз",
        "userlogin-yourpassword-ph": "Құпия сөздіңізді енгізіңіз",
        "createacct-yourpasswordagain-ph": "Құпия сөзіңізді қайтадан енгізіңіз",
        "remembermypassword": "Тіркелгімді осы браузерде ұмытпа (ең көбі $1 {{PLURAL:$1|күн|күн}})",
        "userlogin-remembermypassword": "Мені жүйеде сақтап қою",
-       "userlogin-signwithsecure": "Құпия байланысуды қолдану",
-       "yourdomainname": "Желі үйшігіңіз:",
+       "userlogin-signwithsecure": "Қауіпсіз байланысуды қолдану",
+       "yourdomainname": "Үйшігіңіз:",
        "password-change-forbidden": "Сіз бұл уикиде құпия сөзіңізді өзгерте алмайсыз.",
        "externaldberror": "Осы арада не шеттік растау дерекқорында қате болды, немесе шеттік тіркелгіңізді жаңалау рұқсаты жоқ.",
        "login": "Кіру",
        "nav-login-createaccount": "Кіру / Тіркелу",
-       "loginprompt": "{{SITENAME}} Ñ\82оÑ\80абÑ\8bна ÐºÑ\96Ñ\80Ñ\83Ñ\96Ò£Ñ\96з Ò¯Ñ\88Ñ\96н Â«cookies» Ò\9bоÑ\81Ñ\8bлÑ\83Ñ\8b Ð¶Ó©Ð½.",
+       "loginprompt": "{{SITENAME}} Ñ\82оÑ\80абÑ\8bна ÐºÑ\96Ñ\80Ñ\83Ñ\96Ò£Ñ\96з Ò¯Ñ\88Ñ\96н Â«cookies» Ò\9bоÑ\81Ñ\8bлÑ\83Ñ\8b ÐºÐµÑ\80ек.",
        "userlogin": "Кіру / Тіркелу",
        "userloginnocreate": "Кіру",
        "logout": "Шығу",
        "notloggedin": "Кірмегенсіз",
        "userlogin-noaccount": "Тіркелгіңіз жоқ па?",
        "userlogin-joinproject": "{{SITENAME}} жобасына тіркелу",
-       "nologin": "ТÑ\96Ñ\80келгÑ\96Ò£Ñ\96з Ð±Ð°Ñ\80 Ð¼а? $1.",
+       "nologin": "ТÑ\96Ñ\80келгÑ\96Ò£Ñ\96з Ð¶Ð¾Ò\9b Ð¿а? $1.",
        "nologinlink": "Тіркелгіңізді жасаңыз",
-       "createaccount": "Ð\96аңа Ñ\82Ñ\96Ñ\80келгÑ\96",
+       "createaccount": "ТÑ\96Ñ\80келÑ\83",
        "gotaccount": "Бұған дейін тіркеліп пе едіңіз? '''$1'''.",
        "gotaccountlink": "Кіріңіз",
        "userlogin-resetlink": "Қатысушы атын не құпия сөзді ұмыттыңыз ба?",
        "userlogin-helplink2": "Кіруге көмек",
        "userlogin-loggedin": "{{GENDER:$1|$1}} ретінде әлдеқашан кіргенсіз.\nТөмендегі пішінді басқа қатысушы кіруі ретінде қолданыңыз.",
        "userlogin-createanother": "Басқа тіркелгі жасау",
-       "createacct-emailrequired": "Е-пошта мекен-жайы:",
-       "createacct-emailoptional": "Е-поштаның мекен-жайы (міндетті емес)",
+       "createacct-emailrequired": "Е-пошта мекен-жайы",
+       "createacct-emailoptional": "Е-пошта мекен-жайы (міндетті емес)",
        "createacct-email-ph": "Е-пошта мекен-жайыңызды енгізіңіз",
        "createacct-another-email-ph": "Е-пошта мекен-жайын енгізіңіз",
-       "createaccountmail": "Уақытша берілген кілтсөзді пайдаланыңыз және оны көрсетілген электрондық поштаға жіберіңіз",
+       "createaccountmail": "Уақытша берілген құпия сөзді пайдаланыңыз және оны көрсетілген электрондық поштаға жіберіңіз",
        "createacct-realname": "Нақты атыңыз (ерікті)",
        "createaccountreason": "Себебі:",
        "createacct-reason": "Себебі:",
        "createacct-imgcaptcha-ph": "Жоғарыдағы мәтінді енгізіңіз",
        "createacct-submit": "Тіркелгіңізді жасаңыз",
        "createacct-another-submit": "Басқа тіркелгі жасау",
-       "createacct-benefit-heading": "{{SITENAME}} сіз сияқты қызығатын адамдар арқылы жасалады.",
+       "createacct-benefit-heading": "{{SITENAME}} сіздермен жасалады.",
        "createacct-benefit-body1": "{{PLURAL:$1|өңдеме|өңдеме}}",
        "createacct-benefit-body2": "{{PLURAL:$1|бет|бет}}",
        "createacct-benefit-body3": "жуықтағы {{PLURAL:$1|қатысушы|қатысушы}}",
        "nocookiesnew": "Жаңа қатысушы тіркелгісі жасалды, бірақ кірмегенсіз.\nҚатысушы кіру үшін {{SITENAME}} торабында «cookie» файлдары қолданылады.\nСізде «cookies» өшірілген.\nСоны қосыңыз да жаңа қатысушы атыңызды және құпия сөзіңізді енгізіп кіріңіз.",
        "nocookieslogin": "Қатысушы кіру үшін {{SITENAME}} торабында «cookies» деген қолданылады.\nСізде «cookies» өшірілген.\nСоны қосыңыз да кіруді қайта байқап көріңіз.",
        "nocookiesfornew": "Оның қайнарын растай алмағандықтан қатысушының аккаунты тіркелмеді. «Cookies» қосылып тұрғанына көз жеткізіңіз, бетті қайта жаңартыңыз және тағы байқап көріңіз.",
-       "noname": "Ð\96аÑ\80амдÑ\8b Ò\9bаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8b Ð°Ñ\82Ñ\8bн ÐµÐ½Ð³Ñ\96збедÑ\96Ò£Ñ\96з.",
-       "loginsuccesstitle": "Кіруіңіз сәтті өтті",
-       "loginsuccess": "'''Сіз енді {{SITENAME}} жобасына «$1» ретінде кірдіңіз.'''",
-       "nosuchuser": "«$1» деген қатысушы тіркелмеген.\nҚатысушы аттары кіші әріптерден тұру керек.\nЕмлеңізді тексеріңіз, немесе [[Special:UserLogin/signup|жаңа тіркелгі жасаңыз]].",
-       "nosuchusershort": "Мұнда «$1» деп аталған қатысушы жоқ.\nЕмлеңізді тексеріңіз.",
-       "nouserspecified": "Қатысушы атын келтіруіңіз жөн.",
+       "noname": "СÑ\96зде Ð¶Ð°Ñ\80амдÑ\8b Ò\9bаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8b Ð°Ñ\82Ñ\8b Ð°Ð½Ñ\8bÒ\9bÑ\82алмаÒ\93ан.",
+       "loginsuccesstitle": "Кіруіңіз сәтті болды.",
+       "loginsuccess": "<strong>Сіз енді {{SITENAME}} жобасына «$1» ретінде кірдіңіз.</strong>",
+       "nosuchuser": "Мұнда «$1» деп аталған қатысушы тіркелмеген.\nҚатысушы аттары кіші әріптерден тұру керек.\nЕмлеңізді тексеріңіз немесе [[Special:UserLogin/signup|жаңа тіркелгі жасаңыз]].",
+       "nosuchusershort": "Мұнда «$1» деп аталған қатысушы тіркелмеген.\nЕмлеңізді тексеріңіз.",
+       "nouserspecified": "Қатысушы атын көрсетуіңіз керек.",
        "login-userblocked": "Бұл қатысушы бұғатталған. Жүйеге кiру рұқсат етiлмеген.",
-       "wrongpassword": "Ð\91Ò±Ñ\80Ñ\8bÑ\81 Ò\9bұпиÑ\8f Ñ\81өз ÐµÐ½Ð³Ñ\96зÑ\96лген. Қайта байқап көріңіз.",
-       "wrongpasswordempty": "Құпия сөз бос болған. Қайта байқап көріңіз.",
-       "passwordtooshort": "Құпия сөзіңіз жарамсыз немесе тым қысқа.\nБұнда ең кемінде $1 таңба болуы керек.",
-       "password-name-match": "Енгізген құпия сөзіңіз қатысушы атынан өзгеше болуы қажет.",
+       "wrongpassword": "Ð\94Ò±Ñ\80Ñ\8bÑ\81 ÐµÐ¼ÐµÑ\81 Ò\9bұпиÑ\8f Ñ\81өз ÐµÐ½Ð³Ñ\96зÑ\96лген. \nҚайта байқап көріңіз.",
+       "wrongpasswordempty": "Құпия сөз бос болған.\nҚайта байқап көріңіз.",
+       "passwordtooshort": "Құпиясөзде кем дегенде {{PLURAL:$1|1таңба|таңба}} болуы керек.",
+       "password-name-match": "Құпия сөзіңіз қатысушы атынан өзгеше болуы қажет.",
        "password-login-forbidden": "Бұл қатысушы аты мен құпия сөзін пайдалануға тыйым салынған.",
        "mailmypassword": "Құпия сөзді қалпына кеттіру",
        "passwordremindertitle": "{{SITENAME}} үшін жаңа уақытша құпия сөз",
-       "passwordremindertext": "Біреу (IP мекенжайы: $1, бәлкім өзіңіз боларсыз) {{SITENAME}} үшін жаңа құпия сөз жөнелету сұранымын жасаған ($4).\nҚатысушы «$2» үшін уақытша құпия сөз жасалды: «$3». Егер бұл Сіздің сұранымыңыз болса, жүйеге кіріп құпия сөзді өзгертуіңіз керек. Сіздің уақытша құпия сөзіңіз $5 дейін белсенді болады.\n\nЕгер бұл сұранымды Сіз жасамасыңыз, не құпия сөзді еске түсіріп енді өзгерткіңіз келмесе, ескі құпия сөзді қолдануды жалғастырып осы хатқа аңғармауыңызға да болады.",
-       "noemail": "Осы арада «$1» қатысушының е-пошта мекенжайы жоқ.",
-       "noemailcreate": "СÑ\96зге Ð½Ð°Ò\9bÑ\82Ñ\8b Ð¶Ð°Ñ\80амдÑ\8b Ñ\8dлекÑ\82Ñ\80ондÑ\8bÒ\9b Ð¿Ð¾Ñ\88Ñ\82а Ð¼ÐµÐºÐµÐ½-жайÑ\8bн ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\83 ÐºÐµÑ\80ек.",
-       "passwordsent": "Жаңа құпия сөз «$1» үшін тіркелген е-пошта мекенжайына жөнелтілді.\nҚабылдағаннан кейін кіргенде соны енгізіңіз.",
+       "passwordremindertext": "Біреу (IP мекенжайы: $1, бәлкім өзіңіз боларсыз) {{SITENAME}} жобасында жаңа құпия сөз жөнелету сұранымын жасаған ($4).\nҚатысушы «$2» үшін уақытша құпия сөз жасалды: «$3». Егер бұл сіздің сұранымыңыз болса қазір жүйеге кіріп жаңа құпия сөз таңдауыңыз керек. \nСіздің уақытша құпия сөзіңіз {{PLURAL:$5|бір күнге|$5 күнге}} дейін белсенді болады.\n\nЕгер бұл сұранымды басқа біреу жасаса, не құпия сөздіңізді еске түсіріп енді өзгерткіңіз келмесе ескі құпия сөзді қолдануды жалғастырып осы хатты елемеуіңізге да болады.",
+       "noemail": "Осы арада жазылып алынған «$1» қатысушының е-пошта мекенжайы жоқ.",
+       "noemailcreate": "Сізге жарамды электрондық пошта мекен-жайын көрсету керек.",
+       "passwordsent": "Жаңа құпия сөз «$1» үшін тіркелген е-пошта мекенжайына жөнелтілді.\nҚабылдағаннан кейін қайта жүйеге кіргенде соны енгізіңіз.",
        "blocked-mailpassword": "IP мекенжайыңыздан өңдеу бұғатталған, сондықтан қиянатты қақпайлау үшін құпия сөзді қалпына келтіру жетесін қолдануына рұқсат етілмейді.",
-       "eauthentsent": "Ò\9aұпÑ\82аÑ\83 Ñ\85аÑ\82Ñ\8b Ð°Ð¹Ñ\82Ñ\8bлмÑ\8bÑ\88 Ðµ-поÑ\88Ñ\82а Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8bна Ð¶Ó©Ð½ÐµÐ»Ñ\82Ñ\96лдÑ\96.\nÐ\91аÑ\81Ò\9bа Ðµ-поÑ\88Ñ\82а Ñ\85аÑ\82Ñ\8bн Ð¶Ó©Ð½ÐµÐ»Ñ\82Ñ\83 Ð°Ð»Ð´Ñ\8bнан, Ñ\82Ñ\96Ñ\80келгÑ\96 Ñ\88Ñ\8bнÑ\8bнан сіздікі екенін құптау үшін хаттағы нұсқамаларға лесіңіз.",
-       "throttled-mailpassword": "Соңғы {{PLURAL:$1|сағатта|$1 сағатта}} құпия сөз ескерту хаты әлдеқашан жөнелтілді.\nҚиянатты қақпайлау үшін {{PLURAL:$1|сағат|$1 сағат}} сайын тек бір ғана құпия сөз ескерту хаты жөнелтіледі.",
+       "eauthentsent": "Ò\9aұпÑ\82аÑ\83 Ñ\85аÑ\82Ñ\8b ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\96лген Ðµ-поÑ\88Ñ\82а Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8bна Ð¶Ó©Ð½ÐµÐ»Ñ\82Ñ\96лдÑ\96.\nÐ\9aез-келген Ð±Ð°Ñ\81Ò\9bа Ðµ-поÑ\88Ñ\82а Ñ\85аÑ\82Ñ\8bн Ñ\82Ñ\96Ñ\80келгÑ\96ге Ð¶Ó©Ð½ÐµÐ»Ñ\82Ñ\83 Ð°Ð»Ð´Ñ\8bнан, Ñ\82Ñ\96Ñ\80келгÑ\96 Ñ\88Ñ\8bнÑ\8bмен сіздікі екенін құптау үшін хаттағы нұсқамаларға лесіңіз.",
+       "throttled-mailpassword": "Соңғы {{PLURAL:$1|сағатта|$1 сағатта}} құпия сөзді өзгерту хаты әлдеқашан жіберілді.\nҚиянатты қақпайлау үшін {{PLURAL:$1|сағат|$1 сағат}} сайын тек бір ғана құпия сөзді өзгерту хаты жіберіледі.",
        "mailerror": "Хат жөнелту қатесі: $1",
-       "acct_creation_throttle_hit": "Сіздің IP-мекенжайыңызбен осы уикиге кірушілер соңғы күнде {{PLURAL:$1|1 тіркелгі|$1 тіркелгі}} жасапты. Одан артық бұл уақыт аралығында рұқсат етілмейді.\nНәтижесінде осы IP-мекенжайды пайдаланып кірушілер дәл қазіргі уақытта бірнеше тіркелгі жасай алмайды.",
-       "emailauthenticated": "Е-пошта мекен-жайыңыз расталған кезі: $3, $2.",
-       "emailnotauthenticated": "Е-пошта мекен-жайыңыз әлі расталған жоқ.\nКелесі әрбір мүмкіндіктер үшін еш хат жөнелтілмейді.",
+       "acct_creation_throttle_hit": "Сіздің IP мекенжайыңызбен осы уикиге кірушілер соңғы күнде {{PLURAL:$1|1 тіркелгі|$1 тіркелгі}} жасапты. Одан артық бұл уақыт аралығында рұқсат етілмейді.\nНәтижесінде осы IP мекенжайды пайдаланып кірушілер дәл қазіргі уақытта бірнеше тіркелгі жасай алмайды.",
+       "emailauthenticated": "Е-пошта мекенжайыңыз расталған кезі: $3, $2.",
+       "emailnotauthenticated": "Е-пошта мекенжайыңыз әлі расталған жоқ.\nКелесі әрбір мүмкіндіктер үшін еш хат жөнелтілмейді.",
        "noemailprefs": "Осы мүмкіндіктер істеуі үшін е-пошта мекен-жайыңызды енгізіңіз.",
        "emailconfirmlink": "Е-пошта мекен-жайыңызды құптаңыз",
-       "invalidemailaddress": "Ð\91ұл Ðµ-поÑ\88Ñ\82а ÐµÑ\81Ñ\96мÑ\96 Ð¿Ñ\96Ñ\88Ñ\96мге Ñ\81Ó\99йкеÑ\81 ÐºÐµÐ»Ð¼ÐµÐ³ÐµÐ½Ð´Ñ\96кÑ\82ен Ò\9bабÑ\8bлданбайдÑ\8b.\nÐ\94Ò±Ñ\80Ñ\8bÑ\81 Ð¿Ñ\96Ñ\88Ñ\96мделген Ðµ-поÑ\88Ñ\82а ÐµÑ\81Ñ\96мÑ\96н ÐµÐ½Ð³Ñ\96зÑ\96Ò£Ñ\96з, Ð½ÐµÐ¼ÐµÑ\81е Ð°Ñ\83мақты бос қалдырыңыз.",
-       "cannotchangeemail": "Тіркелгінің е-поштасының мекен-жайы бұл уикиде өзгертілмейді.",
-       "emaildisabled": "Бұл сайт е-поштаның хабарламасын жібере алмайды.",
+       "invalidemailaddress": "Ð\91ұл Ðµ-поÑ\88Ñ\82а Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8b Ð¶Ð°Ñ\80амÑ\81Ñ\8bз Ð¿Ñ\96Ñ\88Ñ\96мде Ð±Ð¾Ð»Ò\93анÑ\8b Ð°Ð½Ñ\8bÒ\9bÑ\82алÒ\93андÑ\8bÒ\9bÑ\82ан Ò\9bабÑ\8bлданбайдÑ\8b.\nÐ\94Ò±Ñ\80Ñ\8bÑ\81 Ð¿Ñ\96Ñ\88Ñ\96мделген Ðµ-поÑ\88Ñ\82а Ð¼ÐµÐºÐµÐ½Ð¶Ð°Ð¹Ñ\8bн ÐµÐ½Ð³Ñ\96зÑ\96Ò£Ñ\96з Ð½ÐµÐ¼ÐµÑ\81е Ð¶Ð¾Ð»ақты бос қалдырыңыз.",
+       "cannotchangeemail": "Тіркелгінің е-пошта мекенжайы бұл уикиде өзгертілмейді.",
+       "emaildisabled": "Бұл сайт хаттар жібере алмайды.",
        "accountcreated": "Тіркелгі жасалды",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|талқылауы]]) үшін жаңа қатысушы тіркелгісі жасалды.",
-       "createaccount-title": "{{SITENAME}} үшін тіркелу",
-       "createaccount-text": "Кейбіреу е-пошта мекенжайыңызды пайдаланып {{SITENAME}} жобасында ($4) «$2» атауымен, «$3» құпия сөзімен тіркелгі жасаған.\nЖобаға кіріуіңіз және құпия сөзіңізді өзгертуіңіз тиісті.\n\nЕгер бұл тіркелгі қателікпен жасалса, осы хабарға елемеуіңіз мүмкін.",
-       "login-throttled": "Сіз жүйеге кіру үшін тым көп талпыныс жасадыңыз. Өтінемін, қайта кірмес бұрын $1 күте тұрыңыз.",
-       "login-abort-generic": "Жүйеге кіру үшін сәтсіз талпыныс жасадыңыз.",
+       "createaccount-title": "{{SITENAME}} жобасына тіркелу",
+       "createaccount-text": "Әлдебіреу е-пошта мекенжайыңызды пайдаланып {{SITENAME}} жобасында ($4) «$2» деген атау, «$3» деген құпия сөзбен тіркелгі жасаған.\nҚазір жүйеге кіріуіңіз және құпия сөзіңізді өзгертуіңіз керек.\n\nЕгер бұл тіркелгі қателікпен жасалса осы хабарламаны елемеуіңізге болады.",
+       "login-throttled": "Сіз жүйеге кіру үшін тым көп талпыныс жасадыңыз.\nҚайта байқап көрмес бұрын $1 күте тұрыңыз.",
+       "login-abort-generic": "Жүйеге кіру сәтсіз болды - Доғарылды.",
        "loginlanguagelabel": "Тіл: $1",
-       "suspicious-userlogout": "Сіздің жүйеден шығу сұранымыңыз қабылданбады, өйткені, бұл жарамсыз браузер немесе кэштеуші проксидің сұранымына ұқсайды.",
+       "suspicious-userlogout": "Сіздің жүйеден шығу сұранымыңыз қабылданбады, өйткені бұл бұзылған браузер немесе кэштеуші прокси арқылы жіберілгенге ұқсайды.",
        "pt-login": "Кіру",
        "pt-login-button": "Кіру",
        "pt-createaccount": "Тіркелгі жасау",
        "pt-userlogout": "Шығу",
        "php-mail-error-unknown": "Mail() PHP-функциясындағы белгісіз қате.",
-       "user-mail-no-addy": "Е-пошта есімінсіз хабарлама жіберуге талпынды.",
+       "user-mail-no-addy": "Е-пошта мекенжайынсыз хабарлама жіберуді байқап көрді.",
+       "user-mail-no-body": "Бос немесе қысқа мағынасыз хабарлама жіберуді байқап көрді.",
        "changepassword": "Құпия сөзді өзгерту",
-       "resetpass_announce": "Ð\9aÑ\96Ñ\80Ñ\83Ñ\96Ò£Ñ\96здÑ\96 Ð±Ñ\96Ñ\82Ñ\96Ñ\80Ñ\83 Ò¯Ñ\88Ñ\96н Ð¶Ð°Ò£Ð° Ò\9bұпиÑ\8f Ñ\81өзÑ\96Ò£Ñ\96здÑ\96 Ð¼Ñ\8bнда енгізуіңіз керек:",
+       "resetpass_announce": "Ð\9aÑ\96Ñ\80Ñ\83Ñ\96Ò£Ñ\96здÑ\96 Ð°Ñ\8fÒ\9bÑ\82аÑ\83 Ò¯Ñ\88Ñ\96н Ð¶Ð°Ò£Ð° Ò\9bұпиÑ\8f Ñ\81өзÑ\96Ò£Ñ\96здÑ\96 енгізуіңіз керек:",
        "resetpass_header": "Құпия сөзді өзгерту",
        "oldpassword": "Ескі құпия сөзіңіз:",
        "newpassword": "Жаңа құпия сөзіңіз:",
        "changepassword-success": "Құпия сөзіңіз сәтті өзгертілді!",
        "changepassword-throttled": "Сіз жақында кіруге тым көп әрекет жасадыңыз.\nҚайта байқап көру үшін $1 уақыт күте тұрыңыз.",
        "resetpass_forbidden": "Құпия сөз өзгертілмейді",
-       "resetpass-no-info": "Бұл бетке тікелей ену үшін, жүйеге кіруіңіз керек.",
+       "resetpass-no-info": "Бұл бетке тікелей ену үшін жүйеге кіруіңіз керек.",
        "resetpass-submit-loggedin": "Құпия сөзді өзгерту",
        "resetpass-submit-cancel": "Болдырмау",
-       "resetpass-wrong-oldpass": "Уақытша немесе ағымдағы құпия сөзіңіз дұрыс емес.\nМүмкін Сіз құпия сөзді сәтті өзгерткенсіз, немесе жаңа уақытша құпия сөзге сұраным жасағансыз.",
+       "resetpass-wrong-oldpass": "Уақытша немесе қазіргі құпия сөзіңіз жарамсыз.\nМүмкін сіз құпия сөзді сәтті өзгерткенсіз немесе жаңа уақытша құпия сөзге сұраным жасағансыз.",
        "resetpass-temp-password": "Уақытша құпия сөз:",
-       "resetpass-abort-generic": "Құпия сөзді өзгерту кеңейтпенің әсерінен аяқталмады.",
+       "resetpass-abort-generic": "Құпия сөзді өзгерту кеңейтілім арқылы доғарылды.",
        "passwordreset": "Құпия сөзді қайтару",
-       "passwordreset-text-one": "Құпия сөзіңізді түзеу үшін бұл пішінді толтырыңыз.",
-       "passwordreset-text-many": "{{PLURAL:$1|Ð\95-поÑ\87та арқылы уақытша құпия сөзді қабылдау үшін жолақтардың бірін толтырыңыз.}}",
+       "passwordreset-text-one": "Уақытша құпия сөзіңізді электрон пошта арқылы қабылдау үшін бұл пішінді толтырыңыз.",
+       "passwordreset-text-many": "{{PLURAL:$1|Ð\95-поÑ\88та арқылы уақытша құпия сөзді қабылдау үшін жолақтардың бірін толтырыңыз.}}",
        "passwordreset-legend": "Құпия сөзді қайтару",
        "passwordreset-disabled": "Бұл уикиде құпия сөзді қайтару ажыратылған.",
        "passwordreset-emaildisabled": "E-mail мүмкіндігі бұл уикиде өшірілген.",
        "passwordreset-emailerror-capture": "Жазылған ескертпе-хат төменде көрсетілген, оның жөнелтілмеу себебі: $1",
        "changeemail": "Е-пошта мекен-жайын өзгерту",
        "changeemail-header": "Е-пошта мекен-жайының өзгертілуі",
-       "changeemail-text": "Е-поштаның мекен-жайын өзгерту үшін мына пішінді толтырыңыз. Өзгертулерді растау үшін Сізге құпия сөзді енгізу керек.",
-       "changeemail-no-info": "Бұл бетке тікелей ену үшін, жүйеге кіруіңіз керек.",
-       "changeemail-oldemail": "Е-поштаның ағымдағы мекен-жайы:",
-       "changeemail-newemail": "Ð\95-поÑ\88Ñ\82анÑ\8bÒ£ Ð¶Ð°Ò£Ð° Ð¼ÐµÐºÐµÐ½ жайы:",
+       "changeemail-text": "Е-поштаның мекен-жайын өзгерту үшін мына пішінді толтырыңыз. Өзгертулерді растау үшін құпия сөздіңізді енгізу керек.",
+       "changeemail-no-info": "Бұл бетке тікелей ену үшін жүйеге кіруіңіз керек.",
+       "changeemail-oldemail": "Е-поштаның қазіргі уақыттағы мекен-жайы:",
+       "changeemail-newemail": "Ð\96аңа Ðµ-поÑ\88Ñ\82а Ð¼ÐµÐºÐµÐ½жайы:",
        "changeemail-none": "(ешкім)",
-       "changeemail-password": "Сіздің {{SITENAME}} жобасындағы құпия сөзіңіз:",
+       "changeemail-password": "{{SITENAME}} жобасындағы құпия сөзіңіз:",
        "changeemail-submit": "Е-поштаны өзгерту",
        "changeemail-cancel": "Болдырмау",
        "changeemail-throttled": "Сіз жақында кіруге тым көп әрекет жасадыңыз.\nҚайта байқап көру үшін $1 уақыт күте тұрыңыз.",
        "italic_tip": "Қиғаш мәтін",
        "link_sample": "Сілтеме тақырыбының аты",
        "link_tip": "Ішкі сілтеме",
-       "extlink_sample": "http://www.мысал.com сілтеме тақырыбының аты",
-       "extlink_tip": "ШеÑ\82Ñ\82Ñ\96к сілтеме (алдынан http:// енгізуін ұмытпаңыз)",
+       "extlink_sample": "http://www.example.com сілтеме тақырыбының аты",
+       "extlink_tip": "СÑ\8bÑ\80Ñ\82Ò\9bÑ\8b сілтеме (алдынан http:// енгізуін ұмытпаңыз)",
        "headline_sample": "Бас жол мәтіні",
        "headline_tip": "2-ші деңгейлі бас жол",
-       "nowiki_sample": "Ð\9fÑ\96Ñ\88Ñ\96мделÑ\96нбеген Ð¼Ó\99Ñ\82Ñ\96ндÑ\96 Ð¼Ñ\8bнда ÐµÐ½Ð³Ñ\96зіңіз",
-       "nowiki_tip": "Уики пішімін елемеу",
+       "nowiki_sample": "ФоÑ\80маÑ\82Ñ\82алмаÒ\93ан Ð¼Ó\99Ñ\82Ñ\96ндÑ\96 Ð¼Ñ\8bнда ÐºÑ\96Ñ\80Ñ\96Ñ\81Ñ\82Ñ\96Ñ\80іңіз",
+       "nowiki_tip": "Уики форматтауын елемеу",
        "image_sample": "Мысал.jpg",
        "image_tip": "Ендірілген файл",
        "media_tip": "Файл сілтемесі",
        "preview": "Қарап шығу",
        "showpreview": "Алдын ала қарау",
        "showdiff": "Өзгерістерді көрсет",
-       "anoneditwarning": "'''Ескерту:''' Сіз жүйеге кірмегенсіз.\nIP-мекенжайыңыз бұл беттің түзету тарихында жазылып алынады.",
-       "anonpreviewwarning": "\"Сіз жүйеге кірмегенсіз. IP-мекенжайыңыз бұл беттің өңдеу тарихында жазылып алынады.\"",
-       "missingsummary": "'''Ескерту:''' Өңдеменің қысқаша түйіндемесін енгізбепсіз.\n«Сақтау» түймесін қайта бассаңыз, өңденмеңіз түйіндемесіз сақталады.",
-       "missingcommenttext": "Ð\9cÓ\99ндемеңÑ\96здÑ\96 Ñ\82өменде енгізіңіз.",
-       "missingcommentheader": "'''Ескерту:''' Бұл мәндемеге тақырып/басжол жазбапсыз.\n«{{int:savearticle}}» түймесін тағы бассаңыз, өңдемеңіз түйіндемесіз жазылады.",
+       "anoneditwarning": "<strong> Ескерту:</strong>  Сіз жүйеге кірмегенсіз.\nIP мекенжайыңыз бұл беттің өңделу тарихында жазылып алынады.",
+       "anonpreviewwarning": "<em>Сіз жүйеге кірмегенсіз. IP мекенжайыңыз бұл беттің өңделу тарихында жазылып алынады.</em>",
+       "missingsummary": "<strong>Ескерту:</strong> Өңдеменің қысқаша түйіндемесін енгізбепсіз.\n«{{int:savearticle}}» батырмасын қайта бассаңыз өңденмеңіз түйіндемесіз сақталады.",
+       "missingcommenttext": "Ð\9fÑ\96кÑ\96Ñ\80Ñ\96Ò£Ñ\96здÑ\96 Ñ\82өменге енгізіңіз.",
+       "missingcommentheader": "<strong>Ескерту:</strong> Бұл пікірге тақырыпы/бас жолы жазбапсыз.\n«{{int:savearticle}}» түймесін тағы бассаңыз өңдемеңіз түйіндемесіз сақталады.",
        "summary-preview": "Қысқаша түйіндемесін қарап шығу:",
        "subject-preview": "Тақырыбын/бас жолын қарап шығу:",
        "blockedtitle": "Қатысушы бұғатталған",
-       "blockedtext": "'''Қатысушы атыңыз не IP мекенжайыңыз бұғатталған.'''\n\nОсы бұғаттауды $1 істеген. Келтірілген себебі: ''$2''.\n\n* Бұғаттаудың басталғаны: $8\n* Бұғаттаудың бітетіні: $6\n* Бұғаттау нысанасы: $7\n\nОсы бұғаттауды талқылау үшін $1, не өзге [[{{MediaWiki:Grouppage-sysop}}|әкімшімен]] қатынасуыңызға болады.\n[[Special:Preferences|Тіркелгі бапталымдары]]ңызда жарамды е-пошта мекенжайын ұсынып және де оны пайдаланудан бұғатталмаған жағдайыңызда ғана «Қатысушыға хат жазу» қызметін қолдана аласыз.\nАғымдық IP мекенжайыңыз: $3, және бұғатау нөмірі: $5.\nСұраным жасағанда осының екеуін де кірістіруіңізді сұраймыз.",
-       "autoblockedtext": "'''Қатысушы атыңыз не IP-мекенжайыңыз бұғатталған.'''\n\nОсы бұғаттауды $1 істеген. Келтірілген себебі: ''$2''.\n\n* Бұғаттаудың басталғаны: $8\n* Бұғаттаудың бітетіні: $6\n* Бұғаттау нысанасы: $7\n\nОсы бұғаттауды талқылау үшін $1, не өзге [[{{MediaWiki:Grouppage-sysop}}|әкімшімен]] қатынасуыңызға болады.\n[[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[[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[[Special:Preferences|Тіркелгі бапталымдары]]ңызда жарамды е-пошта мекенжайын көрсеткен болсаңыз және де оны пайдаланудан бұғатталмаған жағдайда ғана «Қатысушыға хат жазу» қызметін қолдана аласыз.\nАғымдық IP мекенжайыңыз: $3, бұғатау нөмірі: $5.\nСұраным жасағанда осының екеуін де кірістіруіңізді сұраймыз.",
        "blockednoreason": "еш себебі келтірілмеген",
        "whitelistedittext": "Беттерді өңдеу үшін $1.",
-       "confirmedittext": "Беттерді өңдеу үшін алдын ала Е-пошта мекенжайыңызды құптауыңыз жөн.\nЕ-пошта мекенжайыңызды [[Special:Preferences|қатысушы бапталымдарыңыз]] арқылы қойыңыз да жарамдылығын тексеріп шығыңыз.",
-       "nosuchsectiontitle": "Бұл бөлімді табу мүмкін емес",
-       "nosuchsectiontext": "СÑ\96з Ð±Ò±Ñ\80Ñ\8bн Ð±Ð¾Ð»Ð¼Ð°Ò\93ан Ð±Ó©Ð»Ñ\96мдÑ\96 Ó©Ð·Ð³ÐµÑ\80Ñ\82пекÑ\88Ñ\96Ñ\81Ñ\96з.\nÐ\9cүмкÑ\96н Ð±Ò±Ð» Ð±ÐµÑ\82Ñ\82Ñ\96 Ò\9bаÑ\80ап Ð¶Ð°Ñ\82Ò\9bанÑ\8bÒ£Ñ\8bзда Ð¾Ð» Ð±Ó©Ð»Ñ\96м Ð¶Ð¾Ð¹Ñ\8bлÒ\93ан Ð½ÐµÐ¼ÐµÑ\81е Ð±Ð°Ñ\81Ò\9bа Ð¾Ñ\80Ñ\8bнÒ\93а ÐºÓ©Ñ\88Ñ\96Ñ\80Ñ\96лген.",
-       "loginreqtitle": "Ð\9aÑ\96Ñ\80Ñ\83Ñ\96Ò£Ñ\96з ÐºÐµÑ\80ек",
+       "confirmedittext": "Беттерді өңдеу алдында е-пошта мекенжайыңызды құптауыңыз керек.\nЕ-пошта мекенжайыңызды [[Special:Preferences|қатысушы бапталымдарыңыз]] арқылы қойыңыз да жарамдылығын тексеріп шығыңыз.",
+       "nosuchsectiontitle": "Бөлімді табу мүмкін емес",
+       "nosuchsectiontext": "СÑ\96з Ð¶Ð¾Ò\9b Ð±Ó©Ð»Ñ\96мдÑ\96 Ó©Ò£Ð´ÐµÐ¿ ÐºÓ©Ñ\80мекÑ\88Ñ\96Ñ\81Ñ\96з.\nÐ\9cүмкÑ\96н Ð±ÐµÑ\82Ñ\82Ñ\96 Ò\9bаÑ\80ап Ð¶Ð°Ñ\82Ò\9bанÑ\8bÒ£Ñ\8bзда Ð¾Ð½Ñ\8b Ð¶Ð¾Ð¹Ò\93ан Ð½ÐµÐ¼ÐµÑ\81е Ð±Ð°Ñ\81Ò\9bа Ð¾Ñ\80Ñ\8bнÒ\93а ÐºÓ©Ñ\88Ñ\96Ñ\80ген.",
+       "loginreqtitle": "Ð\96үйеге ÐºÑ\96Ñ\80Ñ\83дÑ\96 Ò\9bажеÑ\82 ÐµÑ\82едÑ\96",
        "loginreqlink": "кіріңіз",
        "loginreqpagetext": "Басқа беттерді көру үшін $1.",
-       "accmailtitle": "Құпия сөз жөнелтілді.",
-       "accmailtext": "$2 дегенге [[User talk:$1|$1]] үшін құпия сөзі жөнелтілді.\nБұл жаңа қатысушы үшін құпия сөз <em> [[Special:ChangePassword|құпия сөзді өзгерту]]</em>  бетінде кіру үстінде өзгертілген.",
+       "accmailtitle": "Құпия сөз жіберілді.",
+       "accmailtext": "$2 дегенге [[User talk:$1|$1]] үшін құпия сөзі жөнелтілді. Оны <em>[[Special:ChangePassword|құпия сөзді өзгерту]]</em> бетінде жүйеге кірген кезде өзгеруге болады.",
        "newarticle": "(Жаңа)",
-       "newarticletext": "Сілтемеге еріп әлі басталмаған бетке келіпсіз.\nБетті бастау үшін, төменгі терезеде мәтініңізді теріңіз (көбірек ақпарат үшін [$1 анықтама бетін] қараңыз).\nЕгер жаңылғаннан осында келген болсаңыз, браузердің «артқа» деген батырмасын басыңыз.",
-       "anontalkpagetext": "----''Бұл тіркелгісіз (немесе тіркелгісін қолданбаған) қатысушы талқылау беті. Осы қатысушыны біз тек сандық IP мекенжайымен теңдестіреміз.\nОсындай IP мекенжай бірнеше қатысушыға ортақтастырылған болуы мүмкін.\nЕгер сіз тіркелгісіз қатысушы болсаңыз және сізге қатыссыз мәндемелер жіберілгенін сезсеңіз, басқа тіркелгісіз қатысушылармен араластырмауы үшін [[{{#special:Userlogin}}|тіркеліңіз не кіріңіз]].''",
+       "newarticletext": "Сілтеме бойынша әлі басталмаған бетке келіпсіз.\nБетті бастау үшін төменгі терезеде мәтінді теріңіз (көбірек ақпарат үшін [$1 анықтама бетін] қараңыз).\nЕгер жаңылғаннан осында келген болсаңыз браузеріңіздің <strong>артқа</strong> деген батырмасын басыңыз.",
+       "anontalkpagetext": "----\n<em>Бұл тіркелгісіз анонимді (немесе тіркелгісін қолданбаған) қатысушының талқылау беті.</em> \nСондықтан біз оны сандық IP мекенжайымен қолдануға тиістіміз.\nОсындай IP мекенжайды бірнеше пайдаланушы ортақтаса алады.\nЕгер сіз анонимді қатысушы болсаңыз және сізге қатыссыз хабарлама жіберілгенін сезсеңіз басқа анонимді қатысушылармен алдағы уақыттарда шатастырмау үшін [[Special:UserLogin/signup|тіркеліңіз]] не [[Special:UserLogin|кіріңіз]].",
        "noarticletext": "Қазіргі уақытта бұл бетте еш мәтін жоқ.\n* Басқа беттерден [[Special:Search/{{PAGENAME}}|бұл бет атауын іздеу]],\n* <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Журналдардан бұл бетке қатысты сәйкес жазбаларды табу]</span>,\n* <span class=\"plainlinks\">'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} Бұл бетті жаңадан бастау]'''</span>.",
-       "noarticletext-nopermission": "Ағымда бұл бетте еш мәтін жоқ.\nСіз [[Special:Search/{{PAGENAME}}|бұл бет атауын]] басқа беттерден іздей аласыз, немесе <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналдардан бұл бетке қатысты сәйкес жазбаларды таба аласыз]</span>. Ал бұл бетті жаңадан бастауға сізде рұқсат жоқ.",
-       "userpage-userdoesnotexist": "«<nowiki>$1</nowiki>» қатысушы тіркелгісі жазып алынбаған. Бұл бетті бастау/өңдеу талабыңызды тексеріп шығыңыз.",
+       "noarticletext-nopermission": "Қазіргі уақытта бұл бетте мәтін жоқ.\nСіз бұл бет атауын басқа беттерден [[Special:Search/{{PAGENAME}}|іздей аласыз]], немесе <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} қатысты журналдардан іздей аласыз]</span>. Ал бұл бетті жаңадан бастауға сізде рұқсат жоқ.",
+       "missing-revision": "#$1 нұсқалы «{{FULLPAGENAME}}» деп аталатын бет жоқ",
+       "userpage-userdoesnotexist": "«$1» қатысушы тіркелгісі жазылып алынбаған. \nБұл бетті бастау/өңдеу қалауыңызды тексеріп шығыңыз.",
        "userpage-userdoesnotexist-view": "«$1» қатысушы есімі тіркелмеген.",
-       "blocked-notice-logextract": "Бұл қатысушы қазіргі уақытта  бұғатталған.\nТөменде бұғаттау журналындағы соңғы жазбалар көрсетілген.",
+       "blocked-notice-logextract": "Бұл қатысушы қазіргі уақытта  бұғатталған.\nТөменде бұғаттау журналындағы соңғы жазбасы көрсетілген:",
        "clearyourcache": "<strong>Ескерту:</strong> Сақтағаннан кейін өзгерістерді көру үшін броузеріңіздің бүркемесін (кэшін) тазарту керек болуы мүмкін. \n* <strong>Firefox / Safari:</strong> <em>Қайта жүктеуді</em> нұқығанда <em>Shift</em> басып тұрыңыз немесе <em>Ctrl-F5</em> не <em>Ctrl-Shift-R</em> екеуінің біреуін басыңыз (Mac — <em>⌘-R</em>) \n* <strong>Google Chrome:</strong>  <em>Ctrl-Shift-R</em> басыңыз (Mac — <em>⌘-Shift-R</em>)\n* <strong>Internet Explorer:</strong> <em>Жаңарту</em> батырмасын нұқығанда <em>Ctrl</em> басып тұрыңыз немесе <em>Ctrl-F5</em> басыңыз;  не <em>F5</em> басыңыз \n* <strong>Opera:</strong> <em>Құралдар → Бапталымдар</em> дегеннен бүркемесін тазарту керек.",
-       "usercssyoucanpreview": "'''Кеңес:''' Жаңа CSS файлын сақтау алдында «Қарап шығу» батырмасын қолданып сынақтаңыз.",
-       "userjsyoucanpreview": "<strong>Ð\90Ò\9bÑ\8bл-кеңеÑ\81:</strong> Ð\96аңа JavaScript Ñ\84айлÑ\8bÒ£Ñ\8bздÑ\8b Ñ\81аÒ\9bÑ\82аÑ\83 Ð°Ð»Ð´Ñ\8bнда \"{{int:showpreview}}\" батырмасын қолданып сынақтаңыз.",
+       "usercssyoucanpreview": "<strong>Кеңес:</strong> Жаңа CSS файлыңызды сақтау алдында «{{int:showpreview}}» батырмасын қолданып сынақтаңыз.",
+       "userjsyoucanpreview": "<strong>Ð\9aеңеÑ\81:</strong> Ð\96аңа JavaScript Ñ\84айлÑ\8bÒ£Ñ\8bздÑ\8b Ñ\81аÒ\9bÑ\82аÑ\83 Ð°Ð»Ð´Ñ\8bнда Â«{{int:showpreview}}» батырмасын қолданып сынақтаңыз.",
        "usercsspreview": "</strong>Бұл тек қатысушы CSS файлыңызды қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!</strong>",
-       "userjspreview": "'''Мынау JavaScript қатысушы бағдарламасын тексеру/қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!'''",
-       "sitecsspreview": "'''Мынау CSS қатысушы бағдарламасын тексеру/қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!'''",
-       "sitejspreview": "'''Мынау JavaScript кодын тексеру/қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!'''",
-       "userinvalidcssjstitle": "'''Ескерту:''' Осы арада «$1» деген еш мәнер жоқ.\nҚатысушының .css және .js файл атауы кіші әріпппен жазылу тиісті екенін ұмытпаңыз, мысалға {{ns:user}}:Foo/vector.css дегенді {{ns:user}}:Foo/Vector.css дегенмен салыстырып қараңыз.",
+       "userjspreview": "<strong>Мынау JavaScript қатысушы бағдарламасын тынау/қарап шығу екенін ұмытпаңыз, ол әлі сақталған жоқ!</strong>",
+       "sitecsspreview": "<strong>Мынау тек бұл CSS файлын қарап шығуыңыз екенін ұмытпаңыз, ол әлі сақталған жоқ!</strong>",
+       "sitejspreview": "<strong>Мынау тек бұл JavaScript кодын алдын-ала қарап алу екенін ұмытпаңыз, ол әлі сақталған жоқ!</strong>",
+       "userinvalidcssjstitle": "</strong>Ескерту:</strong> Осы арада «$1» деген еш мәнер жоқ.\nҚалыпты .css және .js беттерінің атауына кіші әріп қолданыңыз, мысалы {{ns:user}}:Foo/vector.css дегенді {{ns:user}}:Foo/Vector.css дегенмен салыстырып қараңыз.",
        "updated": "(Жаңартылған)",
-       "note": "'''Ð\90Ò£Ò\93аÑ\80Ñ\82па:'''",
-       "previewnote": "Бұл тек '''қарап шығу''' екенін ұмытпаңыз, сіздің өзгертулеріңіз әлі сақталған жоқ!",
+       "note": "'''Ð\95Ñ\81кеÑ\80Ñ\82Ñ\83:'''",
+       "previewnote": "</strong>Бұл тек қарап шығу екенін ұмытпаңыз.</strong> \nӨзгертулеріңіз әлі сақталған жоқ!",
        "continue-editing": "Өңдеу аумағына өту",
        "previewconflict": "Бұл қарап шығу беті жоғарғы кірістіру орнындағы мәтінді қамтиды да және сақталғандағы өңді көрсетпек.",
-       "session_fail_preview": "'''Ғафу етіңіз! Сессия деректері жоғалуы салдарынан өңдемеңізді бітіре алмаймыз.\nҚайта байқап көріңіз. Егер бұл әлі істелмесе, шығуды және қайта кіруді байқап көріңіз.'''",
-       "session_fail_preview_html": "<strong>Кешіріңіз! Сессия деректері жоғалуы салдарынан өңдемеңізді бітіре алмаймыз.</strong>\n\n<em>{{SITENAME}} жобасында қам HTML қосылған, JavaScript шабуылдардан қорғану үшін алдын ала қарап шығу жасырылған.</em>\n\n<strong>Егер бұл өңдеме адал талап болса, қайта байқап көріңіз.</strong> Егер бұл әлі істемесе, [[Special:UserLogout|шығуды]] және қайта кіруді байқап көріңіз.'''",
-       "token_suffix_mismatch": "'''Өңдемеңіз тайдырылды, себебі тұтынғышыңыз өңдеме деректер бумасындағы тыныс белгілерін бүлдіртті.\nБет мәтіні бүлінбеу үшін өңдемеңіз тайдырылады.\nБұл кей уақытта қатесі толған веб-негізінде тіркелуі жоқ прокси-серверді пайдаланған болуы мүмкін.'''",
+       "session_fail_preview": "<strong>Кешіріңіз! Сессия деректері жоғалуы салдарынан өңдемеңізді бітіре алмаймыз.</strong>\nҚайта байқап көріңіз. \nЕгер бұл әлі істелмесе [[Special:UserLogout|шығуды]] және қайта кіруді байқап көріңіз.",
+       "session_fail_preview_html": "<strong>Кешіріңіз! Сессия деректері жоғалуы салдарынан өңдемеңізді бітіре алмаймыз.</strong>\n\n<em>Сондықтан {{SITENAME}} жобасында қам HTML қосылған, JavaScript шабуылдардан қорғану үшін алдын ала қарап шығу жасырылған.</em>\n\n<strong>Егер бұл өңдеме адал ниетті әрекет болса қайта байқап көріңіз.</strong> \nЕгер бұл әлі істемесе [[Special:UserLogout|шығуды]] және қайта кіруді байқап көріңіз.",
+       "token_suffix_mismatch": "<strong>Өңдемеңіз тайдырылды, себебі тұтынғышыңыз өңдеме деректер бумасындағы тыныс белгілерін бүлдіртті.\nБет мәтіні бүлінбеу үшін өңдемеңіз тайдырылады.</strong>\nБұл кей уақытта қатесі толған веб-негізінде тіркелуі жоқ прокси-серверді пайдаланған болуы мүмкін.",
        "editing": "Өңделуде: $1",
        "creating": "Жаңадан бастау: $1",
        "editingsection": "Өңделуде: $1 (бөлімі)",
        "editingcomment": "Өңделуде: $1 (жаңа бөлім)",
        "editconflict": "Өңдемелер қақтығысы: $1",
-       "explainconflict": "Ð\9eÑ\81Ñ\8b Ð±ÐµÑ\82Ñ\82Ñ\96 Ñ\81Ñ\96з Ó©Ò£Ð´ÐµÐ¹ Ð±Ð°Ñ\81Ñ\82аÒ\93анда Ð±Ð°Ñ\81Ò\9bа Ð±Ñ\96Ñ\80еÑ\83 Ð±ÐµÑ\82Ñ\82Ñ\96 Ó©Ð·Ð³ÐµÑ\80Ñ\82кен.\nÐ\96оÒ\93аÑ\80Ò\93Ñ\8b ÐºÑ\96Ñ\80Ñ\96Ñ\81Ñ\82Ñ\96Ñ\80Ñ\83 Ð¾Ñ\80нÑ\8bнда Ð±ÐµÑ\82Ñ\82Ñ\96Ò£ Ð°Ò\93Ñ\8bмдÑ\8bÒ\9b Ð¼Ó\99Ñ\82Ñ\96нÑ\96 Ð±Ð°Ñ\80.\nТөменгÑ\96 ÐºÑ\96Ñ\80Ñ\96Ñ\81Ñ\82Ñ\96Ñ\80Ñ\83 Ð¾Ñ\80нÑ\8bнда Ñ\81Ñ\96з Ó©Ð·Ð³ÐµÑ\80Ñ\82кен Ð¼Ó\99Ñ\82Ñ\96нÑ\96 ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\96ледÑ\96.\nӨзгеÑ\80Ñ\82Ñ\83Ñ\96Ò£Ñ\96здÑ\96 Ð°Ò\93Ñ\8bмдÑ\8bÒ\9b Ð¼Ó\99Ñ\82Ñ\96нге Ò¯Ñ\81Ñ\82еÑ\83Ñ\96Ò£Ñ\96з Ð¶Ó©Ð½.\n\"{{int:savearticle}}\" Ð±Ð°Ñ\82Ñ\8bÑ\80маÑ\81Ñ\8bн Ð±Ð°Ñ\81Ò\9bанда '''Ñ\82ек''' Ð¶Ð¾Ò\93аÑ\80Ò\93Ñ\8b ÐºÑ\96Ñ\80Ñ\96Ñ\81Ñ\82Ñ\96Ñ\80Ñ\83 Ð¾Ñ\80нÑ\8bндаÒ\93Ñ\8b Ð¼Ó\99Ñ\82Ñ\96н сақталады.",
+       "explainconflict": "Ð\9eÑ\81Ñ\8b Ð±ÐµÑ\82Ñ\82Ñ\96 Ñ\81Ñ\96з Ó©Ò£Ð´ÐµÐ¹ Ð±Ð°Ñ\81Ñ\82аÒ\93анда Ð±Ð°Ñ\81Ò\9bа Ð±Ñ\96Ñ\80еÑ\83 Ð±ÐµÑ\82Ñ\82Ñ\96 Ó©Ð·Ð³ÐµÑ\80Ñ\82кен.\nÐ\96оÒ\93аÑ\80Ò\93Ñ\8b Ð¼Ó\99Ñ\82Ñ\96н Ð°Ñ\83маÒ\93Ñ\8bнда Ò\9bазÑ\96Ñ\80гÑ\96 Ñ\83аÒ\9bÑ\8bÑ\82Ñ\82а Ð±Ð°Ñ\80 Ð±ÐµÑ\82 Ð¼Ó\99Ñ\82Ñ\96нÑ\96нен Ñ\82Ò±Ñ\80адÑ\8b.\nТөменгÑ\96 Ð¼Ó\99Ñ\82Ñ\96н Ð°Ñ\83маÒ\93Ñ\8bнда Ñ\81Ñ\96здÑ\96Ò£ Ó©Ð·Ð³ÐµÑ\80Ñ\82Ñ\83леÑ\80Ñ\96Ò£Ñ\96з ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\96ледÑ\96.\nӨзгеÑ\80Ñ\82Ñ\83Ñ\96Ò£Ñ\96здÑ\96 Ð±Ð°Ñ\80 Ð¼Ó\99Ñ\82Ñ\96нге Ð±Ñ\96Ñ\80Ñ\96кÑ\82Ñ\96Ñ\80Ñ\83ге Ñ\82Ñ\83Ñ\80а ÐºÐµÐ»ÐµÐ´Ñ\96.\n«{{int:savearticle}}» Ð±Ð°Ñ\82Ñ\8bÑ\80маÑ\81Ñ\8bн Ð±Ð°Ñ\81Ò\9bанда </strong>Ñ\82ек</strong> Ð¶Ð¾Ò\93аÑ\80Ò\93Ñ\8b Ð¼Ó\99Ñ\82Ñ\96н Ð°Ñ\83маÒ\93Ñ\8b сақталады.",
        "yourtext": "Мәтініңіз",
        "storedversion": "Сақталған нұсқасы",
-       "nonunicodebrowser": "'''ЕСКЕРТУ: Шолғышыңыз Unicode белгілеуіне үйлесімді емес, сондықтан латын емес әріптері бар беттерді өңдеу зіл болу мүмкін.\nЖұмыс істеуге ықтималдық беру үшін, төмендегі кірістіру орнында ASCII емес таңбалар оналтылық кодымен көрсетіледі'''.",
-       "editingold": "'''ЕСКЕТУ: Осы беттің ертерек түзетуін өңдеп жатырсыз.'''\nБұны сақтасаңыз, осы түзетуден кейінгі барлық өзгерістер жойылады.",
-       "yourdiff": "Айырмалар",
+       "nonunicodebrowser": "<strong>Ескерту: Шолғышыңыз Unicode белгілеуіне үйлесімді емес</strong>\nЖұмыс істеуге ықтималдық беру үшін, төмендегі кірістіру орнында ASCII емес таңбалар оналтылық кодымен көрсетіледі.",
+       "editingold": "<strong>Ескерту: Осы беттің ертерек түзетуін өңдеп жатырсыз.</strong>\nБұны сақтасаңыз осы түзетуден кейінгі барлық өзгерістер жоғалады.",
+       "yourdiff": "Айырмашылықтар",
        "copyrightwarning": "Аңғартпа: {{SITENAME}} жобасына берілген барлық үлестер $2 (көбірек ақпарат үшін: $1) құжатына сай деп саналады.\nЕгер жазуыңыздың еркін өңделуін және ақысыз көпшілікке таратуын қаламасаңыз, мында жарияламауыңыз жөн.<br />\nТағы да, бұл мағлұмат өзіңіз жазғаныңызға, не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз.\n'''АВТОРЛЫҚ ҚҰҚЫҚПЕН ҚОРҒАУҒАН МАҒЛҰМАТТЫ РҰҚСАТСЫЗ ЖАРИЯЛАМАҢЫЗ!'''",
        "copyrightwarning2": "Аңғартпа: {{SITENAME}} жобасына берілген барлық үлестерді басқа үлескерлер өңдеуге, өзгертуге, не аластауға мүмкін.\nЕгер жазуыңыздың еркін өңделуін қаламасаңыз, мында жарияламауыңыз жөн.<br />\nТағы да, бұл мағлұмат өзіңіз жазғаныңызға, не қоғам қазынасынан немесе сондай ашық қорлардан көшірілгеніне бізге уәде бересіз (көбірек ақпарат үшін $1 қужатын қараңыз).\n'''АВТОРЛЫҚ ҚҰҚЫҚПЕН ҚОРҒАУҒАН МАҒЛҰМАТТЫ РҰҚСАТСЫЗ ЖАРИЯЛАМАҢЫЗ!'''",
-       "longpageerror": "'''ҚАТЕЛІК: Сақтамақ мәтініңіздін мөлшері {{PLURAL:$1|килобайт|$1 килобайт}}, ең көбі {{PLURAL:$2|килобайт|$2 килобайт}} рұқсат етілген мөлшерінен асқан.\nБұл сақталмайды.'''",
+       "longpageerror": "<strong>ҚАТЕЛІК: Сақтамақшы болған мәтініңіздің көлемі {{PLURAL:$1|килобайт|$1 килобайт}}, ең көбі {{PLURAL:$2|килобайт|$2 килобайт}} рұқсат етілген көлемінен асқан.</strong>\nБұл сақталмайды.",
        "readonlywarning": "'''ЕСКЕТУ: Дерекқор баптау үшін құлыпталған, сондықтан дәл қазір өңдемеңізді сақтай алмайсыз.\nКейін қолдану үшін мәтінді қойып алып және қойып, мәтін файлына сақтауңызға болады.''' \nӘкімшінің құлыптау себебі келесідей: $1",
-       "protectedpagewarning": "'''Ескерту: Бұл бет өңдеуден қорғалған. Тек әкімші құқықтары бар қатысушылар ғана өңдей алады.'''\nТөменде бет журналының соңғы жазбасы көрсетілген:",
-       "semiprotectedpagewarning": "'''Аңғартпа:''' Бет жартылай қорғалған, сондықтан осыны тек тіркелген қатысушылар өңдей алады.\nТөменде бет журналының соңғы жазбасы көрсетілген:",
+       "protectedpagewarning": "<strong>Ескерту: Бұл бет өңдеуден қорғалған. Тек әкімші құқықтары бар қатысушылар ғана өңдей алады.</strong>\nТөменде бет журналының соңғы жазбасы көрсетілген:",
+       "semiprotectedpagewarning": "<strong>Ескерту:</strong> Бет жартылай қорғалған, сондықтан осыны тек тіркелген қатысушылар өңдей алады.\nТөменде бет журналының соңғы жазбасы көрсетілген:",
        "cascadeprotectedwarning": "<strong>Ескерту:</strong>  Бұл бет қорғалған, енді тек әкімші құқықтары бар қатысушылар ғана бұны өңдей алады, себебі бұл келесі «баулы қорғауы» бар {{PLURAL:$1|бетіне|беттеріне}} кірістілген бет:",
        "titleprotectedwarning": "'''Ескерту: Бұл бет атауы бастаудан қорғалған, сондықтан [[Special:ListGroupRights|арнайы құқықтары]] бар қатысушылар бұндай атаумен бетті бастай алады.'''\nТөменде бет журналының соңғы жазбасы көрсетілген:",
        "templatesused": "Бұл бетте қолданылған {{PLURAL:$1|үлгі|үлгілер}}:",
        "expensive-parserfunction-category": "Шығыс алатын құрылым талдатқыш жетелерінің тым көп шақырымы бар беттер",
        "post-expand-template-inclusion-warning": "Ескерту: Үлгі кірістіру өлшемі тым үлкен.\nКейбір үлгілер кірістірілмейді.",
        "post-expand-template-inclusion-category": "Үлгі кірістірілген беттер өлшемі асып кетті",
-       "post-expand-template-argument-warning": "Ескерту: Бұл бетте тым көп ұлғайтылған мөлшері болған ең кемінде бір үлгі дәлелі бар.\nБұның дәлелдерін қалдырып кеткен.",
+       "post-expand-template-argument-warning": "<strong>Ескерту:</strong> Бұл бетте тым көп ұлғайтылған өлшемі болған ең кемінде бір үлгі дәлелі бар.\nБұның дәлелдерін қалдырып кеткен.",
        "post-expand-template-argument-category": "Үлгі дәлелдерін қалдырып кеткен беттер",
        "undo-success": "Бұл өңдеме жоққа шығарылуы мүмкін. Талабыңызды құптап алдын ала төмендегі салыстыруды тексеріп шығыңыз да, өңдемені жоққа шығаруын бітіру үшін төмендегі өзгерістерді сақтаңыз.",
        "undo-failure": "Бұл өңдеме жоққа шығарылмайды, себебі арада қақтығысты өңдемелер бар.",
        "searchresults": "Іздеу нәтижелері",
        "searchresults-title": "\"$1\" сұранымына табылған нәтижелер",
        "toomanymatches": "Тым көп сәйкес қайтарылды, өзге сұранымды байқап көріңіз",
-       "titlematches": "Бет тақырыбын аты сәйкес келеді",
+       "titlematches": "Бет атауы сәйкес келеді",
        "textmatches": "Бет мәтіні сәйкес келеді",
        "notextmatches": "Еш бет мәтіні сәйкес емес",
        "prevn": "алдыңғы {{PLURAL:$1|$1}}",
        "shown-title": "Осы бетте {{PLURAL:$1|жазба}} көрсету.",
        "viewprevnext": "Көрсетілуі: ($1 {{int:pipe-separator}} $2) ($3) жазба",
        "searchmenu-exists": "'''Бұл жобада «[[:$1]]» деген бет бар.'''",
-       "searchmenu-new": "<strong>«[[:$1]]» Ð¾Ñ\81Ñ\8bндай Ð°Ñ\82пен Ð±Ò±Ð» Ñ\83икиде Ð±ÐµÑ\82Ñ\82Ñ\96 Ð±Ð°Ñ\81Ñ\82аÑ\83!</strong> {{PLURAL:$2|0=|ТаÒ\93Ñ\8b Ò\9bаÑ\80аңÑ\8bз: Ñ\96здегенÑ\96Ò£Ñ\96з Ð±Ð¾Ð¹Ñ\8bнÑ\88а Ñ\82абÑ\8bлÒ\93ан Ð±ÐµÑ\82Ñ\82еÑ\80.|ТаÒ\93Ñ\8b Ò\9bаÑ\80аңÑ\8bз: Ñ\82абÑ\8bлÒ\93ан Ñ\96здеÑ\83 Ð½Ó\99Ñ\82ижелеÑ\80Ñ\96.}}",
+       "searchmenu-new": "<strong>«[[:$1]]» Ð¾Ñ\81Ñ\8bндай Ð°Ñ\82пен Ð±Ò±Ð» Ñ\83икиде Ð±ÐµÑ\82Ñ\82Ñ\96 Ð±Ð°Ñ\81Ñ\82аÑ\83!</strong> {{PLURAL:$2|0=|Ð\86здегенÑ\96Ò£Ñ\96з Ð±Ð¾Ð¹Ñ\8bнÑ\88а Ñ\82абÑ\8bлÒ\93ан Ð±ÐµÑ\82Ñ\82еÑ\80:|ТабÑ\8bлÒ\93ан Ñ\96здеÑ\83 Ð½Ó\99Ñ\82ижелеÑ\80Ñ\96:}}",
        "searchprofile-articles": "Негізгі беттер",
        "searchprofile-project": "Анықтама және жоба беттері",
        "searchprofile-images": "Мультимедиа",
        "enhancedrc-history": "Тарихы",
        "recentchanges": "Жуықтағы өзгерістер",
        "recentchanges-legend": "Жуықтағы өзгерістер баптаулары",
-       "recentchanges-summary": "Ð\91ұл Ð±ÐµÑ\82Ñ\82е Ð¾Ñ\81Ñ\8b Ñ\83икидегÑ\96 Ð±Ð¾Ð»Ò\93ан Ð¶Ñ\83Ñ\8bÒ\9bÑ\82аÒ\93Ñ\8b Ó©Ð·Ð³ÐµÑ\80Ñ\96Ñ\81Ñ\82еÑ\80 Ð±Ð°Ð¹Ò\9bаладÑ\8b.",
+       "recentchanges-summary": "Төменде {{SITENAME}} Ð±ÐµÑ\82Ñ\82еÑ\80Ñ\96ндегÑ\96 Ð¶Ñ\83Ñ\8bÒ\9bÑ\82аÒ\93Ñ\8b Ó©Ð·Ð³ÐµÑ\80Ñ\96Ñ\81Ñ\82еÑ\80 Ñ\85Ñ\80онологиÑ\8fлÑ\8bÒ\9b Ñ\80еÑ\82пен ÐºÓ©Ñ\80Ñ\81еÑ\82Ñ\96ледÑ\96.",
        "recentchanges-noresult": "Бұл талап бойынша көрсетілген уақыттан бері өзгерістер болған жоқ.",
        "recentchanges-feed-description": "Бұл арнаменен уикидегі ең соңғы өзгерістер қадағаланады.",
        "recentchanges-label-newpage": "Жаңа беттер",
        "recentchanges-label-minor": "Бұл шағын өңдеме",
        "recentchanges-label-bot": "Бұл өңдемені бот жасады.",
        "recentchanges-label-unpatrolled": "Бұл өңдеме әлі тексеруден өтпеді.",
-       "recentchanges-label-plusminus": "Байт бойынша беттің өзгеріс мөлшері",
+       "recentchanges-label-plusminus": "Байт бойынша беттің өзгеріс өлшемі",
        "recentchanges-legend-heading": "'''Шартты белгілер:'''",
        "recentchanges-legend-newpage": "(қ: [[Special:NewPages|бөлек бетте]])",
-       "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "Төменде <strong>$2</strong> кезінен бергі (<strong>$1</strong> өңдемеге дейін) өзгерістер көрсетіледі.",
        "rclistfrom": "$2, $3 кезінен бергі жаңа өзгерістерді көрсет.",
        "rcshowhideminor": "Шағын өңдемелерді $1",
        "illegal-filename": "Файл атауы рұқсат етілген.",
        "overwrite": "Бар файлдың үстінен жазу рұқсат етілмейді",
        "unknown-error": "Белгісіз қателік орын алды.",
-       "large-file": "ФайлдÑ\8bÒ£ $1 Ð¼Ó©Ð»Ñ\88еÑ\80Ñ\96нен Ð°Ñ\81паÑ\83Ñ\8bна ÐºÐµÐ¿Ñ\96лдеме Ð±ÐµÑ\80Ñ\96ледÑ\96;\nбұл Ñ\84айл Ð¼Ó©Ð»Ñ\88еÑ\80і — $2.",
-       "largefileserver": "Осы файлдың мөлшері сервердің қалауынан асып кеткен.",
+       "large-file": "Ð\91ұл Ñ\84айлдÑ\8bÒ£ $1 Ó©Ð»Ñ\88емÑ\96нен Ð°Ñ\81паÑ\83Ñ\8b Ò±Ñ\81Ñ\8bнÑ\8bладÑ\8b;\nбұл Ñ\84айл Ó©Ð»Ñ\88емі — $2.",
+       "largefileserver": "Осы файлдың өлшемі сервердің қалауынан асып кеткен.",
        "emptyfile": "Қотарып берілген файлыңыз бос сияқты. Файл атауы қате жазылған мүмкін.\nБұл файлды қотарып беруі нақты талабыңыз екенін тексеріп шығыңыз.",
        "windows-nonascii-filename": "Бұл уики файл атауларында арнайы таңбаларды қолдамайды.",
        "fileexists": "Осылай аталған файл әлдеқашан бар, егер бұны өзгертуге сеніміңіз жоқ болса <strong>[[:$1]]</strong> дегенді тексеріп шығыңыз.\n[[$1|thumb]]",
        "filepageexists": "Бұл файлдың сипаттама беті әлдеқашан <strong>[[:$1]]</strong> дегенде жасалған, бірақ қазіргі уақытта осылай аталған еш файл жоқ.\nЕнгізген түйіндемеңіз сипаттамасы бетінде көрсетілмейді.\nТүйіндемеңіз осы арада көрсетілу үшін бұны қолмен өңдеуіңіз керек.\n[[$1|thumb]]",
        "fileexists-extension": "Ұқсас атауы бар файл табылды: [[$2|thumb]]\n* Қотарып берілетін файл атауы: <strong>[[:$1]]</strong>\n* Бар болған файл атауы: <strong>[[:$2]]</strong>\nӨзге атауды таңдаңыз.",
-       "fileexists-thumbnail-yes": "Осы файл — мөлшері кішірітілген көшірмесі (нобай) сияқты. [[$1|thumb]]\nӨтініш, <strong>[[:$1]]</strong> деген файлды тексеріңіз.\nЕгер көрсетілген файл дәл сіз жүктейін деп жатқан файл болса, онда оның кішірейтілген көшірмесін қайта жүктеудің қажеті жоқ.",
-       "file-thumbnail-no": "Файл Ð°Ñ\82аÑ\83Ñ\8b <strong>$1</strong> Ð´ÐµÐ³ÐµÐ½Ð¼ÐµÐ½ Ð±Ð°Ñ\81Ñ\82аладÑ\8b.\nÐ\91ұл â\80\94 Ð¼Ó©Ð»Ñ\88еÑ\80Ñ\96 ÐºÑ\96Ñ\88Ñ\96Ñ\80Ñ\96Ñ\82Ñ\96лген Ñ\81Ñ\83Ñ\80еÑ\82 <em>(нобай)</em> Ñ\81иÑ\8fÒ\9bÑ\82Ñ\8b.\nÐ\95геÑ\80 бұл суреттің толық ажыратылымды нұсқасы болса оны жүктеңіз, әйтпесе файл атауын өзгертіңіз.",
+       "fileexists-thumbnail-yes": "Осы файл көлемі кішірейтілген көшірмесі <em>(нобай)</em> сияқты. \n[[$1|thumb]]\nӨтініш, <strong>[[:$1]]</strong> деген файлды тексеріңіз.\nЕгер көрсетілген файл дәл сіз жүктейін деп жатқан файл болса, онда оның кішірейтілген көшірмесін қайта жүктеудің қажеті жоқ.",
+       "file-thumbnail-no": "Файл Ð°Ñ\82аÑ\83Ñ\8b <strong>$1</strong> Ð´ÐµÐ³ÐµÐ½Ð¼ÐµÐ½ Ð±Ð°Ñ\81Ñ\82аладÑ\8b.\nÐ\9eл Ó©Ð»Ñ\88емÑ\96 ÐºÑ\96Ñ\88Ñ\96Ñ\80ейÑ\82Ñ\96лген Ñ\81Ñ\83Ñ\80еÑ\82 <em>(нобай)</em> Ñ\81иÑ\8fÒ\9bÑ\82Ñ\8b.\nÐ\95геÑ\80 Ñ\81Ñ\96зде бұл суреттің толық ажыратылымды нұсқасы болса оны жүктеңіз, әйтпесе файл атауын өзгертіңіз.",
        "fileexists-forbidden": "Осылай аталған файл әлдеқашан бар және үстінен жазылмайды.\nЕгер сіз өзіңіздің файлыңызды жүктегіңіз келсе кері қайтыңыз да жаңа атау қолданыңыз. \n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Осылай аталған файл ортаққорда әлдеқашан бар.\nЕгер сіз файлыңызды жүктегіңіз келсе кері қайтыңыз және жаңа атау қолданыңыз. \n[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Бұл файл келесі {{PLURAL:$1|файлдың|файлдарының}} телнұсқасы:",
        "listgrouprights-group": "Топ",
        "listgrouprights-rights": "Құқықтары",
        "listgrouprights-helppage": "Help:Топ құқықтары",
-       "listgrouprights-members": "(мүше тізімі)",
+       "listgrouprights-members": "(мүшелер тізімі)",
        "listgrouprights-addgroup": "{{PLURAL:$2|топты|топтарды}} қосу: $1",
        "listgrouprights-removegroup": "{{PLURAL:$2|топты|топтарды}} алып тастау: $1",
        "listgrouprights-addgroup-all": "Барлық топтарды қосу",
        "changed": "өзгертті",
        "deletepage": "Бетті жою",
        "confirm": "Құптау",
-       "excontent": "болған мағлұматы: '$1'",
-       "excontentauthor": "болған мағлұматы (тек \"[[Special:Contributions/$2|$2]]\" үлесі): \"$1\"",
-       "exbeforeblank": "тазарту алдындағы болған мағлұматы: \"$1\"",
+       "excontent": "болған мағлұматы: $1",
+       "excontentauthor": "болған мағлұматы (тек «[[Special:Contributions/$2|$2]]» үлесі): $1",
+       "exbeforeblank": "тазарту алдындағы болған мағлұматы: $1",
        "delete-confirm": "«$1» дегенді жою",
        "delete-legend": "Жою",
        "historywarning": "'''Ескету:'' Жоюы көзделген бетте бет тарихында шамамен $1 {{PLURAL:$1|түзетілуі|түзетілулері}} бар:",
        "undelete-show-file-submit": "Иә",
        "namespace": "Есім кеңістігі:",
        "invert": "Таңдалғанды жасыру",
-       "tooltip-invert": "Бұл құсбелгі қойсаңыз таңдалған есім кеңістігіндегі беттердегі өзгерістерді жасырады (және қатысты есем кеңістігі тексерліеді)",
+       "tooltip-invert": "Бұл белгіні қойсаңыз таңдалған есім кеңістігіндегі беттердегі өзгерістерді жасырады (және қатысты есем кеңістігі тексеріледі)",
        "namespace_association": "Қатысты есім аясы",
-       "tooltip-namespace_association": "Бұл құсбелгі қойсаңыз кейде таңдалған есім кеңістігіне қатысты талқылау немесе бастауыш есім кеңістігіндегі өзгерістер қосылып көрсетіледі",
+       "tooltip-namespace_association": "Бұл белгіні қойсаңыз кейде таңдалған есім кеңістігіне қатысты талқылау немесе бастауыш есім кеңістігіндегі өзгерістер қосылып көрсетіледі",
        "blanknamespace": "Негізгі беттерден",
        "contributions": "{{GENDER:$1|Қатысушы}} үлестері",
        "contributions-title": "$1 есімді қатысушының үлесі",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] деген бұғатталған.<br />\nБұғаттарды шолып шығу үшін [[Special:BlockList|бұғаттау тізімін]] қараңыз.",
        "ipb-blockingself": "Сіз өзіңізді бұғаттамақшысыз. Бұны істегіңіз келгеніне сенімдісіз бе?",
        "ipb-edit-dropdown": "Бұғаттау себептерін өңдеу",
-       "ipb-unblock-addr": "$1 дегенді бұғаттамау",
+       "ipb-unblock-addr": "$1 дегенді бұғаттауынан босату",
        "ipb-unblock": "Қатысушы атын немесе IP мекенжайын бұғаттамау",
-       "ipb-blocklist": "Бар бұғаттауларды қарау",
+       "ipb-blocklist": "Бұғатталғандарды қарау",
        "ipb-blocklist-contribs": "$1 есімді қатысушының үлесі",
        "unblockip": "Қатысушыны бұғаттауынан босату",
        "unblockiptext": "Төмендегі форманы IP мекенжайымен не қатысушы есімімен алдын-ала бұғатталған қатысушыға жазу рұқсатын қалпына келтіріу үшін қолданыңыз.",
        "noautoblockblock": "өзбұғаттау өшірілген",
        "createaccountblock": "тіркелу бұғатталған",
        "emailblock": "е-пошта өшірілді",
-       "blocklist-nousertalk": "талқылау бетіңізді өңдемеңіз",
+       "blocklist-nousertalk": "өз талқылау бетін өңдей алмайтындай ету",
        "ipblocklist-empty": "Бұғаттау тізімі бос.",
        "ipblocklist-no-results": "Сұратылған IP мекенжай не қатысушы аты бұғатталған емес.",
        "blocklink": "бұғаттау",
        "blocklog-showsuppresslog": "Бұл қатысушы ұдайы жасырылып және бұғатталып отырған.\nДерек үшін төменде жасыру журналы берілген:",
        "blocklogentry": "[[$1]] дегенді $2 мерзімге бұғаттады $3",
        "blocklogtext": "Бұл қатысушыларды бұғаттау және бұғаттауынан босату әрекеттерінің журналы.\nӨздіктік бұғатталған IP мекенжайлар тізімделмеген.\nҚазіргі уақыттағы белсенді тиымдар мен бұғаттауларды [[Special:BlockList|бұғаттау тізімінен]] қараңыз.",
-       "unblocklogentry": "«$1» — бұғаттауын өшірді",
-       "block-log-flags-anononly": "тек тіркелгісіздер",
+       "unblocklogentry": "$1 бұғаттауынан босатты",
+       "block-log-flags-anononly": "тек аноним қатысушылар",
        "block-log-flags-nocreate": "тіркелу өшірілген",
-       "block-log-flags-noautoblock": "өзбұғаттау өшірілген",
-       "block-log-flags-noemail": "е-пошта бұғатталған",
-       "block-log-flags-nousertalk": "талқылау бетін өңдемеңіз",
-       "block-log-flags-hiddenname": "қатысушы есімі жасырылды",
+       "block-log-flags-noautoblock": "автобұғаттау өшірілген",
+       "block-log-flags-noemail": "е-пошта өшірілген",
+       "block-log-flags-nousertalk": "өз талқылау бетін өңдей алмайтындай ету",
+       "block-log-flags-angry-autoblock": "күшейтілген өздікті түрде бұғаттау қосылған",
+       "block-log-flags-hiddenname": "қатысушы есімі жасырылған",
        "range_block_disabled": "Ауқым бұғаттауларын жасау әкімшілік мүмкіндігі өшірілген.",
        "ipb_expiry_invalid": "Бітетін уақыты жарамсыз.",
        "ipb_expiry_temp": "Жасырылған қатысушы атын бұғаттауы мәңгі болуы жөн.",
        "databasenotlocked": "Дерекқор құлыпталған жоқ.",
        "move-page": "«$1» дегенді жылжыту",
        "move-page-legend": "Бетті жылжыту",
-       "movepagetext": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз.\nБеттің бұрыңғы атауы жаңа бетке айдағыш сілтеме ретінде қалады.\nҚаласаңыз, бұрыңғы атауды мегзейтін сілтемелердің автоматты түрде жаңартылуын таңдай аласыз. Бұны таңдамаған жағдайда, [[Special:DoubleRedirects|екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз.\nЖылжытудан кейін әр сілтеме өзіне тиісті бетке мегзейтініне жауапты боласыз.\n\nЕгер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту '''орындалмайды'''. Бұл шара әлдеқашан бар беттің қайта жазылуынан сақтайды. Алайда, егер бет —   бос бет, не өткен тарихы жоқ [[Special:ListRedirects|айдағыш бет]] болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрыңғы атауына қайтаруды мүмкін ету үшін жасалған.\n\n\n'''Ескерту!'''\nБұл көп қаралатын бетке тиісті өзгеріс болуы мүмкін;\nілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
+       "movepagetext": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз.\nБеттің бұрыңғы атауы жаңа бетке айдағыш сілтеме ретінде қалады.\nҚаласаңыз, бұрыңғы атауды мегзейтін сілтемелердің автоматты түрде жаңартылуын таңдай аласыз. Бұны таңдамаған жағдайда, [[Special:DoubleRedirects|екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз.\nЖылжытудан кейін әр сілтеме өзіне тиісті бетке мегзейтініне жауапты боласыз.\n\nЕгер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту <strong>орындалмайды</strong>. Бұл шара әлдеқашан бар беттің қайта жазылуынан сақтайды. Алайда, егер бет —   бос бет, не өткен тарихы жоқ [[Special:ListRedirects|айдағыш бет]] болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрыңғы атауына қайтаруды мүмкін ету үшін жасалған.\n\n\n</strong>Ескерту!</strong>\nБұл көп қаралатын бет үшін қатаң және күтілмеген өзгеріс болуы мүмкін;\nілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
        "movepagetext-noredirectfixer": "Бетті бүкіл тарихымен қоса жаңа атауға жылжытқалы жатырсыз.\nБеттің бұрыңғы атауы жаңа бетке айдағыш сілтеме ретінде қалады.\n[[Special:DoubleRedirects|Екі мәрте айдағыш]] не [[Special:BrokenRedirects|сынық айдағыш]] сілтемелер қалып қоймауына көз жеткізіңіз.\nЖылжытудан кейін әр сілтеме өзіне тиісті бетке мегзейтініне жауапты боласыз.\n\nЕгер жылжытайын деп жатқан жаңа атау басқа бетке әлдеқашан берілген болса, жылжыту '''орындалмайды'''. Бұл шара әлдеқашан бар беттің қайта жазылуынан сақтайды. Алайда, егер бет —   бос бет, не өткен тарихы жоқ [[Special:ListRedirects|айдағыш бет]] болса, жылжыту орындалады. Бұл жаңылыс жылжытылған бетті бұрыңғы атауына қайтаруды мүмкін ету үшін жасалған.\n\n\n'''Ескерту!'''\nБұл көп қаралатын бетке тиісті өзгеріс болуы мүмкін;\nілгері басудан бұрын әрекетіңіздің салдарын есепке алуыңызды сұраймыз.",
        "movepagetalktext": "Келесі жағдай орын алса, қатысты талқылау беті '''жылжытылмайды''':\n*жаңа атаумен аталатын беттің талқылау беті әлдеқашан бар болған кезде (бұл жағдайда талқылауын қолмен көшіруге болады, бірақ түйіндемесіне қай беттен көшірілгендігін міндетті түрде жазыңыз)\n*төмендегі қорапшадан құсбелгі алынып тасталғанда.\n\nАл мақаланың атауын өзгертем деп мағлұматын қолмен көшіруге болмайды, себебі беттің түзету тарихын өшіреді.",
        "movearticle": "Бетті жылжыту:",
        "moveuserpage-warning": "<strong>Ескерту:</strong> Сіз қатысушы бетін жылжытпақшысыз. Назар аударыңыз, қатысушы беті ғана жылжытылуы мүмкін және қатысушы аты <em>өзгертілмейді</em>.",
-       "movenologintext": "Бетті жылжыту үшін тіркелген болуыңыз және [[{{#special:UserLogin}}|кіруіңіз]] жөн.",
+       "movenologintext": "Бетті жылжыту үшін тіркелген қатысуышы болуыңыз және [[Special:UserLogin|кіруіңіз]] керек.",
        "movenotallowed": "{{SITENAME}} жобасында беттерді жылжытуға рұқсатыңыз жоқ.",
        "movenotallowedfile": "Файлдарды жылжытуға рұқсатыңыз жоқ.",
        "cant-move-user-page": "Қатысушы беттерін жылжытуға рұқсатыңыз жоқ (төменгі беттерінен басқа).",
        "move-watch": "Бұл бетті бақылау",
        "movepagebtn": "Бетті жылжыту",
        "pagemovedsub": "Жылжыту сәтті аяқталды",
-       "movepage-moved": "'''\"$1\" беті \"$2\" бетіне жылжытылды'''",
+       "movepage-moved": "<strong>«$1» беті «$2» бетіне жылжытылды</strong>",
        "movepage-moved-redirect": "Айдатқыш жасалды.",
        "articleexists": "Осылай аталған бет әлдақашан бар немесе таңдаған атауыңыз жарамды емес.\nБасқа атауды таңдаңыз.",
        "cantmove-titleprotected": "Бетті осы орынға жылжыта алмайсыз, себебі жаңа тақырып аты бастаудан қорғалған",
        "importsuccess": "Сырттан алу аяқталды!",
        "importnosources": "Уики-апару үшін сырттан алынатын еш қайнар көзі анықталмаған, және тарихын тікелей қотарып беруі өшірілген.",
        "importnofile": "Сырттан алынған файл жүктелген жоқ.",
-       "importuploaderrorsize": "СÑ\8bÑ\80Ñ\82Ñ\82ан Ð°Ð»Ñ\8bнÒ\93ан Ñ\84айлдÑ\8bÒ£ Ð¶Ò¯ÐºÑ\82елÑ\83Ñ\96 Ñ\81Ó\99Ñ\82Ñ\81Ñ\96з Ó©Ñ\82Ñ\82Ñ\96. Ð¤Ð°Ð¹Ð» Ð¼Ó©Ð»Ñ\88еÑ\80Ñ\96 Ñ\80Ò±Ò\9bÑ\81аÑ\82 ÐµÑ\82Ñ\96лгеннен Ð¼Ó©Ð»Ñ\88еÑ\80ден Ð°Ñ\81адÑ\8b.",
+       "importuploaderrorsize": "Ð\98мпоÑ\80Ñ\82Ñ\82алÒ\93ан Ñ\84айлдÑ\8bÒ£ Ð¶Ò¯ÐºÑ\82елÑ\83Ñ\96 Ñ\81Ó\99Ñ\82Ñ\81Ñ\96з Ð±Ð¾Ð»Ð´Ñ\8b. \nФайл Ñ\80Ò±Ò\9bÑ\81аÑ\82 ÐµÑ\82Ñ\96лгеннен Ð¶Ò¯ÐºÑ\82еÑ\83 Ó©Ð»Ñ\88емÑ\96нен Ò¯Ð»ÐºÐµÐ½Ñ\96Ñ\80ек.",
        "importuploaderrorpartial": "Сырттан алынған файлдың жүктелуі сәтсіз өтті. Осы файлдың тек бөліктері жүктелді.",
        "importuploaderrortemp": "Сырттан алынған файлдың жүктелуі сәтсіз өтті. Уақытша қалта табылмады.",
        "import-parse-failure": "Сырттан алынған XML файл құрылымын талдатқанда сәтсіздік болды",
        "nextdiff": "Келесі өңдеме →",
        "mediawarning": "'''Ескерту''': Бұл файл түрінде қаскүнемді коды бар болуы ықтимал; бұны жегіп жүйеңізге зиян келтіруіңіз мүмкін.",
        "imagemaxsize": "Суреттің өлшем шектеуі:<br />''(файл сипаттама беттері үшін)''",
-       "thumbsize": "Нобай мөлшері:",
+       "thumbsize": "Нобай өлшемі:",
        "widthheight": "$1 × $2",
        "widthheightpage": "$1 × $2, $3 бет",
-       "file-info": "Файл мөлшері: $1, MIME түрі: $2",
+       "file-info": "файл өлшемі: $1, MIME түрі: $2",
        "file-info-size": "$1 × $2 нүкте, файл өлшемі: $3, MIME түрі: $4",
        "file-info-size-pages": "$1 × $2 нүкте (пиксел), Файл өлшемі: $3, MIME түрі: $4, $5 {{PLURAL:$5|бет|бет}}",
        "file-nohires": "Жоғары кеңейтілімдегі нұсқалары жоқ.",
-       "svg-long-desc": "SVG файлы, кесімді $1 × $2 нүкте, файл мөлшері: $3",
+       "svg-long-desc": "SVG файлы, кесімді $1 × $2 (пиксел) нүкте, файл өлшемі: $3",
        "svg-long-desc-animated": "SVG қозғалысты файлы, кесімді $1 × $2 нүкте, файл өлшемі: $3",
        "svg-long-error": "жарамсыз SVG файлы: $1",
        "show-big-image": "Түпнұсқа файл",
        "confirmrecreate": "Бұл бетті өңдеуіңізді бастағанда [[User:$1|$1]] ([[User talk:$1|талқылауы]]) осы бетті жойды, келтірген себебі:\n: ''$2''\nОсы бетті қайта бастауын нақты тілегеніңізді құптаңыз.",
        "recreate": "Қайта бастау",
        "unit-pixel": " нүкте",
-       "confirm_purge_button": "Жарайды",
+       "confirm_purge_button": "OK",
        "confirm-purge-top": "Бұл беттін бүркемесін тазартасыз ба?",
-       "confirm-watch-button": "Жарайды",
+       "confirm-watch-button": "OK",
        "confirm-watch-top": "Бұл бетті бақылау тізіміңізге қосқыңыз келе ме?",
-       "confirm-unwatch-button": "Жарайды",
+       "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Бұл бетті бақылау тізіміңізден аластағыңыз келе ме?",
        "semicolon-separator": ";",
        "colon-separator": ":&#32;",
        "hebrew-calendar-m10-gen": "тымоздың",
        "hebrew-calendar-m11-gen": "абтың",
        "hebrew-calendar-m12-gen": "айлолдың",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|талқ]])",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|талқылауы]])",
        "unknown_extension_tag": "Белгісіз кеңейтпе белгісі \"$1\"",
        "version": "Нұсқа",
        "version-extensions": "Орнатылған кеңейтімдер",
        "expand_templates_input": "Кіріс мәтіні:",
        "expand_templates_output": "Нәтижесі",
        "expand_templates_xml_output": "XML шығаруы",
-       "expand_templates_ok": "Жарайды",
+       "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "Мәндемелерін аластатып?",
        "expand_templates_generate_xml": "XML өңдету бұтақтарын көрсет",
        "expand_templates_preview": "Қарап шығу"
index 230c5b3..0c158a6 100644 (file)
        "jumpto": "이동:",
        "jumptonavigation": "둘러보기",
        "jumptosearch": "검색",
-       "view-pool-error": "현재 서버에 과부하가 걸렸습니다.\n너무 많은 사용자가 이 문서를 보려고 하고 있습니다.\n이 문서를 다시 열기 전에 잠시만 기다려주세요.\n\n$1",
+       "view-pool-error": "죄송하지만 서버에 순간 과부하가 걸렸습니다.\n너무 많은 사용자가 이 문서를 보려고 하고 있습니다.\n이 문서를 다시 접근하기 전에 잠시 기다려 주세요.\n\n$1",
+       "generic-pool-error": "죄송하지만 서버에 순간 과부하가 걸렸습니다.\n너무 많은 사용자가 이 자료를 보려고 하고 있습니다.\n이 자료를 다시 접근하기 전에 잠시 기다려 주세요.",
        "pool-timeout": "잠금 대기 중 타임아웃",
        "pool-queuefull": "풀 대기열이 가득 찼습니다",
        "pool-errorunknown": "알 수 없는 오류",
        "history-feed-empty": "요청한 문서가 존재하지 않습니다.\n해당 문서가 삭제되었거나, 문서 이름이 바뀌었을 수 있습니다.\n[[Special:Search|위키의 검색]]을 사용해 관련 문서를 찾아보세요.",
        "rev-deleted-comment": "(편집 요약 삭제됨)",
        "rev-deleted-user": "(사용자 이름 삭제됨)",
-       "rev-deleted-event": "(기록 동작 삭제됨)",
+       "rev-deleted-event": "(기록 동작이 제거됨)",
        "rev-deleted-user-contribs": "[사용자 이름 또는 IP 주소 삭제됨 -  기여 목록에서 편집이 숨겨짐]",
        "rev-deleted-text-permission": "해당 편집이 문서 역사에서 '''삭제'''되었습니다.\n자세한 사항은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 볼 수 있습니다.",
        "rev-deleted-text-unhide": "해당 편집이 문서 역사에서 '''삭제'''되었습니다.\n자세한 사항은 [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 삭제 기록]에서 볼 수 있습니다.\n이 편집을 보기를 원하신다면 [$1 해당 편집]을 볼 수 있습니다.",
        "trackingcategories-desc": "분류 포함 기준",
        "noindex-category-desc": "문서는 그것과 그 플래그가 허용된 곳에 있는 이름공간에서 <code><nowiki>__NOINDEX__</nowiki></code> 특수 명령이 있기 때문에 로봇이 색인하지 않습니다.",
        "index-category-desc": "문서는 그것(과 플래그가 허용된 곳에 있는 이름공간에 있는 것)에 <code><nowiki>__INDEX__</nowiki></code>가 있어서, 정상적이지 않을 곳에 로봇에 의해 색인됩니다.",
+       "post-expand-template-inclusion-category-desc": "모든 틀을 확장하고 나서, 문서 크기가 <code>$wgMaxArticleSize</code>보다 커지므로, 어떤 틀은 확장하지 않았습니다.",
+       "post-expand-template-argument-category-desc": "틀 변수 (<code>{{{모}}}</code>와 같은, 중괄호가 세 개 있는 것)를 확장하고 나서, 문서는 <code>$wgMaxArticleSize</code>보다 커집니다.",
+       "expensive-parserfunction-category-desc": "(<code>#ifexist</code>와 같은) 너무 많은 느린 파서 함수 호출이 문서에 포함되어 있습니다. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]를 보세요.",
+       "broken-file-category-desc": "분류가 깨진 파일 링크가 포함된 문서가 있다면 추가됩니다. (파일이 존재하지 않을 때 포함되는 링크)",
+       "hidden-category-category-desc": "기본적으로 문서에 분류 링크 상자가 보여지는 것에서 막기 위한, <code><nowiki>__HIDDENCAT__</nowiki></code>가 있는 분류입니다.",
        "trackingcategories-nodesc": "사용할 수 있는 설명이 없습니다.",
        "trackingcategories-disabled": "분류가 비활성화되어 있습니다",
        "mailnologin": "보낼 이메일 주소가 없음",
        "delete-legend": "삭제",
        "historywarning": "'''경고:''' 삭제하려는 문서에 이전 {{PLURAL:$1|편집 역사}} 약 $1개가 있습니다:",
        "confirmdeletetext": "문서와 문서 역사를 삭제하려고 합니다.\n삭제하려는 문서가 맞는지, 이 문서를 삭제하는 것이 [[{{MediaWiki:Policy-url}}|정책]]에 맞는 행동인지를 확인해 주세요.",
-       "actioncomplete": "ëª\85ë ¹ 완료",
+       "actioncomplete": "ë\8f\99ì\9e\91 완료",
        "actionfailed": "명령 실패",
        "deletedtext": "\"$1\" 문서를 삭제했습니다.\n최근 삭제 기록은 $2에 있습니다.",
        "dellogpage": "삭제 기록",
index d6e0016..00ee1fb 100644 (file)
        "jumptonavigation": "Navigatioun",
        "jumptosearch": "sichen",
        "view-pool-error": "Pardon, d'Servere si fir de Moment iwwerlaascht.\nZevill Benotzer versichen dës Säit ze gesinn.\nWaart w.e.g. e bëssen ier Dir versicht dës Säit nach emol opzeruffen.\n\n$1",
+       "generic-pool-error": "Pardon, d'Servere si fir de Moment iwwerlaascht.\nZevill Benotzer versichen dës Ressource ze gesinn.\nWaart w.e.g. e bëssen ier Dir versicht dës Ressource nach emol opzeruffen.",
        "pool-timeout": "Timeout bis d'Spär opgehuewen ass",
        "pool-queuefull": "Pool-Queue ass voll",
        "pool-errorunknown": "Onbekannte Feeler",
        "pageswithprop-prophidden-long": "Wäert vun der laanger Texteegeschaft verstoppt ($1)",
        "doubleredirects": "Duebel Viruleedungen",
        "doubleredirectstext": "Op dëser Säit stinn déi Säiten déi op aner Viruleedungssäite viruleeden.\nAn all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d'Zil vun der zweeter Viruleedung, déi normalerweis déi \"richteg\" Zilsäit ass, op déi déi éischt Viruleedung hilinke soll.\n<del>Duerchgestrachen</del> Linke goufe scho sou verännert datt déi duebel Viruleedung opgeléist ass.",
-       "double-redirect-fixed-move": "[[$1]] gouf geréckelt, et ass elo eng Viruleedung op [[$2]]",
-       "double-redirect-fixed-maintenance": "Flécke vun der duebeler Viruleedung vu(n) [[$1]] op [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] gouf geréckelt.\nD'Säit gouf automatesch aktualiséiert an et ass elo eng Viruleedung op [[$2]].",
+       "double-redirect-fixed-maintenance": "Duebel Viruleedung vu(n) [[$1]] op [[$2]] gouf automatesch an engem 'maintenance job' gefléckt.",
        "double-redirect-fixer": "Verbesserung vu Viruleedungen",
        "brokenredirects": "Futtis Viruleedungen",
        "brokenredirectstext": "Dës Viruleedunge linken op Säiten déi et net gëtt.",
        "listgrouprights-namespaceprotection-header": "Limitatioune vum Nummraum",
        "listgrouprights-namespaceprotection-namespace": "Nummraum",
        "listgrouprights-namespaceprotection-restrictedto": "Recht(er), déi dem Benotzer d'Änneren erlaben",
+       "trackingcategories": "Tracking-Kategorien",
        "trackingcategories-msg": "Tracking-Kategorie",
        "trackingcategories-name": "Numm vum Message",
        "noindex-category-desc": "D'Säit gëtt net vu Botten indexéiert, well dat magescht Wuert <code><nowiki>__NOINDEX__</nowiki></code> dran ass a well se an engem Nummraum ass, an deem déi Markéierung erlaabt ass.",
index 140fac1..7a6f496 100644 (file)
@@ -16,7 +16,8 @@
                        "SabineCretella",
                        "Snowdog",
                        "Sprüngli",
-                       "아라"
+                       "아라",
+                       "Ninonino"
                ]
        },
        "tog-underline": "Sutulinia i ligam",
@@ -39,7 +40,7 @@
        "tog-enotifusertalkpages": "Mandem un messagg e-mail quand che gh'è di mudifegh a la mè pàgina di ciaciarad",
        "tog-enotifminoredits": "Màndem un messagg e-mail anca per i mudifegh piscinín",
        "tog-enotifrevealaddr": "Lassa vedè 'l mè indirizz e-mail int i messagg d'avis",
-       "tog-oldsig": "Anteprima de la firma esistenta:",
+       "tog-oldsig": "Firma esistenta:",
        "tog-fancysig": "Trata la firma cume test wiki (senza nissön ligam utumatich)",
        "tog-watchlisthideown": "Sconda i me mudifich dai pagin che a ten d'ögg",
        "tog-watchlisthidebots": "Sconda i mudifich di bot da i pagin che a ten d'ögg",
@@ -49,7 +50,7 @@
        "tog-norollbackdiff": "Mustra mía i ''diffs'' dop che i henn staa ripristinaa cun un rollback",
        "underline-always": "Semper",
        "underline-never": "Mai",
-       "underline-default": "Mantegn i impustazión standard del browser",
+       "underline-default": "Mantegn i impustazión standard del browser o de l'interfàcia",
        "editfont-style": "Stil del font de l'area de mudifega:",
        "editfont-default": "Browser de default",
        "editfont-monospace": "Font mono-spaziaa",
        "vector-action-move": "Sposta",
        "vector-action-protect": "Prutegg",
        "vector-action-undelete": "Recüpera",
-       "vector-action-unprotect": "Desbloca",
+       "vector-action-unprotect": "Càmbia la protesiù",
        "vector-view-create": "Crea",
        "vector-view-edit": "Mudifega",
        "vector-view-history": "Varda la storia",
        "actions": "Azión",
        "namespaces": "Namespace",
        "variants": "Variant",
+       "navigation-heading": "Menù de navigasiù",
        "errorpagetitle": "Erur",
        "returnto": "Turna indré a $1.",
        "tagline": "De {{SITENAME}}",
        "searcharticle": "Và",
        "history": "Crunulugia de la pagina",
        "history_short": "Crunulugìa",
+       "updatedmarker": "mudificàda de l'öltema ólta che l'è stàda ésta",
        "printableversion": "Versión stampàbil",
        "permalink": "Culegament permanent",
        "print": "Stampa",
+       "view": "Varda",
+       "view-foreign": "Arda sö",
        "edit": "Mudifega",
+       "edit-local": "Mudìfica descrisiù locàla",
        "create": "Crea",
+       "create-local": "Zóntega 'na descrisiù locàla",
        "editthispage": "Mudifega quela pagina chi",
        "create-this-page": "Crea quela pagina chi",
        "delete": "Scancela",
        "deletethispage": "Scancela quela pagina chì",
+       "undeletethispage": "Recüpera chèsta pàgina",
        "undelete_short": "Rimet a post {{PLURAL:$1|1 mudifica|$1 mudifigh}}",
+       "viewdeleted_short": "Arda {{PLURAL:$1|'na mudìfica scancelàda|$1 mudìfiche scancelàde}}",
        "protect": "Bloca",
        "protect_change": "cambia",
        "protectthispage": "Prutegg quela pagina chì",
-       "unprotect": "Desbloca",
-       "unprotectthispage": "Tö via la pruteziun",
+       "unprotect": "Càmbia la protesiù",
+       "unprotectthispage": "Càmbia la protesiù de chèsta pàgina",
        "newpage": "Pagina növa",
        "talkpage": "Discüssión",
        "talkpagelinktext": "Ciciarada",
        "articlepage": "Varda l'articul",
        "talk": "Discüssión",
        "views": "Visid",
-       "toolbox": "Arnes",
+       "toolbox": "Arnés",
        "userpage": "Vidè la pàgina del dovrat",
        "projectpage": "Varda la pagina de servizzi",
        "imagepage": "Varda la pagina del file",
        "jumptonavigation": "Navigazión",
        "jumptosearch": "cerca",
        "view-pool-error": "Ne rincress, ma i server a hinn bej caregaa al mument.\nTrop drovat a hinn 'dree pruvà a vardà quela pagina chì.\nPer piasè, specia un mument prima de pruà a vardà anmò quela pagina chì.\n\n$1",
+       "pool-timeout": "Tép scadìt per l'operasiù de blocàgio",
+       "pool-queuefull": "La cùa del \"pool\" l'è piéna",
+       "pool-errorunknown": "Erùr mìa cunusìt",
        "aboutsite": "A prupòsit de {{SITENAME}}",
        "aboutpage": "Project:A pruposit",
        "copyright": "El cuntegnüü a l'è dispunibil sota a una licenza $1.",
index aaee5da..0df04e0 100644 (file)
@@ -38,7 +38,7 @@
        "tog-extendwatchlist": "Išplėsti stebimųjų sąrašą, kad rodytų visus tinkamus keitimus, ne tik pačius naujausius.",
        "tog-usenewrc": "Naudoti patobulintąjį paskutinių keitimų sąrašą (reikia JavaScript)",
        "tog-numberheadings": "Automatiškai numeruoti skyrelius",
-       "tog-showtoolbar": "Rodyti redagavimo įrankinę (JavaScript)",
+       "tog-showtoolbar": "Rodyti redagavimo įrankių juosta",
        "tog-editondblclick": "Puslapių redagavimas dvigubu spustelėjimu (JavaScript)",
        "tog-editsectiononrightclick": "Įjungti skyrelių redagavimą paspaudus skyrelio pavadinimą dešiniuoju pelės klavišu (JavaScript)",
        "tog-watchcreations": "Pridėti puslapius, kuriuos aš sukuriu, į stebimų sąrašą",
@@ -68,6 +68,7 @@
        "tog-showhiddencats": "Rodyti paslėptas kategorijas",
        "tog-norollbackdiff": "Nepaisyti skirtumo atlikus atmetimą",
        "tog-useeditwarning": "Perspėti mane, kai palieku redagavimo puslapį, o jame yra neišsaugotų pakeitimų",
+       "tog-prefershttps": "Prisiregistruojant visada naudokite saugų ryšį",
        "underline-always": "Visada",
        "underline-never": "Niekada",
        "underline-default": "Pagal naršyklės nustatymus",
        "newwindow": "(atsidaro naujame lange)",
        "cancel": "Atšaukti",
        "moredotdotdot": "Daugiau...",
-       "morenotlisted": "Daugiau nėra",
+       "morenotlisted": "Šis sąrašas nėra išsamus.",
        "mypage": "Naudotojo puslapis",
        "mytalk": "Mano aptarimas",
        "anontalk": "Šio IP aptarimas",
        "permalink": "Nuolatinė nuoroda",
        "print": "Spausdinti",
        "view": "Žiūrėti",
+       "view-foreign": "Rodyti $1",
        "edit": "Redaguoti",
+       "edit-local": "Redaguoti vietos aprašymą",
        "create": "Sukurti",
+       "create-local": "Pridėti vietos aprašymą",
        "editthispage": "Redaguoti šį puslapį",
        "create-this-page": "Sukurti šį puslapį",
        "delete": "Trinti",
        "pool-errorunknown": "Nežinoma klaida",
        "aboutsite": "Apie {{SITENAME}}",
        "aboutpage": "Project:Apie",
-       "copyright": "Turinys pateikiamas pagal $1 licenciją.",
+       "copyright": "Turinys pateikiamas pagal  $1  jei nenurodyta kitaip.",
        "copyrightpage": "{{ns:project}}:Autorystės teisės",
        "currentevents": "Naujienos",
        "currentevents-url": "Project:Naujienos",
        "youhavenewmessages": "Jūs turite $1 ($2).",
        "youhavenewmessagesfromusers": "Jūs gavote $1 nuo {{PLURAL:$3|kito vartotojo|$3 vartotojų}} ($2).",
        "youhavenewmessagesmanyusers": "Jūs turite $1 iš daugelio vartotojų ( $2 ) .",
-       "newmessageslinkplural": "{{PLURAL:$1|naują žinutę|naujų žinučių}}",
-       "newmessagesdifflinkplural": "paskutinis {{PLURAL:$1|pakeitimas|pakeitimai}}",
+       "newmessageslinkplural": "{{PLURAL:$1|nauja žinutė|999=naujos žinutės}}",
+       "newmessagesdifflinkplural": "paskutinis {{PLURAL:$1|pakeitimas|999=pakeitimai}}",
        "youhavenewmessagesmulti": "Turite naujų žinučių $1",
        "editsection": "redaguoti",
        "editold": "taisyti",
        "nospecialpagetext": "<strong>Toks specialusis puslapis neegzistuoja</strong>\n\nEgzistuojančių specialiųjų puslapių sąrašą galite rasti [[Special:SpecialPages|specialiųjų puslapių sąraše]].",
        "error": "Klaida",
        "databaseerror": "Duomenų bazės klaida",
+       "databaseerror-query": "Užklausa:$1",
+       "databaseerror-error": "Klaida: $1",
        "laggedslavemode": "Dėmesio: Puslapyje gali nesimatyti naujausių pakeitimų.",
        "readonly": "Duomenų bazė užrakinta",
        "enterlockreason": "Įveskite užrakinimo priežastį, taip pat datą, kada bus atrakinta",
        "gotaccount": "Jau turite paskyrą? '''$1'''.",
        "gotaccountlink": "Prisijunkite",
        "userlogin-resetlink": "Pamiršote savo prisijungimo duomenis?",
-       "userlogin-resetpassword-link": "Nustatykite slaptažodį iš naujo",
+       "userlogin-resetpassword-link": "Pamiršote savo slaptažodį?",
+       "userlogin-helplink2": "Padėti prisijungti",
        "userlogin-createanother": "Sukurti kitą paskyrą",
        "createacct-emailrequired": "Elektroninio pašto adresas",
        "createacct-emailoptional": "Elektroninio pašto adresas (neprivaloma)",
        "accountcreatedtext": "Naudotojo paskyra [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) buvo sukurta.",
        "createaccount-title": "{{SITENAME}} paskyros kūrimas",
        "createaccount-text": "Projekte {{SITENAME}} ($4) kažkas sukūrė paskyrą „$2“ su slaptažodžiu „$3“ panaudodamas jūsų el. pašto adresą.\nJūs turėtumėte prisijungti ir pasikeisti savo slaptažodį.\n\nJūs galite nekreipti dėmesio į laišką, jei ši paskyra buvo sukurta per klaidą.",
-       "login-throttled": "Jūs pernelyg daug kartų bandėte prisijungti.\nPalaukite prieš bandant vėl.",
+       "login-throttled": "Jūs pernelyg daug kartų bandėte prisijungti.\nPalaukite $1 prieš bandant vėl.",
        "login-abort-generic": "Jūsų prisijungimas buvo nesėkmingas - Nutraukta",
        "loginlanguagelabel": "Kalba: $1",
        "suspicious-userlogout": "Jūsų prašymas atsijungti buvo atmestas, nes, atrodo, jį klaidingai išsiuntė naršyklė arba spartinantysis tarpinis serveris.",
        "newpassword": "Naujas slaptažodis:",
        "retypenew": "Pakartokite naują slaptažodį:",
        "resetpass_submit": "Nustatyti slaptažodį ir prisijungti",
-       "changepassword-success": "Jūsų slaptažodis pakeistas sėkmingai! Dabar prisijungiama...",
+       "changepassword-success": "Jūsų slaptažodis pakeistas sėkmingai!",
        "resetpass_forbidden": "Slaptažodžiai negali būti pakeisti",
        "resetpass-no-info": "Jūs turite būti prisijungęs, kad pasiektumėte puslapį tiesiogiai.",
        "resetpass-submit-loggedin": "Keisti slaptažodį",
        "invalid-content-data": "Neleistinas turinys.",
        "content-not-allowed-here": "Turinys \"$1\" puslapyje [[$2]] nėra leistinas.",
        "editwarning-warning": "Palikdamas šį puslapį jūs prarasite visus padarytus pakeitimus.",
+       "editpage-notsupportedcontentformat-title": "Turinio formatas nepalaikomas",
+       "editpage-notsupportedcontentformat-text": "Turinio formatas $1 nepalaiko turinio modelio $2.",
        "content-model-wikitext": "wikitekstas",
        "content-model-text": "paprastasis tekstas",
        "content-model-javascript": "JavaScript",
        "badsig": "Neteisingas parašas; patikrinkite HTML žymes.",
        "badsiglength": "Jūsų parašas per ilgas.\nJį turi sudaryti ne daugiau kaip $1 {{PLURAL:$1|simbolis|simboliai|simbolių}}.",
        "yourgender": "Lytis:",
-       "gender-unknown": "Nenurodyta",
-       "gender-male": "Vyras",
-       "gender-female": "Moteris",
+       "gender-unknown": "Aš nenoriu pasakyti",
+       "gender-male": "Jis redaguoja wiki puslapius",
+       "gender-female": "Ji redaguoja wiki puslapius",
        "prefs-help-gender": "Pasirinktinai: naudojama teisingam sistemos kreipimuisi į jus.\nŠi informacija yra vieša.",
        "email": "El. paštas",
        "prefs-help-realname": "Tikrasis vardas yra neprivalomas.\nJei jūs jį įvesite, jis bus naudojamas pažymėti jūsų darbą.",
        "prefs-signature": "Parašas",
        "prefs-dateformat": "Datos formatas",
        "prefs-timeoffset": "Laiko skirtumas",
-       "prefs-advancedediting": "Bendras",
+       "prefs-advancedediting": "Bendrosios parinktys",
        "prefs-editor": "Redaktorius",
        "prefs-preview": "Peržiūra",
        "prefs-advancedrc": "Papildomi nustatymai",
        "userrights-no-interwiki": "Jūs neturite leidimo keisti naudotojų teises kituose projektuose.",
        "userrights-nodatabase": "Duomenų bazė $1 neegzistuoja arba yra ne vietinė.",
        "userrights-nologin": "Jūs privalote [[Special:UserLogin|prisijungti]] kaip administratorius, kad galėtumėte priskirti naudotojų teises.",
-       "userrights-notallowed": "Jūsų paskyra neturi teisių priskirti ar panaikinti naudotojų teises.",
+       "userrights-notallowed": "Jūs neturite leidimo įtraukti arba pašalinti vartotojo teisių.",
        "userrights-changeable-col": "Grupės, kurias galite keisti",
        "userrights-unchangeable-col": "Grupės, kurių negalite keisti",
        "userrights-conflict": "Naudotojo teisių konfliktas! Prašome dar kartą taikyti savo keitimus.",
        "right-reupload-shared": "Perrašyti failus bendrojoje failų saugykloje lokaliai",
        "right-upload_by_url": "Įkelti failą iš URL adreso",
        "right-purge": "Išvalyti svetainės podėlį puslapiui be patvirtinimo",
-       "right-autoconfirmed": "Redaguoti pusiau užrakintus puslapius",
+       "right-autoconfirmed": "Netaikyti greičio apribojimų",
        "right-bot": "Laikyti automatiniu procesu",
        "right-nominornewtalk": "Atlikus smulkių keitimų aptarimų puslapiuose įjungia pranešimą apie naujas žinutes",
        "right-apihighlimits": "Mažesni apribojimai API užklausoms",
        "action-viewmyprivateinfo": "peržiūrėti jūsų privačią informaciją",
        "action-editmyprivateinfo": "redaguoti savo privačią informaciją",
        "nchanges": "$1 {{PLURAL:$1|pakeitimas|pakeitimai|pakeitimų}}",
+       "enhancedrc-history": "istorija",
        "recentchanges": "Naujausi keitimai",
        "recentchanges-legend": "Naujausių keitimų parinktys",
        "recentchanges-summary": "Šiame puslapyje yra patys naujausi pakeitimai šiame projekte.",
        "unusedtemplateswlh": "kitos nuorodos",
        "randompage": "Atsitiktinis puslapis",
        "randompage-nopages": "{{PLURAL:$2|Šioje vardų srityje|Šiose vardų srityse}} nėra jokių puslapių: $1.",
+       "randomincategory-selectcategory-submit": "Pirmyn",
        "randomredirect": "Atsitiktinis peradresavimas",
        "randomredirect-nopages": "Vardų srityje „$1“ nėra jokių peradresavimų.",
        "statistics": "Statistika",
        "protectedpages": "Užrakinti puslapiai",
        "protectedpages-indef": "Tik neapibrėžtos apsaugos",
        "protectedpages-cascade": "Tik pakopinė apsauga",
+       "protectedpages-noredirect": "Slėpti peradresavimus",
        "protectedpagesempty": "Šiuo metu nėra apsaugotas joks failas su šiais parametrais.",
+       "protectedpages-timestamp": "Laiko žyma",
        "protectedpages-page": "Puslapis",
        "protectedpages-expiry": "Galioja iki",
        "protectedpages-reason": "Priežastis",
+       "protectedpages-unknown-timestamp": "Nežinomas",
+       "protectedpages-unknown-performer": "Nežinomas vartotojas",
        "protectedtitles": "Apsaugoti pavadinimai",
        "protectedtitlesempty": "Šiuo metu nėra jokių pavadinimų apsaugotų šiais parametrais.",
        "listusers": "Naudotojų sąrašas",
        "undeletedrevisions": "{{PLURAL:$1|atkurta $1 versija|atkurtos $1 versijos|atkurta $1 versijų}}",
        "undeletedrevisions-files": "{{PLURAL:$1|atkurta $1 versija|atkurtos $1 versijos|atkurta $1 versijų}} ir $2 {{PLURAL:$2|failas|failai|failų}}",
        "undeletedfiles": "{{PLURAL:$1|atkurtas $1 failas|atkurti $1 failai|atkurta $1 failų}}",
-       "cannotundelete": "Atkūrimas nepavyko; kažkas kitas pirmas galėjo atkurti puslapį.",
+       "cannotundelete": "Atkūrimas nepavyko:\n$1",
        "undeletedpage": "'''$1 buvo atkurtas'''\n\nPeržiūrėkite [[Special:Log/delete|trynimų sąrašą]], norėdami rasti paskutinių trynimų ir atkūrimų sąrašą.",
        "undelete-header": "Kad sužinotumėte, kurie puslapiai paskiausiai ištrinti, žiūrėkite [[Special:Log/delete|šalinimų sąrašą]].",
        "undelete-search-title": "Panaikintų puslapių paieška",
index 603a483..e7e3fdf 100644 (file)
        "permalink": "Rohy maharitra",
        "print": "Avoaka an-taratasy",
        "view": "Hamaky",
+       "view-foreign": "Jerena eo amin'i $1",
        "edit": "Ovaina",
+       "edit-local": "Hanova ny famisavisana eo an-toerana",
        "create": "Amboarina",
+       "create-local": "Hanampy famisavisana eo an-toerana",
        "editthispage": "Hanova ity pejy ity",
        "create-this-page": "Forony ity pejy ity",
        "delete": "Hamafa",
        "jumptonavigation": "Fikarohana",
        "jumptosearch": "karohy",
        "view-pool-error": "Azafady, be asa ny lohamilina ankehitriny.\nBetsaka loatra ny mpikambana mitady hijery ity pejy ity.\nMiandrasa kely, dia avereno.\n\n$1",
+       "generic-pool-error": "Azafady fa tototry ny asa ny lohamilina amin'izao fotoana izao.\nBetsaka loatra ny mpampiasa manandrana mijery io loharano io.\nAndraso kely dia andramo fanindroany.",
        "pool-timeout": "Fe-potoana voahoatra ho an'ny hidy.",
        "pool-queuefull": "Feno ny lisitry ny asa hatao",
        "pool-errorunknown": "Tsi-fetezana tsy fantatra",
        "gotaccountlink": "Midira",
        "userlogin-resetlink": "Adinonavo ve ny antsipihan'ny fidiranao ?",
        "userlogin-resetpassword-link": "Hadino ny tenimiafina?",
+       "userlogin-helplink2": "Fanampiana amin'ny fidirana",
        "userlogin-loggedin": "Efa tafiditra amin'ny anaran'i {{GENDER:$1|$1}} ianao. Ampiasao ny fôrmiolera eo ambany raha hiditra amin'ny anaran'ny mpikambana hafa.",
        "userlogin-createanother": "Hamorona kaonty hafa",
        "createacct-emailrequired": "Adiresy mailaka :",
        "suspicious-userlogout": "Ny fangataham-pialanao dia tsy nekena satria ohatry ny nalfan'ny mpizahan-tsehatra simba izy na kasy ny proxy.",
        "createacct-another-realname-tip": "Azo tsy atsofoka ny tena anarana.\nRaha misafidy ny hanome azy ianao, ho ampiasaina amin'ny fanehoana ny anjara asan'ilay mpikambana ilay izy.",
        "pt-login": "Hiditra",
+       "pt-login-button": "Hiditra",
        "pt-createaccount": "Hamorona kaonty",
        "pt-userlogout": "Hivoaka",
        "php-mail-error-unknown": "Hadisoana tsy fantatra tao amin'ny tao mial() an'i PHP.",
        "resetpass-temp-password": "Tenimiafina miserana :",
        "resetpass-abort-generic": "Nosakanan'ny itatra (extension) iray ny fanovana tenimiafina.",
        "resetpass-expired": "Efa nitsahatra ny tenimiafinao. Mampidira tenimiafina vaovao hahafahanao miditra.",
-       "resetpass-expired-soft": "Efa nitsahatra ny tenimiafinao, ary tsy maintsy averina ilay izy. Safidio avy hatrany ny tenimiafina, na tsindrio \"Aoka aloha\" raha tsy hanao izany androany",
+       "resetpass-expired-soft": "Efa nitsahatra ny tenimiafinao, ary tsy maintsy averina ilay izy. Safidio avy hatrany ny tenimiafina, na tsindrio \"{{int:resetpass-submit-cancel}}\" raha tsy hanao izany androany",
+       "resetpass-validity-soft": "Tsy ekena ny tenimiafinao : $1\n\nTenimiafina vaovao fidiana, na tsindrio \"{{int:resetpass-submit-cancel}}\" raha hamerina azy amin'ny fotoana hafa.",
        "passwordreset": "Famafana ary famerenana ny tenimiafina",
        "passwordreset-text-one": "Fenoy ity fôrmiolera ity mba hamerenana ny tenimiafinao",
        "passwordreset-text-many": "{{PLURAL:$1|Fenoy ny saha mba hahazoanao tenimiafina vonjimaika.}}",
        "content-not-allowed-here": "Votoatiny ''$1'' voarara eo amin'ny pejy [[$2]]",
        "editwarning-warning": "Mety hahavery ny fanovana nataonao ny fialanao amin'ity pejy ity.\nRaha tafiditra ianao dia azonao esorina ity fampitandremana ity ao amin'ny fizarana \"{{int:prefs-editing}}\" ao amin'ny safidinao.",
        "editpage-notsupportedcontentformat-title": "Tsy zaka io andrefim-botoatiny io",
+       "editpage-notsupportedcontentformat-text": "Tsy zakan'ny maodelim-botoatiny $1 ny firafi-botoatiny $1",
        "content-model-wikitext": "wiki-soratra",
        "content-model-text": "soratra tsotra",
        "content-model-javascript": "JavaScript",
        "listgrouprights-removegroup-self": "Afaka manala ny tenany amin'ny vondrona{{PLURAL:$2}} : $1",
        "listgrouprights-addgroup-self-all": "Manampy ny vondrom-pikambana rehetra amin'ny kaontiny",
        "listgrouprights-removegroup-self-all": "Manala ny vondrom-pikambana rehetra amin'ny kaontiny",
+       "listgrouprights-namespaceprotection-header": "Fifehezana amin'ny valan'anarana",
+       "listgrouprights-namespaceprotection-namespace": "Valan'anarana",
+       "listgrouprights-namespaceprotection-restrictedto": "Zo ahafahan'ny mpikambana manova",
+       "trackingcategories": "Sokajy fanarahana",
+       "trackingcategories-msg": "Sokajy fanarahana",
+       "trackingcategories-name": "Anaran-kafatra",
+       "trackingcategories-nodesc": "Tsy ahitana famaritana.",
+       "trackingcategories-disabled": "Tsy nalefa ho ampiasaina ilay sokajy",
        "mailnologin": "Tsy misy adiresy handefasana ny tenimiafina",
        "mailnologintext": "Mila [[Special:UserLogin|miditra]] ianao sady manana imailaka mandeha sy voamarina ao amin'ny [[Special:Preferences|mombamomba anao]] vao afaka mandefa imailaka amin'ny mpikambana hafa.",
        "emailuser": "Andefaso imailaka io mpikambana io",
index 082a2c1..e991760 100644 (file)
@@ -9,7 +9,8 @@
                        "Shirayuki",
                        "Сай",
                        "Санюн Вадик",
-                       "아라"
+                       "아라",
+                       "Sergey Ivanov"
                ]
        },
        "tog-underline": "Кузе кылвер-влакым ӱлычын удыралаш?",
        "faq": "ЧӱВаЙо (Чӱчкыдын вашлиялтше йодыш-влак)",
        "vector-action-addsection": "У ӱжашым тӱҥалаш",
        "vector-action-delete": "Шӧраш",
-       "vector-action-move": "Ð\9aÑ\83Ñ\81аÑ\80аш",
+       "vector-action-move": "Ð\9bӱмÑ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82аш",
        "vector-action-protect": "Тӧрлатымаш деч аралаш",
        "vector-action-undelete": "Шӧрымым пӧртылаш",
        "vector-action-unprotect": "Оролым вашталташ",
        "grouppage-bot": "{{ns:project}}:Бот-влак",
        "grouppage-sysop": "{{ns:project}}:Сайтвиктарыше-влак",
        "newuserlogpage": "У пайдаланыше регистрацийым эртарыме журнал",
-       "rightslog": "Ð\9fайдаланÑ\8bÑ\88Ñ\8bн ÐºÐµÑ\80Ñ\82Ñ\8bж Ð½ÐµÑ\80ген журнал",
+       "rightslog": "УÑ\87аÑ\81Ñ\82никÑ\8bн Ð¿Ñ\80аваже-влакÑ\8bм Ð¾Ð½Ñ\87Ñ\8bкÑ\82Ñ\8bÑ\88о журнал",
        "action-edit": "тиде лаштыкым тӧрлаташ",
        "nchanges": "$1 {{PLURAL:$1|тӧрлатымаш}}",
        "recentchanges": "Пытартыш тӧрлатымаш-влак",
        "usercreated": "$1, $2 шагатлан {{GENDER:$3|регистрацийым эртен|регистрацийым эртен}}",
        "newpages": "У лаштык-влак",
        "newpages-username": "Пайдаланышын лӱмжӧ:",
-       "move": "Ð\9aÑ\83Ñ\81аÑ\80аш",
-       "movethispage": "Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bм ÐºÑ\83Ñ\81аÑ\80аш",
+       "move": "Ð\9bӱмÑ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82аш",
+       "movethispage": "Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ñ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82аш",
        "pager-newer-n": "{{PLURAL:$1|1=вес|вес}}",
        "pager-older-n": "{{PLURAL:$1|1=ончычсо|ончычсо}}",
        "booksources": "Негызым пыштыше кнага-влак",
        "blocklogentry": "[[$1]] лан йӧным петрен $2 $3 мучашлалтеш",
        "unblocklogentry": "$1лан йӧным почмо",
        "block-log-flags-nocreate": "у пайдаланыше-влаклан регистрацийым чактарыме",
-       "move-page-legend": "Ð\9bаÑ\88Ñ\82Ñ\8bкÑ\8bм ÐºÑ\83Ñ\81аÑ\80аш",
+       "move-page-legend": "Ð\9bаÑ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ñ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82Ñ\8bмаш",
        "movepagetext": "Ӱлыл формо дене пайдаланен, тый лаштыкын лӱмым вашталтен кертат, тудын вашталтыме эртымгорныже у верыш кусарыме.\nТошто лӱмыштӧ у лӱмыш колтымо лаштык кодеш.\nТый тошто лӱмыш колтымо лаштык-влакым шке семын вашталтке кертат.\nТый тидым ынет ыште гын, [[Special:DoubleRedirects|кокытан]] да [[Special:BrokenRedirects|пудыргышо вес вере колтымашым]] терге.\nТый палемдыме верыш кылвер-влаклан шуйнымылан да тушко ончыктымылан вуйын шогет.\n\nШотыш нал: кунам у лӱман лаштык уло, тудо '''ок''' кусаралт. Тыге огыл, кунам лаштык вес вере кусаралтеш але тудо яра да вашталтымаш эртымгорныже уке.\nТый лаштыкым йонгылыш кусаренат гын менгешла тудым тошто лӱмыш кусарен кертат, но тый уже улшо лаштыкым ӱштын от керт, манын ончыкта.\n\n'''Тӱтко лий!'''\nЧӱчкыдын кучылтмо лаштыклан тиде кугу вашталтышым ыштен кертеш;\nУмбаке кайыме деч ончыч шоналте, тый тидын деч вара лиймым умылет.",
        "movepagetalktext": "Тиде лаштыкын каҥашымаш лаштык шке семын огеш кусно, '''тидлан амалже:'''\n*Тыгай лӱман яра огыл каҥашымаш лаштык уло ала\n*Ӱлыч кайыкым от корангде.\n\nТыгай годым тылат лаштыкым шке кидет дене кусараш але иктеш ушнаш кӱлеш.",
-       "movearticle": "Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bм ÐºÑ\83Ñ\81аÑ\80аш:",
+       "movearticle": "Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ñ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82аш:",
        "newtitle": "У лӱм:",
        "move-watch": "Тиде лаштыкым эскераш",
-       "movepagebtn": "Ð\9bаÑ\88Ñ\82Ñ\8bкÑ\8bм ÐºÑ\83Ñ\81аÑ\80аш",
+       "movepagebtn": "Ð\9bаÑ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ñ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82аш",
        "pagemovedsub": "Кусарымаш сайын эртен",
        "movepage-moved": "'''\"$1\" лаштыкым \"$2\" лаштыкыш кусарыме'''",
        "movepage-moved-redirect": "Вес вере колтымаш ыштыме.",
        "movepage-moved-noredirect": "Вес вере колтымаш ыштыме огыл.",
        "articleexists": "Тыгай лӱман лаштык уло але тиде лӱмым кучылташ огеш лий. Вес лӱмым ойыро.",
-       "movetalk": "Ð\9aаҥаÑ\88Ñ\8bмаÑ\88 Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bм ÐºÑ\83Ñ\81аÑ\80аш",
+       "movetalk": "Ð\9aаҥаÑ\88Ñ\8bмаÑ\88 Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ñ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82аш",
        "movelogpage": "Кусарыме нерген журнал",
        "movereason": "Амал:",
        "revertmove": "мӧҥгешла пӧртылаш",
        "tooltip-ca-history": "Лаштыкын ондаксе тӧрлатымаш",
        "tooltip-ca-protect": "Тиде лаштыкым тӧрлатымаш деч аралаш",
        "tooltip-ca-delete": "Тиде лаштыкым шӧраш",
-       "tooltip-ca-move": "Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bм ÐºÑ\83Ñ\81аÑ\80аш",
+       "tooltip-ca-move": "Тиде Ð»Ð°Ñ\88Ñ\82Ñ\8bкÑ\8bн Ð»Ó±Ð¼Ð¶Ñ\8bм Ð²Ð°Ñ\88Ñ\82алÑ\82аш",
        "tooltip-ca-watch": "Тиде лаштыкым тыйын эскерыме лӱмерыш ешараш",
        "tooltip-ca-unwatch": "Тиде лаштыкым тыйын эскерымашет гыч кораҥдаш",
        "tooltip-search": "{{SITENAME}} лаштыкыште кычалаш",
index f7189eb..62fe9f1 100644 (file)
        "jumptonavigation": "содржини",
        "jumptosearch": "барај",
        "view-pool-error": "За жал во моментов опслужувачите се преоптоварени.\nПремногу корисници се обидуваат да ја прегледаат оваа страница.\nВе молиме почекајте некое време пред повторно да се обидете да пристапите до оваа страница.\n\n$1",
+       "generic-pool-error": "За жал во моментов опслужувачите се преоптоварени.\nПремногу корисници се обидуваат да го прегледаат овој ресурс.\nПочекајте некое време, па обидете се повторно.",
        "pool-timeout": "Истече времето за чекање на заклучувањето",
        "pool-queuefull": "Редицата на барања е полна",
        "pool-errorunknown": "Непозната грешка",
        "categoriesfrom": "Приказ на категории почнувајќи од:",
        "special-categories-sort-count": "подреди по број",
        "special-categories-sort-abc": "подреди азбучно",
-       "deletedcontributions": "Ð\98збÑ\80иÑ\88ани Ð¿Ñ\80идонеÑ\81и Ð½Ð° ÐºÐ¾Ñ\80иÑ\81никоÑ\82",
-       "deletedcontributions-title": "Ð\98збÑ\80иÑ\88ани Ð¿Ñ\80идонеÑ\81и Ð½Ð° ÐºÐ¾Ñ\80иÑ\81никоÑ\82",
+       "deletedcontributions": "Ð\98збÑ\80иÑ\88ани ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки Ð¿Ñ\80идонеÑ\81и",
+       "deletedcontributions-title": "Ð\98збÑ\80иÑ\88ани ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки Ð¿Ñ\80идонеÑ\81и",
        "sp-deletedcontributions-contribs": "придонеси",
        "linksearch": "Пребарување на надворешни врски",
        "linksearch-pat": "Услов за пребарување:",
        "sp-contributions-newbies-title": "Придонеси на нови корисници",
        "sp-contributions-blocklog": "Дневник на блокирања",
        "sp-contributions-suppresslog": "притаени придонеси на корисникот",
-       "sp-contributions-deleted": "избÑ\80иÑ\88ани Ð¿Ñ\80идонеÑ\81и Ð½Ð° ÐºÐ¾Ñ\80иÑ\81никоÑ\82",
+       "sp-contributions-deleted": "избÑ\80иÑ\88ани ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки Ð¿Ñ\80идонеÑ\81и",
        "sp-contributions-uploads": "подигања",
        "sp-contributions-logs": "дневници",
        "sp-contributions-talk": "разговор",
index 5339502..745d0c8 100644 (file)
        "rcnotefrom": "Доорх нь '''$2'''-с хойших өөрчлөлтүүд ('''$1''' хүртэлхийг харуулав) юм.",
        "rclistfrom": "$3 $2-с хойших шинэ засваруудыг үзүүлэх",
        "rcshowhideminor": "Бага зэргийн засваруудыг $1",
+       "rcshowhideminor-show": "үзүүлэх",
+       "rcshowhideminor-hide": "нуух",
        "rcshowhidebots": "Роботуудыг $1",
        "rcshowhideliu": "Нийт $1 бүртгэгдсэн хэрэглэгчид",
        "rcshowhideliu-show": "үзүүлэх",
        "rcshowhideanons-hide": "нуух",
        "rcshowhidepatr": "Хянагдаж буй засваруудыг $1",
        "rcshowhidemine": "Миний засваруудыг $1",
+       "rcshowhidemine-show": "үзүүлэх",
+       "rcshowhidemine-hide": "нуух",
        "rclinks": "Сүүлийн $2 өдрийн турших $1 засварыг үзүүлэх<br />$3",
        "diff": "ялгаа",
        "hist": "түүх",
        "rc-enhanced-expand": "Дэлгэрэнгүй мэдээллийг үзүүлэх (ЖаваСкрипт хэрэглэгдэнэ)",
        "rc-enhanced-hide": "Дэлгэрэнгүй мэдээллийг нуух (ЖаваСкрипт хэрэглэгдэнэ)",
        "rc-old-title": "Анх өгсөн гарчиг нь \"$1\"",
-       "recentchangeslinked": "Холбогдох өөрчлөлтүүд",
-       "recentchangeslinked-feed": "Холбогдох өөрчлөлтүүд",
-       "recentchangeslinked-toolbox": "Холбогдох өөрчлөлтүүд",
+       "recentchangeslinked": "Өөрчлөгдчихсөн эсэх",
+       "recentchangeslinked-feed": "Өөрчлөгдчихсөн эсэх",
+       "recentchangeslinked-toolbox": "Өөрчлөгдчихсөн эсэх",
        "recentchangeslinked-title": "\"$1\"-тай холбоотой засварууд",
        "recentchangeslinked-summary": "Энэ хуудас бол тодорхой хуудаснаас (эсвэл тодорхой ангиллын доторх хуудсууд) холбогдсон хуудсуудад хийгдсэн өөрчлөлтийн жагсаалт юм.\nТаны [[Special:Watchlist|хянах жагсаалтанд]] буй хуудсууд '''тодруулагдсан''' байгаа.",
        "recentchangeslinked-page": "Хуудасны нэр:",
        "undelete-error-long": "Дараах файлыг сэргээхэд алдаа гарлаа:\n\n$1",
        "undelete-show-file-confirm": "$2-ий $3 дахь \"<nowiki>$1</nowiki>\" файлын устгагдсан засварыг үзмээр байгаадаа итгэлтэй байна уу?",
        "undelete-show-file-submit": "Тийм",
-       "namespace": "Ð\9dÑ\8dÑ\80ний Ð·Ð°Ð¹:",
+       "namespace": "Ð¥Ñ\83Ñ\83даÑ\81нÑ\8b Ñ\82Ó©Ñ\80өл:",
        "invert": "Зааснаас бусад",
        "namespace_association": "Заасантай холбоотой",
        "blanknamespace": "(Гол)",
        "import-interwiki-history": "Энэ хуудсын бүх хувилбаруудын түүхийг хуулах",
        "import-interwiki-templates": "Бүх загварыг оруулах",
        "import-interwiki-submit": "Импортлох",
-       "import-interwiki-namespace": "Зорьсон нэрний зай:",
+       "import-interwiki-namespace": "Зорьсон хуудсын төрөл:",
        "import-upload-filename": "Файлын нэр:",
        "import-comment": "Тайлбар:",
        "importtext": "[[Special:Export|экспорт багажийг]]  ашиглан файлыг эх үүсвэр викигээс татаад, өөрийн дискэнд хадгалж, энд оруулна уу.",
        "sqlite-has-fts": "$1 (бүх текстээрх хайлтыг дэмждэг)",
        "sqlite-no-fts": "$1 (бүх текстээрх хайлтыг дэмждэггүй)",
        "logentry-delete-delete": "$3 хуудсыг $1 устгасан",
-       "logentry-delete-restore": "$3 Ñ\85Ñ\83Ñ\83дÑ\81Ñ\8bг $1 Ñ\81Ñ\8dÑ\82гÑ\8dÑ\8dÑ\81Ñ\8dн",
+       "logentry-delete-restore": "$3 Ñ\85Ñ\83Ñ\83дÑ\81Ñ\8bг $1 Ñ\81Ñ\8dÑ\80гÑ\8dÑ\8dв",
        "revdelete-restricted": "системийн операторуудад тавигдсан хязгаарлалтууд",
        "revdelete-unrestricted": "системийн операторуудаас авч хаясан хязгаарлалтууд",
        "logentry-rights-rights": "$1 $3 дахь грүпийн гишүүнчлэлээ $4 ээс $5 руу шилжүүллээ",
index 2c4fe54..3a9edc0 100644 (file)
        "permalink": "शाश्वत दुवा",
        "print": "छापा",
        "view": "दाखवा",
+       "view-foreign": "$1 वर पहा",
        "edit": "संपादन",
        "create": "तयार करा",
        "editthispage": "हे पृष्ठ संपादित करा",
index b1a13a6..a906f17 100644 (file)
        "jumptonavigation": "Se̍h chām",
        "jumptosearch": "chhiau-chhoē",
        "view-pool-error": "Pháiⁿ-sè, chit-má chú-ki siuⁿ koè bô-êng.\nSiuⁿ koè chē lâng beh khoàⁿ chit ia̍h.\nChhiáⁿ sio-tán chi̍t-ē,  chiah koh lâi khoàⁿ chit ia̍h.\n\n$1",
+       "generic-pool-error": "Pháiⁿ-sè, chit-má chú-ki siuⁿ koè bô-êng.\nSiuⁿ chē lâng beh khoàⁿ chit ia̍h.\nChhiáⁿ sio-tán chi̍t-ē,  chiah koh lâi khoàⁿ chit ia̍h.",
        "pool-timeout": "Chhiau-koè só-tēng ê sî-kan",
        "pool-queuefull": "Tūi-lia̍t pâi moá ah",
        "pool-errorunknown": "M̄-chai siáⁿ chhò-gō͘",
+       "pool-servererror": "無提供系統服務總數的統計。",
        "aboutsite": "hían-sī",
        "aboutpage": "Project:koan-hē",
        "copyright": "Tû liáu ū lēng-goā kóng, nā bô loē-iông sī chiàu $1 tiâu-kiāⁿ tō thang sú-iōng.",
index 9969a7d..389d82c 100644 (file)
@@ -48,7 +48,7 @@
        "tog-hidepatrolled": "Skjul patruljerte redigeringer i siste endringer",
        "tog-newpageshidepatrolled": "Skjul patruljerte sider fra listen over nye sider",
        "tog-extendwatchlist": "Utvid overvåkningslisten til å vise alle endringer, ikke bare de siste",
-       "tog-usenewrc": "Gruppeendringer per side i siste endringer samt overvåkingsliste",
+       "tog-usenewrc": "Grupper endringer etter side i siste endringer og overvåkingslisten",
        "tog-numberheadings": "Autonummerer overskrifter",
        "tog-showtoolbar": "Vis verktøylinje",
        "tog-editondblclick": "Rediger sider ved å dobbeltklikke",
        "listgrouprights-namespaceprotection-namespace": "Navnerom",
        "listgrouprights-namespaceprotection-restrictedto": "Rettighet(er) som tillater at brukeren redigerer",
        "trackingcategories": "Sporingskategori",
-       "trackingcategories-summary": "Denne siden lister sporingskategorier som er automatisk befolket av Mediawiki-programvaren. Deres navn kan bli endret ved å redigere de tilhørende systembeskjedene i {{ns:8}}-navnerommet.",
+       "trackingcategories-summary": "Denne siden lister sporingskategorier som er automatisk befolket av Mediawiki-programvaren. Navnene deres kan endres ved å redigere de tilhørende systembeskjedene i {{ns:8}}-navnerommet.",
        "trackingcategories-msg": "Sporingskategori",
        "trackingcategories-name": "Beskjednavn",
        "trackingcategories-desc": "Kategori-inklusjonskriterium",
index 1687f64..c42de5e 100644 (file)
        "editundo": "angre",
        "diff-empty": "(Ingen skilnad)",
        "diff-multi-sameuser": "({{PLURAL:$1|Éin mellomversjon|$1 mellomversjonar}} av den same brukaren er ikkje {{PLURAL:$1|vist|viste}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Éin mellomliggjande versjon|$1 mellomliggjande versjonar}} av {{PLURAL:$2|éin annan brukar|$2 brukarar}} er ikkje {{PLURAL:$1|vist|viste}})",
        "diff-multi-manyusers": "({{PLURAL:$1|Ein mellomversjon|$1 mellomversjonar}} av meir enn $2 {{PLURAL:$2|brukar|brukarar}}  er ikkje {{PLURAL:$1|vist|viste}})",
        "difference-missing-revision": "{{PLURAL:$2|Éin versjon|$2 versjonar}} av skilnaden ($1) vart ikkje {{PLURAL:$2|funnen|funne}}.\n\nDette skriv seg som oftast frå at ein har fylgt ei forelda versjonslenkje til ei side som er sletta.\nDetaljar kan ein finna i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].",
        "searchresults": "Søkjeresultat",
        "listgrouprights-removegroup-self": "Kan ta vekk {{PLURAL:$2|gruppe|grupper}} frå eigen konto: $1",
        "listgrouprights-addgroup-self-all": "Kan leggja til alle gruppene til sin eigen konto",
        "listgrouprights-removegroup-self-all": "Kan ta vekk alle gruppene frå sin eigen konto",
+       "trackingcategories": "Sporingskategoriar",
+       "trackingcategories-summary": "Denne sida listar opp sporingskategoriar som automatisk får innhald av MediaWiki-programvara. Namna deira kan endrast gjennom å endra dei relevante systemmeldingane i {{ns:8}}-namnerommet.",
+       "trackingcategories-msg": "Sporingskategori",
+       "trackingcategories-name": "Meldingsnamn",
+       "trackingcategories-desc": "Inkluderingsgrunnlag",
+       "noindex-category-desc": "Sida vert ikkje indeksert av robotar av di ho inneheld trylleordet <code><nowiki>__NOINDEX__</nowiki></code> og er i eit namnerom der dette flagget er tillate.",
        "mailnologin": "Inga avsendaradresse",
        "mailnologintext": "Du lyt vera [[Special:UserLogin|innlogga]] og ha ei gyldig e-postadresse sett i [[Special:Preferences|brukarinnstillingane]] for å sende e-post åt andre brukarar.",
        "emailuser": "Send e-post åt denne brukaren",
        "version-hook-subscribedby": "Brukt av",
        "version-version": "(versjon $1)",
        "version-license": "Lisens",
+       "version-ext-colheader-credits": "Forfattarar",
        "version-poweredby-credits": "Denne wikien er driven av '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
        "version-poweredby-others": "andre",
        "version-poweredby-translators": "translatewiki.net-omsetjarar",
        "redirect-lookup": "Sjå etter:",
        "redirect-value": "Verdi",
        "redirect-user": "Brukar-ID",
+       "redirect-page": "Side-ID",
        "redirect-revision": "Sideversjon",
        "redirect-file": "Filnamn",
        "redirect-not-exists": "Fann ikkje verdi",
        "dberr-problems": "Nettstaden har tekniske problem.",
        "dberr-again": "Venta nokre minutt og last sida inn på nytt.",
        "dberr-info": "(Kan ikkje kontakta databasetenaren: $1)",
+       "dberr-info-hidden": "(får ikkje kontakt med databasetenaren)",
        "dberr-usegoogle": "Du kan søkja gjennom Google i mellomtida.",
        "dberr-outofdate": "Merk at versjonane deira av innhaldet vårt kan vera forelda.",
        "dberr-cachederror": "Dette er ein mellomlagra kopi av den etterspurde sida og er mogelegvis ikkje den gjeldande versjonen av henne.",
        "expand_templates_input": "Inntekst:",
        "expand_templates_output": "Resultat",
        "expand_templates_xml_output": "XML-resultat",
+       "expand_templates_html_output": "Rå HTML-utdata",
        "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "Fjern kommentarar",
        "expand_templates_remove_nowiki": "Ikkje vis <nowiki>-merke i resultatet",
        "expand_templates_generate_xml": "Vis parsertre som XML",
+       "expand_templates_generate_rawhtml": "Vis rå HTML",
        "expand_templates_preview": "Førehandsvising"
 }
index 38ce832..a4a4cdd 100644 (file)
        "loginlanguagelabel": "ਭਾਸ਼ਾ: $1",
        "suspicious-userlogout": "ਤੁਹਾਡੀ ਵਿਦਾਇਗੀ ਦੀ ਬੇਨਤੀ ਨਕਾਰ ਦਿੱਤੀ ਗਈ ਕਿਉਂਕਿ ਲੱਗਦਾ ਹੈ ਕਿ ਇਹ ਕਿਸੇ ਟੁੱਟੇ ਹੋਏ ਬਰਾਊਜ਼ਰ ਜਾਂ ਕੈਸ਼ ਹੋਈ ਪ੍ਰਾਕਸੀ ਤੋਂ ਭੇਜੀ ਗਈ ਸੀ।",
        "createacct-another-realname-tip": "ਅਸਲੀ ਨਾਂ ਚੋਣਵਾਂ ਹੈ।\nਜੇਕਰ ਤੁਸੀਂ ਇਹ ਦਿੱਤਾ ਹੈ ਤਾਂ ਤੁਹਾਡੇ ਕੰਮ ਵਾਸਤੇ ਗੁਣ ਦੇ ਤੌਰ ਉੱਤੇ ਵਰਤਿਆ ਜਾਵੇਗਾ।",
+       "pt-login": "ਲਾਗ ਇਨ",
        "pt-login-button": "ਲਾਗ ਇਨ",
+       "pt-createaccount": "ਖਾਤਾ ਬਣਾਓ",
+       "pt-userlogout": "ਲਾਗ ਆਉਟ",
        "php-mail-error-unknown": "PHP ਦੇ ਮੇਲ() ਕਰਜ ਵਿੱਚ ਅਣਜਾਣ ਦੋਸ਼",
        "user-mail-no-addy": "ਬਿਨਾਂ ਈ-ਮੇਲ ਪਤਾ ਦਿੱਤੇ ਈ-ਮੇਲ ਭੇਜਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ।",
        "user-mail-no-body": "ਖ਼ਾਲੀ ਜਾਂ ਬਹੁਤੀ ਛੋਟੀ ਸਮੱਗਰੀ ਨਾਲ਼ ਈਮੇਲ ਭੇਜਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਗਈ",
index c69252a..f25121d 100644 (file)
        "jumptonavigation": "nawigacji",
        "jumptosearch": "wyszukiwania",
        "view-pool-error": "Niestety w chwili obecnej serwery są przeciążone.\nZbyt wielu użytkowników próbuje wyświetlić tę stronę.\nPoczekaj chwilę przed ponowną próbą dostępu do tej strony.\n\n$1",
+       "generic-pool-error": "Niestety w chwili obecnej serwery są przeciążone.\nZbyt wielu użytkowników próbuje wyświetlić tę stronę.\nPoczekaj chwilę przed ponowną próbą dostępu do tej strony.",
        "pool-timeout": "Zbyt długi czas oczekiwania na blokadę",
        "pool-queuefull": "Kolejka zadań jest pełna",
        "pool-errorunknown": "Błąd nieznany",
        "doubleredirects": "Podwójne przekierowania",
        "doubleredirectstext": "Lista zawiera strony z przekierowaniami do stron, które przekierowują do innej strony.\nKażdy wiersz zawiera linki do pierwszego i drugiego przekierowania oraz link, do którego prowadzi drugie przekierowanie. Ostatni link prowadzi zazwyczaj do strony, do której powinna w rzeczywistości przekierowywać pierwsza strona.\n<del>Skreślenie</del> oznacza naprawienie przekierowania.",
        "double-redirect-fixed-move": "Naprawa podwójnego przekierowania [[$1]] → [[$2]]",
-       "double-redirect-fixed-maintenance": "Naprawiono podwójne przekierowanie z [[$1]] do [[$2]].",
+       "double-redirect-fixed-maintenance": "Automatyczna naprawa podwójnego przekierowania podczas prac konserwacyjnych z [[$1]] na [[$2]].",
        "double-redirect-fixer": "Naprawiacz przekierowań",
        "brokenredirects": "Zerwane przekierowania",
        "brokenredirectstext": "Poniższe przekierowania wskazują na nieistniejące strony.",
index 433244a..26fffc5 100644 (file)
@@ -13,7 +13,8 @@
                        "Ævar Arnfjörð Bjarmason <avarab@gmail.com>, Jens Frank",
                        "לערי ריינהארט",
                        "Shirayuki",
-                       "아라"
+                       "아라",
+                       "Kolega2357"
                ]
        },
        "tog-underline": "Anliure con la sotliniadura",
        "pageswithprop-prophidden-binary": "valor ëd propietà binaria stërmà ($1)",
        "doubleredirects": "Ridiression dobie",
        "doubleredirectstext": "Sta pàgina-sì a a lista dle pàgine ch'a armando a d'àutre pàgine ëd ridiression.\nVira riga a l'ha andrinta j'anliure a la prima e a la sconda ridiression, ant sël pat ëd la prima riga ëd test dla seconda ridiression, che për sòlit a l'ha andrinta l'artìcol ëd destinassion vèir, col andoa che a dovrìa ëmné ëdcò la prima ridiression.\nLe ridiression <del>sganfà</del> a son stàite arzolvùe.",
-       "double-redirect-fixed-move": "[[$1]] a l'é stàit spostà.\nAdess a l'é na ridiression a [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] a l'é stàit spostà.\nA l'é stàit agiornà an automàtich e adess a l'é na ridiression a [[$2]].",
        "double-redirect-fixed-maintenance": "Rangé le ridiression dobie da [[$1]] a [[$2]].",
        "double-redirect-fixer": "Coretor ëd ridiression",
        "brokenredirects": "Ridiression nen giuste",
        "cantrollback": "As peul pa tornesse a na version pì veja: l'ùltima modìfica a l'ha fala l'ùnich utent che a l'abia travajà a cost artìcol-sì.",
        "alreadyrolled": "As peulo pa anulé j'ultime modìfiche ëd [[:$1]] fàite da [[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\ncheidun d'àutr a l'ha già modificà ò pura anulà le modìfiche a sta pàgina-sì.\n\nL'ùltima modìfica a la pàgina a l'é stàita fàita da [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Ël coment dla modìfica a l'era: \"''$1''\".",
-       "revertpage": "Gavà via le modìfiche ëd [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]); ël contnù a l'é stàit tirà andarè a l'ùltima version dl'utent [[User:$1|$1]]",
+       "revertpage": "Gavà via le modìfiche ëd [[Special:Contributions/$2|$2]] ([[User talk:$2|ciaciarade]]), ël contnù a l'é stàit tirà andaré a l'ùltima version dl'utent [[User:$1|$1]]",
        "revertpage-nouser": "Révoca dle modìfiche da part ëd n'utent ëstërmà a l'ùltima version ëd {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Modìfiche anulà da $1; tirà andré a l'ùltima version da $2.",
        "sessionfailure-title": "Eror ëd session",
index fdcfa35..1a4e7f5 100644 (file)
        "jumptonavigation": "Part of the \"jump to\" navigation links. Hidden by default in monobook skin. The format is: [[MediaWiki:Jumpto/{{SUBPAGENAME}}|{{int:jumpto}}]] {{int:jumptonavigation}}, [[MediaWiki:Jumptosearch/{{SUBPAGENAME}}|{{int:jumptosearch}}]].\n\n{{Identical|Navigation}}",
        "jumptosearch": "Part of the \"jump to\" navigation links. Hidden by default in monobook skin. The format is: [[MediaWiki:Jumpto/{{SUBPAGENAME}}|{{int:jumpto}}]] [[MediaWiki:Jumptonavigation/{{SUBPAGENAME}}|{{int:jumptonavigation}}]], {{int:jumptosearch}}.\n\n{{Identical|Search}}",
        "view-pool-error": "Error message. Parameters:\n* $1 - probably unused",
+       "generic-pool-error": "Error message",
        "pool-timeout": "Part of {{msg-mw|view-pool-error}}.\n\nFor explanation of 'lock' see [[w:Lock_(computer_science)|wikipedia]].",
        "pool-queuefull": "Part of {{msg-mw|view-pool-error}}\n\n\"Pool\" refers to a pool of processes.",
        "pool-errorunknown": "Part of {{msg-mw|view-pool-error}}.\n{{Identical|Unknown error}}",
        "invalid-content-data": "Error message indicating that the page's content can not be saved because it is invalid. This may occurr for content types with internal consistency constraints.",
        "content-not-allowed-here": "Error message indicating that the desired content model is not supported in given localtion.\n* $1 - the human readable name of the content model: {{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}\n* $2 - the title of the page in question",
        "editwarning-warning": "Uses {{msg-mw|Prefs-editing}}",
-       "editpage-notsupportedcontentformat-title": "Title of error page shown when using an incompatible format on EditPage",
-       "editpage-notsupportedcontentformat-text": "Error message shown when using an incompatible format on EditPage. Parameters:\n* $1 - the format id\n* $2 - the content model name",
+       "editpage-notsupportedcontentformat-title": "Title of error page shown when using an incompatible format on EditPage.\n\nUsed as title for the following error message:\n* {{msg-mw|Editpage-notsupportedcontentformat-text}}.",
+       "editpage-notsupportedcontentformat-text": "Error message shown when using an incompatible format on EditPage.\n\nThe title for this error is {{msg-mw|Editpage-notsupportedcontentformat-title}}.\n\nParameters:\n* $1 - the format id\n* $2 - the content model name",
        "content-model-wikitext": "Name for the wikitext content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
        "content-model-text": "Name for the plain text content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}\n{{Identical|Plain text}}",
        "content-model-javascript": "Name for the JavaScript content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
        "previousrevision": "See also:\n* {{msg-mw|Nextrevision}}",
        "nextrevision": "See also:\n* {{msg-mw|Previousrevision}}",
        "currentrevisionlink": "{{Identical|Current revision}}",
-       "cur": "Link in page history",
+       "cur": "Link in page history ([https://translatewiki.net/w/i.php?title=MediaWiki:Cur/qqq&action=history example])",
        "next": "Link in page history\n\n{{Identical|Next}}",
        "last": "Link in page history\n\n{{Identical|Last}}",
        "page_first": "This is part of the navigation message on the top and bottom of Special pages which are lists of things in alphabetical order, e.g. the '[[Special:Categories|Categories]]' special page. It is followed by the message {{msg-mw|Viewprevnext}}.\n{{Identical|First}}",
        "group": "{{Identical|Group}}",
        "group-user": "{{doc-group|user}}\n{{Identical|User}}",
        "group-autoconfirmed": "{{doc-group|autoconfirmed}}\nOn Wikimedia sites autoconfirmed users are users which are older than 4 days. After those 4 days, they have more rights.",
-       "group-bot": "{{doc-group|bot}}",
-       "group-sysop": "{{doc-group|sysop}}",
+       "group-bot": "{{doc-group|bot}}\n{{Identical|Bot}}",
+       "group-sysop": "{{doc-group|sysop}}\n{{Identical|Administrator}}",
        "group-bureaucrat": "{{doc-group|bureaucrat}}",
        "group-suppress": "{{doc-group|suppress}}\nThis is an optional (disabled by default) user group, meant for the [[mw:RevisionDelete|RevisionDelete]] feature, to change the visibility of revisions through [[Special:RevisionDelete]].\n\n{{Identical|Oversight}}",
        "group-all": "The name of the user group that contains all users, including anonymous users\n\n{{Identical|All}}",
        "recentchanges-legend-plusminus": "{{optional}}\nA plus/minus sign with a number for the legend.",
        "rcnotefrom": "This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.\n\nThe corresponding message is {{msg-mw|Rclistfrom}} (split into date and time).\n\nParameters:\n* $1 - the maximum number of changes that are displayed\n* $2 - a date and time\n* $3 - (Optional) a date\n* $4 - (Optional) a time",
        "rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - (Currently not use) date and time. The date and the time adds to the rclistfrom description.\n* $2 - time. The time adds to the rclistfrom link description (with split of date and time).\n* $3 - date. The date adds to the rclistfrom link description (with split of date and time).\n\nThe corresponding message is {{msg-mw|Rcnotefrom}}.",
-       "rcshowhideminor": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhideminor-show}} or {{msg-mw|rcshowhideminor-hide}}",
+       "rcshowhideminor": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhideminor-show}} or {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Minor edit}}",
        "rcshowhideminor-show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideminor}}.\n\nSee also:\n* {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Show}}",
        "rcshowhideminor-hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]] in conjunction with {{msg-mw|rcshowhideminor}}.\n\nSee also:\n* {{msg-mw|rcshowhideminor-show}}\n{{Identical|Hide}}",
        "rcshowhidebots": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhidebots-show}} or {{msg-mw|rcshowhidebots-hide}}\n{{Identical|$1 bots}}",
        "statistics-articles": "Used in [[Special:Statistics]].\n\nA 'content page' is a page that forms part of the purpose of the wiki. It includes the main page and pages in the main namespace and any other namespaces that are included when the wiki is customised. For example on Wikimedia Commons 'content pages' include pages in the file and category namespaces. On Wikinews 'content pages' include pages in the Portal namespace. For technical definition of 'content namespaces' see [[mw:Manual:Using_custom_namespaces#Content_namespaces|MediaWiki]].\n\nPossible alternatives to the word 'content' are 'subject matter' or 'wiki subject' or 'wiki purpose'.\n\n{{Identical|Content page}}",
        "statistics-pages": "Used in [[Special:Statistics]]\n{{Identical|Page}}",
        "statistics-pages-desc": "Tooltip shown over ''Pages'' (or as a note below it) in [[Special:Statistics]]",
-       "statistics-files": "Used in [[Special:Statistics]]",
+       "statistics-files": "Used in [[Special:Statistics]].\n{{Identical|Uploaded file}}",
        "statistics-edits": "Used in [[Special:Statistics]]",
        "statistics-edits-average": "Used in [[Special:Statistics]]",
        "statistics-views-total": "Used in [[Special:Statistics]]",
        "pageinfo-templates": "The list of templates transcluded within the page. Parameters:\n* $1 is the number of templates transcluded within the current page.\nSee also:\n* {{msg-mw|Pageinfo-transclusions}}",
        "pageinfo-transclusions": "The list of pages on which this page is transcluded. Parameters:\n* $1 is the number of pages the current page is transcluded on.\nSee also:\n* {{msg-mw|Pageinfo-templates}}",
        "pageinfo-footer": "{{ignored}}Custom text for the bottom of the info page (action=info).",
-       "pageinfo-toolboxlink": "Information link for the page (like 'What links here', but to action=info for the current page instead)",
+       "pageinfo-toolboxlink": "Information link for the page (like \"What links here\", but to action=info for the current page instead).\n{{Identical|Page information}}",
        "pageinfo-redirectsto": "Key for the row shown if this page is a redirect. Verb. See [{{canonicalurl:w:Main_page|action=info}} example].",
        "pageinfo-redirectsto-info": "Text to put in parentheses for the link to the action=info of the redirect target.\n{{Identical|Info}}",
        "pageinfo-contentpage": "Key for the row shown on [{{fullurl:News|action=info}} action=info] if this page is [[mw:Manual:Article count|counted as a content page]]",
        "file-no-thumb-animation": "We cannot animate thumbnails of this file.\n\nThis notice is shown on the image description page on animated svg files just below {{msg-mw|File-info-size}}.\n\nThis message may be overridden by a more specific message:\n* {{msg-mw|File-no-thumb-animation-gif}}.",
        "file-no-thumb-animation-gif": "Cannot animate thumbnails of this gif file, because it has too big a resolution. The cut off resolution can vary between wikis ([[mw:manual:$wgMaxAnimatedGifArea|$wgMaxAnimatedGifArea]]). Note that resolution is calculated as width times height times number of frames. See {{msg-mw|file-no-thumb-animation}}.",
        "newimages": "Page title of [[Special:NewImages]].",
+       "newimagestext": "Text in [[Special:NewImages]].",
        "imagelisttext": "This is text on [[Special:NewImages]]. Parameters:\n* $1 - the number of files\n* $2 - the message {{msg-mw|Bydate}}",
        "newimages-summary": "This message is displayed at the top of [[Special:NewImages]] to explain what is shown on that special page.",
        "newimages-legend": "Caption of the fieldset for the filter on [[Special:NewImages]]\n\n{{Identical|Filter}}",
        "metadata-help": "This message is followed by a table with metadata.",
        "metadata-expand": "On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on this link, you can see more data and information. For the link to hide back the less important data, see {{msg-mw|Metadata-collapse}}.",
        "metadata-collapse": "On an image description page, there is mostly a table containing data (metadata) about the image. The most important data are shown, but if you click on the link {{msg-mw|Metadata-expand}}, you can see more data and information. This message is for the link to hide back the less important data.",
-       "metadata-fields": "{{doc-important|覅翻译列表项,只翻译上头个文本!畀 \"<code>* make</code>\" 搭别个列表项正确保留。}}\nThe sentences are for explanation only and are not shown to the user.",
+       "metadata-fields": "{{doc-important|Do not translate list items, only translate the text! So leave \"<code>* make</code>\" and the other items exactly as they are.}}\nThe sentences are for explanation only and are not shown to the user.",
        "metadata-langitem": "{{optional}}\nThis is used for constructing the list of translations when a metadata property is translated into multiple languages.\n\nParameters:\n* $1 - the value of the property (in one language)\n* $2 - the language name that this translation is for (or language code if language name cannot be determined)\n* $3 - (Unused) the language code",
        "metadata-langitem-default": "{{optional}}\nSimilar to \"metadata-langitem\" but for the case where a multilingual property has a default specified that does not specify what language the default is in. $1 is the value of the property.",
        "exif-imagewidth": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Width}}",
        "exif-componentsconfiguration": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThis contains how the information in the picture is stored. This is most commonly Y, Cr, Cb to specify luma, red, blue. RGB is also possible to specify Red, Green, Blue.\n{{Related|Exif-componentsconfiguration}}",
        "exif-compressedbitsperpixel": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
        "exif-pixelydimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image width}}",
-       "exif-pixelxdimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].",
+       "exif-pixelxdimension": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n{{Identical|Image height}}",
        "exif-usercomment": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nComments by user. Sometimes used like ImageDescription when the ImageDescription contained non-ascii characters. (Technically ImageDescription is supposed to contain ascii characters. In practise utf-8 is used in ImageDescription, so this field isn't used too much.)",
        "exif-relatedsoundfile": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nSome cameras offer the option to record an audio \"memo\" for the photo they just took. If the user did that, the name of the file is labelled with this message.",
        "exif-datetimeoriginal": "Exif is a format for storing metadata in image files. See this [[w:Exchangeable_image_file_format|Wikipedia article]] and the example at the bottom of [[commons:File:Phalacrocorax-auritus-020.jpg|this page on Commons]]. The tags are explained [http://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif.html briefly] and [http://www.kodak.com/global/plugins/acrobat/en/service/digCam/exifStandard2.pdf in further detail].\n\nThe date and time when the original image data was generated. For example if it was a painting from 1773, scanned in to a computer in 2007, the datetimeoriginal would be 1773 and {{msg-mw|exif-datetimedigitized}} would have the 2007 date.",
index ae8cb0d..77a8d04 100644 (file)
        "jumptonavigation": "navigare",
        "jumptosearch": "căutare",
        "view-pool-error": "Ne pare rău, dar serverele sunt supraîncărcare în acest moment.\nPrea mulți utilizatori încearcă să vizualizeze această pagină.\nVă rugăm să așteptați un moment înainte de a reîncerca accesarea paginii.\n\n$1",
+       "generic-pool-error": "Ne pare rău, dar serverele sunt supraîncărcate în acest moment.\nPrea mulți utilizatori încearcă să vizualizeze această resursă.\nVă rugăm să așteptați un moment înainte de a reîncerca accesarea acestei resurse.",
        "pool-timeout": "Timpul alocat așteptării pentru blocare a expirat",
        "pool-queuefull": "Coada de așteptare este plină",
        "pool-errorunknown": "Eroare necunoscută",
        "pageswithprop-prophidden-binary": "valoarea proprietății binare ascunsă ($1)",
        "doubleredirects": "Redirecționări duble",
        "doubleredirectstext": "Această listă conține pagini care redirecționează la alte pagini de redirecționare.\nFiecare rând conține legături la primele două redirecționări, precum și ținta celei de-a doua redirecționări, care este de obicei pagina țintă \"reală\", către care ar trebui să redirecționeze prima pagină.\nIntrările <del>tăiate</del> au fost rezolvate.",
-       "double-redirect-fixed-move": "[[$1]] a fost mutat, acum este un redirect către [[$2]]",
-       "double-redirect-fixed-maintenance": "Reparat dubla redirecționare de la [[$1]] înspre [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] a fost redenumită.\nA fost actualizată automat, iar acum redirecționează către [[$2]].",
+       "double-redirect-fixed-maintenance": "Reparat în mod automat dubla redirecționare de la [[$1]] înspre [[$2]] în cadrul sarcinii de mentenanță.",
        "double-redirect-fixer": "Corector de redirecționări",
        "brokenredirects": "Redirecționări greșite",
        "brokenredirectstext": "Următoarele redirecționări conduc spre articole inexistente:",
        "tooltip-pt-watchlist": "Lista paginilor pe care le monitorizați",
        "tooltip-pt-mycontris": "Listă de contribuții",
        "tooltip-pt-login": "Sunteți încurajat să vă autentificați, deși acest lucru nu este obligatoriu.",
-       "tooltip-pt-logout": "Închideți sesiunea de lucru",
+       "tooltip-pt-logout": "Închide sesiunea de lucru",
        "tooltip-ca-talk": "Discuții despre această pagină",
        "tooltip-ca-edit": "Puteți modifica această pagină. Înainte de a o salva vă rugăm s-o previzualizați.",
        "tooltip-ca-addsection": "Adaugă o nouă secțiune.",
index f1e0d7e..56e5d9c 100644 (file)
        "jumptonavigation": "навигация",
        "jumptosearch": "поиск",
        "view-pool-error": "Извините, сейчас серверы перегружены.\nПоступило слишком много запросов на просмотр этой страницы.\nПожалуйста, подождите и повторите попытку обращения к странице позже.\n\n$1",
+       "generic-pool-error": "Извините, в настоящий момент серверы перегружены.\nСлишком много пользователей пытаются просмотреть этот ресурс.\nПожалуйста, подождите и повторите попытку обращения к нему позже.",
        "pool-timeout": "Истекло время ожидания блокировки",
        "pool-queuefull": "Накопитель запросов полон",
        "pool-errorunknown": "Неизвестная ошибка",
        "prefs-dateformat": "Формат даты",
        "prefs-timeoffset": "Смещение поясного времени",
        "prefs-advancedediting": "Общие параметры",
-       "prefs-editor": "редактор",
-       "prefs-preview": "предварительный просмотр",
+       "prefs-editor": "Редактор",
+       "prefs-preview": "Ð\9fредварительный просмотр",
        "prefs-advancedrc": "Расширенные настройки",
        "prefs-advancedrendering": "Расширенные настройки",
        "prefs-advancedsearchoptions": "Расширенные настройки",
index 4f238bf..f20b904 100644 (file)
@@ -25,7 +25,7 @@
        "tog-newpageshidepatrolled": "Skauk patrolled pages frae the new page leet",
        "tog-extendwatchlist": "Mak watchleet bigger tae shaw aw chynges, no just the maist recent",
        "tog-usenewrc": "Groop chynges bi page in recent chynges n watchleet",
-       "tog-numberheadings": "Auto-nummer heidins",
+       "tog-numberheadings": "Autæ-nummer heidins",
        "tog-showtoolbar": "Shaw eidit tuilbaur",
        "tog-editondblclick": "Eidit pages oan dooble-clap (JavaScript)",
        "tog-editsectiononrightclick": "Enable section editin bi richt-clapin on section teitles",
        "tog-watchdefault": "Eik pages n files that Ah eedit til ma watchleet",
        "tog-watchmoves": "Eik pages n files that Ah muiv til ma watchleet",
        "tog-watchdeletion": "Eik pages n files that Ah get rid o til ma watchleet",
-       "tog-minordefault": "Mairk aa edits \"smaa\" bi defaut",
+       "tog-minordefault": "Mairk aa eedits \"smaa\" bi defaut",
        "tog-previewontop": "Shaw luikower afore eedit kist n naw efter it",
        "tog-previewonfirst": "Shaw luikower oan firstwhile eidit",
        "tog-enotifwatchlistpages": "Wab-mail me whan ae page or file on ma watchleet is chynged",
        "tog-enotifusertalkpages": "Send me ae wab-mail whan ma uiser tauk page is chynged",
        "tog-enotifminoredits": "Send me ae wab-mail fer wee eedits o pages n files ava",
        "tog-enotifrevealaddr": "Shaw ma email address in notification mails",
-       "tog-shownumberswatching": "Shaw the nummer o watching uisers",
+       "tog-shownumberswatching": "Shaw the nummer o watchin uisers",
        "tog-oldsig": "Exeestin signatur:",
        "tog-fancysig": "Treat signature as wikitext (wioot aen autæmatic airtin)",
        "tog-uselivepreview": "Uise live luik ower (experimental)",
@@ -51,7 +51,7 @@
        "tog-watchlisthideliu": "Skauk eidits bi loggit in uisers fae the watchleet",
        "tog-watchlisthideanons": "Skauk eidits bi nameless uisers fae the watchleet",
        "tog-watchlisthidepatrolled": "Skauk patrolled eidits fae the watchleet",
-       "tog-ccmeonemails": "Gie me copies o emails A write tae ither uisers",
+       "tog-ccmeonemails": "Gie me copies o emails Ah write tae ither uisers",
        "tog-diffonly": "Dinna shaw page contents ablo diffs",
        "tog-showhiddencats": "Shaw Skauk't categeries",
        "tog-norollbackdiff": "Lave oot diff efter rowin back",
@@ -68,7 +68,7 @@
        "monday": "Monanday",
        "tuesday": "Tysday",
        "wednesday": "Wadensday",
-       "thursday": "Fuirsday",
+       "thursday": "Thursday",
        "friday": "Fryday",
        "saturday": "Setturday",
        "sun": "Sun",
@@ -89,7 +89,7 @@
        "september": "September",
        "october": "October",
        "november": "November",
-       "december": "December",
+       "december": "Dizember",
        "january-gen": "Januair",
        "february-gen": "Febuair",
        "march-gen": "Mairch",
        "october-date": "$1 October",
        "november-date": "$1 November",
        "december-date": "$1 Dezember",
-       "pagecategories": "{{PLURAL:$1|Category|Categories}}",
-       "category_header": "Pages in category \"$1\"",
-       "subcategories": "Subcategories",
-       "category-media-header": "Eetems in category \"$1\"",
-       "category-empty": "''This category haes no pages or eetems at the meenit.''",
+       "pagecategories": "{{PLURAL:$1|Categerie|Categeries}}",
+       "category_header": "Pages in categerie \"$1\"",
+       "subcategories": "Subcategeries",
+       "category-media-header": "Eetems in categerie \"$1\"",
+       "category-empty": "''This categerie haes nae pages or media at the meenit.''",
        "hidden-categories": "{{PLURAL:$1|Skauk't categerie|Skauk't categeries}}",
        "hidden-category-category": "Skauk't cætegories",
-       "category-subcat-count": "{{PLURAL:$2|This category juist haes the follaein subcategory.|This category haes the follaein {{PLURAL:$1|subcategory|$1 subcategories}}, oot o $2 awthegither.}}",
-       "category-subcat-count-limited": "This category haes the follaein {{PLURAL:$1|subcategory|$1 subcategories}}.",
-       "category-article-count": "{{PLURAL:$2|This category contains the ae follaein page.|The follaein {{PLURAL:$1|page|$1 pages}} is in this category, oot o $2 total.}}",
-       "category-article-count-limited": "The follaein {{PLURAL:$1|page|$1 pages}} is in this category.",
-       "category-file-count": "{{PLURAL:$2|This category hauds juist the ae follaein file.|The follaein {{PLURAL:$1|file|$1 files}}s is in this category, oot o $2 total.}}",
-       "category-file-count-limited": "The follaein {{PLURAL:$1|file is|$1 files is}} in this category.",
+       "category-subcat-count": "{{PLURAL:$2|This categerie juist haes the follaein subcategerie.|This categerie haes the follaein {{PLURAL:$1|subcategerie|$1 subcategeries}}, oot o $2 awthegither.}}",
+       "category-subcat-count-limited": "This categerie haes the follaein {{PLURAL:$1|subcategerie|$1 subcategeries}}.",
+       "category-article-count": "{{PLURAL:$2|This categerie contains the ae follaein page.|The follaein {{PLURAL:$1|page|$1 pages}} is in this categerie, oot o $2 awthegither.}}",
+       "category-article-count-limited": "The follaein {{PLURAL:$1|page|$1 pages}} is in this categerie.",
+       "category-file-count": "{{PLURAL:$2|This categerie hauds juist the ae follaein file.|The follaein {{PLURAL:$1|file|$1 files}}s is in this category, oot o $2 awthegither.}}",
+       "category-file-count-limited": "The follaein {{PLURAL:$1|file is|$1 files ar}} in this categerie.",
        "listingcontinuesabbrev": "cont.",
        "index-category": "Index't pages",
        "noindex-category": "Noindexed pages",
        "broken-file-category": "Pages wi broken file links",
-       "about": "Aboot",
+       "about": "Aneat",
        "article": "Content page",
-       "newwindow": "(opens in new windae)",
+       "newwindow": "(apens in new windae)",
        "cancel": "Cancel",
        "moredotdotdot": "Mair...",
        "morenotlisted": "This leet isna complete.",
        "anontalk": "Tauk fer this IP address",
        "navigation": "Navigation",
        "and": "&#32;n",
-       "qbfind": "Rake",
+       "qbfind": "Fynd",
        "qbbrowse": "Brouse",
        "qbedit": "Eidit",
        "qbpageoptions": "This page",
        "qbmyoptions": "Ma pages",
-       "faq": "ASQ",
-       "faqpage": "Project:ASQ",
+       "faq": "ASS",
+       "faqpage": "Project:ASS",
        "vector-action-addsection": "Eik topic",
        "vector-action-delete": "Delyte",
        "vector-action-move": "Muiv",
        "vector-action-protect": "Fend",
        "vector-action-undelete": "Ondelyte",
        "vector-action-unprotect": "Chynge protection",
-       "vector-view-create": "Mak",
+       "vector-view-create": "Ceaut",
        "vector-view-edit": "Eedit",
        "vector-view-history": "See histerie",
        "vector-view-view": "Read",
        "navigation-heading": "Navigâtion menu",
        "errorpagetitle": "Mistak",
        "returnto": "Return til $1.",
-       "tagline": "Frae {{SITENAME}}",
+       "tagline": "Fae {{SITENAME}}",
        "help": "Help",
        "search": "Rake",
        "searchbutton": "Rake",
        "searcharticle": "Gang",
        "history": "Page histerie",
        "history_short": "Histerie",
-       "updatedmarker": "chynged sin ma hindermast visit",
+       "updatedmarker": "updatit sin ma hintmast visit",
        "printableversion": "Prent version",
        "permalink": "Permanent airtin",
        "print": "Prent",
        "view": "See",
        "edit": "Eedit",
-       "create": "Mak",
+       "create": "Ceaut",
        "editthispage": "Eedit this page",
-       "create-this-page": "Mak this page",
+       "create-this-page": "Creaut this page",
        "delete": "Delyte",
        "deletethispage": "Delyte this page",
        "undeletethispage": "Ondelyte this page",
        "categorypage": "See categerie page",
        "viewtalkpage": "See tauk",
        "otherlanguages": "In ither leids",
-       "redirectedfrom": "(Reguidit frae $1)",
+       "redirectedfrom": "(Reguidit fae $1)",
        "redirectpagesub": "Reguidal page",
-       "lastmodifiedat": "This page wis hindermaist chynged $2, $1.",
-       "viewcount": "This page haes been accesst $1 {{PLURAL:$1|once|$1 times}}.",
+       "lastmodifiedat": "This page wis hintmaist chynged oan $2, $1.",
+       "viewcount": "This page haes been accesst $1 {{PLURAL:$1|yince|$1 times}}.",
        "protectedpage": "Protectit page",
        "jumpto": "Jump til:",
        "jumptonavigation": "navigation",
        "pool-queuefull": "Pool line is ful",
        "pool-errorunknown": "Onknawn mistak.",
        "pool-servererror": "The puil coonter service is na available ($1).",
-       "aboutsite": "Aboot {{SITENAME}}",
-       "aboutpage": "Project:Aboot",
+       "aboutsite": "Aneat {{SITENAME}}",
+       "aboutpage": "Project:Aneat",
        "copyright": "Content is available unner $1 onless itherwise noted.",
-       "copyrightpage": "{{ns:project}}:Copyrichts",
+       "copyrightpage": "{{ns:project}}:Copierichts",
        "currentevents": "Gaun oan the nou",
        "currentevents-url": "Project:Gaun oan the nou",
        "disclaimers": "Disclamation",
        "disclaimerpage": "Project:General_disclamation",
-       "edithelp": "Editin help",
+       "edithelp": "Eeditin help",
        "mainpage": "Main Page",
        "mainpage-description": "Main Page",
-       "policy-url": "Project:Policy",
+       "policy-url": "Project:Policie",
        "portal": "Commonty yett",
        "portal-url": "Project:Commonty Yett",
-       "privacy": "Privacy policy",
-       "privacypage": "Project:Privacy policy",
-       "badaccess": "Permeission mishanter",
+       "privacy": "Preevacie policie",
+       "privacypage": "Project:Privacie policie",
+       "badaccess": "Permeession mistak",
        "badaccess-group0": "Ye'r no permited tae dae whit ye hae requestit!",
        "badaccess-groups": "The action that ye hae requestit is leemitit til uisers in {{PLURAL:$2|the groop|yin o the groops}}: $1.",
        "versionrequired": "Version $1 o MediaWiki needit",
-       "versionrequiredtext": "Version $1 o MediaWiki is requirit tae uise this page. Tak a keek at the [[Special:Version|version page]].",
+       "versionrequiredtext": "Version $1 o MediaWiki is needit tae uise this page. Tak ae keek at the [[Special:Version|version page]].",
        "ok": "Okay",
-       "retrievedfrom": "Taen frae \"$1\"",
-       "youhavenewmessages": "Ye hae $1 ($2).",
+       "retrievedfrom": "Taen fae \"$1\"",
+       "youhavenewmessages": "{{PLURAL:$3|Ye hae}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Ye hae}} $1 fae {{PLURAL:$3|anither uiser|$3 uisers}} ($2).",
        "youhavenewmessagesmanyusers": "Ye hae $1 fae moni uisers ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|ae new message|999=new messages}}",
        "editsectionhint": "Eedit section: $1",
        "toc": "Contents",
        "showtoc": "shaw",
-       "hidetoc": "scouk",
+       "hidetoc": "skauk",
        "collapsible-collapse": "Collapse.",
        "collapsible-expand": "Mak mair muckle",
        "thisisdeleted": "See or restore $1?",
        "viewdeleted": "See $1?",
        "restorelink": "{{PLURAL:$1|yin delytit eidit|$1 delytit eidits}}",
        "feedlinks": "Feed:",
-       "feed-invalid": "This feeds subscrieve's teep isnae habile.",
-       "feed-unavailable": "Syndication feeds isna available",
+       "feed-invalid": "Onhebile subscreeption feed type.",
+       "feed-unavailable": "Syndication feeds arna available",
        "site-rss-feed": "$1 RSS Feed",
        "site-atom-feed": "$1 Atom Feed",
        "page-rss-feed": "\"$1\" RSS Feed",
        "sort-ascending": "Sort ascending.",
        "nstab-main": "Page",
        "nstab-user": "Uiser page",
-       "nstab-media": "Eetem page",
+       "nstab-media": "Media page",
        "nstab-special": "Byordinar page",
        "nstab-project": "Waurk page",
        "nstab-image": "Eemage",
        "nstab-mediawiki": "Message",
        "nstab-template": "Template",
        "nstab-help": "Help page",
-       "nstab-category": "Category",
+       "nstab-category": "Categerie",
        "nosuchaction": "Nae sic action",
        "nosuchactiontext": "The action speceefieed bi the URL isna recognised\nYe micht hae mistyped the URL, or follaed ae wrang link\nThis micht forby be caused bi ae bug in the saffware uised bi {{SITENAME}}.",
        "nosuchspecialpage": "Nae sic byordinar page",
        "missing-article": "The database didna fynd the tex o ae page that it shid hae foond, cawed \"$1\" $2.\n\nMaistlie this is caused bi follaein aen ootdated diff or histerie airtin til ae page that's been delytit.\n\nGif this isna the case, ye micht hae foond ae bug in the saffware.\nPlease lat aen [[Special:ListUsers/sysop|admeenistrater]] ken aneat this, makin ae myndin o the URL.",
        "missingarticle-rev": "(reveesion#: $1)",
        "missingarticle-diff": "(Diff: $1, $2)",
-       "readonly_lag": "The database haes been autaematically lockit while the sclave database servers catch up tae the maister",
-       "internalerror": "Internal mishanter",
+       "readonly_lag": "The database haes been autaematiclie lockit while the sclave database servers catch up tae the maister",
+       "internalerror": "Internal mistak",
        "internalerror_info": "Internal mistak: $1",
        "filecopyerror": "Cuidna copie file \"$1\" til \"$2\".",
        "filerenameerror": "Cuidna rename file \"$1\" til \"$2\".",
        "filedeleteerror": "Cuidna delyte file \"$1\".",
-       "directorycreateerror": "Culdnae mak directory \"$1\".",
-       "filenotfound": "Cuidna fin file \"$1\".",
+       "directorycreateerror": "Couldna creat directerie \"$1\".",
+       "filenotfound": "Coudna fynd file \"$1\".",
        "unexpected": "Vailyie isnae expectit: \"$1\"=\"$2\".",
        "formerror": "Mistak: cuidna haun in form",
        "badarticleerror": "This action canna be duin tae this page.",
        "cannotdelete-title": "Canna delyte page \"$1\"",
        "delete-hook-aborted": "Delytion stappit bi huik.\nIt gae nae explanâtion.",
        "no-null-revision": "Coudna mak new null reveesion fer page \"$1\"",
-       "badtitle": "Bad teitle",
+       "badtitle": "Bad teetle",
        "badtitletext": "The requestit page teitle wis onvalid, tuim, or ae wranglie airtit inter-leid or inter-wiki teitle. It micht contain yin or mair chairacters that canna be uised in teitles.",
        "perfcached": "The follaein data is cached n michtna be richt up til date. Ae maist muckle o {{PLURAL:$1|yin result is|$1 results ar}} available in the cache.",
        "perfcachedts": "The follaein data is cached, n wis hindermaist updated $1. Ae maist muckkle o {{PLURAL:$4|yin result is|$4 results ar}} available in the cache.",
-       "querypage-no-updates": "Updates for this page ar disablit at the meenit. Data here wilnae be refreshit at the meenit.",
+       "querypage-no-updates": "Updates fer this page ar disablit at the meenit. Data here will nae be refreshit at the meenit.",
        "viewsource": "See soorce",
        "viewsource-title": "See soorce fer $1",
-       "actionthrottled": "Action devalit",
+       "actionthrottled": "Action throtlit",
        "actionthrottledtext": "Aes aen anti-spam meisur, ye'r limitit fae daein this action ower monie times in aen ower short time, n ye'v exceedit this limit. Please try again in ae few minutes.",
        "protectedpagetext": "This page haes been protected fer tae hider eeditin or ither actions.",
        "viewsourcetext": "Ye can leuk at n copie the soorce o this page:",
        "mycustomjsprotected": "Ye dinna hae permeession tae eidit this JavaScript page.",
        "myprivateinfoprotected": "Ye dinna hae permeession tae eidit yer private information.",
        "mypreferencesprotected": "Ye dinna hae permeession tae eidit yer preferences.",
-       "ns-specialprotected": "Byordinar pages canna be editit.",
+       "ns-specialprotected": "Byordinar pages canna be eeditit.",
        "titleprotected": "This teetle haes been protectit fae bein makit bi [[User:$1|$1]].\nThe groonds fer this ar: ''$2''.",
        "filereadonlyerror": "Canna modify the file \"$1\" cause the file repository \"$2\" is in read-yinly mode.\n\nThe administrater that lock't it affered this explanation: \"$3\".",
        "invalidtitle-knownnamespace": "Onvalit title wi namespace \"$2\" n tex \"$3\"",
        "logouttext": "<strong>Ye'r nou loggit oot.</strong>\n\nMynd that some pages micht continue tae be displeyed aes gif ye were still loggit in, til ye clear yer brouser cache.",
        "welcomeuser": "Weelcome, $1!",
        "welcomecreation-msg": "Yer accoont haes been cræftit.\nYe can chynge yer {{SITENAME}} [[Special:Preferences|preeferences]] gif ye like.",
-       "yourname": "Yer uiser name",
+       "yourname": "Uisername:",
        "userlogin-yourname": "Uisername",
        "userlogin-yourname-ph": "Enter yer uisername",
        "createacct-another-username-ph": "Enter the uisername",
        "userlogin-joinproject": "Jyn {{SITENAME}}",
        "nologin": "Dinna hae aen accoont? $1.",
        "nologinlink": "Cræft aen accoont",
-       "createaccount": "Mak new accoont",
+       "createaccount": "Creaut accoont",
        "gotaccount": "Awreadie hae aen accoont? $1.",
        "gotaccountlink": "Log in",
-       "userlogin-resetlink": "Forgotten yer login details?",
+       "userlogin-resetlink": "Fergotten yer login details?",
        "userlogin-resetpassword-link": "Fergot yer password?",
        "userlogin-helplink2": "Heelp wi loggin in",
        "userlogin-loggedin": "Ye'r awreadie loggit in as {{GENDER:$1|$1}}.\nUise the form ablow tae log in as anither uiser.",
        "createacct-benefit-body1": "{{PLURAL:$1|eidit|eidits}}",
        "createacct-benefit-body2": "{{PLURAL:$1|page|pages}}.",
        "createacct-benefit-body3": "recent {{PLURAL:$1|contreebuter|contreebuters}}",
-       "badretype": "The passwords ye entered disna match.",
+       "badretype": "The passwairds ye entered dinna match.",
        "userexists": "The uiser name ye entered is awreadie in uiss. Please chuise ae different name.",
-       "loginerror": "Login mishanter",
+       "loginerror": "Login mistak",
        "createacct-error": "Accoont cræftin mistak",
        "createaccounterror": "Coudna mak accoont: $1",
        "nocookiesnew": "The uiser accoont wis cræftit, but ye'r naw loggit in. {{SITENAME}} uises cookies tae log uisers in. Ye hae cookies disabled. Please enable them, than log in wi yer new uisername n passwaird.",
        "nocookieslogin": "{{SITENAME}} uises cookies tae log in uisers. Ye hae cookies disabled. Please enable thaim an gie it anither shot.",
        "nocookiesfornew": "The uiser accoont wisna cræftit, aes we couda confirm its soorce.\nEnsure that ye have cookies enabled, relaid this page n gie it anither shote.",
-       "noname": "Ye hivna specifee'd a valid uisername.",
+       "noname": "Ye'v na speceefie'd ae valid uisername.",
        "loginsuccesstitle": "Login fine",
-       "loginsuccess": "Ye're nou loggit in tae {{SITENAME}} as \"$1\".",
+       "loginsuccess": "<strong>Ye're nou loggit in tae {{SITENAME}} aes \"$1\".</strong>",
        "nosuchuser": "Thaur's nae sic uiser aes \"$1\".\nUiser names ar case-sensiteeve.\nCheck yer speelin, or [[Special:UserLogin/signup|mak ae new accoont]].",
-       "nosuchusershort": "The'r nae sic uiser as \"$1\". Check yer spellin.",
+       "nosuchusershort": "Thaur's nae sic uiser aes \"$1\". Check yer spellin.",
        "nouserspecified": "Ye hae tae merk up ae uisername.",
        "login-userblocked": "Uiser \"$1\" is blockit. Log-in naw permitit.",
-       "wrongpassword": "The password ye entered is wrang. Please gie it anither shot.",
-       "wrongpasswordempty": "The password ye entered is blank. Please gie it anither shot.",
+       "wrongpassword": "The passwaird ye entered is wrang. Please gie it anither shot.",
+       "wrongpasswordempty": "The passwaird ye entered is blank. Please gie it anither shot.",
        "passwordtooshort": "Yer password is ower short.\nIt maun hae at laest {{PLURAL:$1|1 chairacter|$1 chairacters}}.",
        "password-name-match": "Yer passwaird maun be different fae yer uisername.",
        "password-login-forbidden": "The uise o this uisername n passwaird haes been ferbidden.",
        "mailmypassword": "Reset password",
-       "passwordremindertitle": "Password reminder frae {{SITENAME}}",
+       "passwordremindertitle": "New temprie passwaird fer {{SITENAME}}",
        "passwordremindertext": "Somebodie (liklie ye, fae IP address $1) requested ae new\npasswaird fer {{SITENAME}} ($4). Ae temporarie passwaird fer uiser \"$2\" haes been cræftit n wis set til \"$3\". Gif this wis yer intent, ye will need tae log in n chuise ae new passwaird nou.\nYer temporarie passwaird will expire in {{PLURAL:$5|yin day|$5 days}}.\n\nGif some ither bodie makit this request, or gif ye hae myndit yer passwaird, n ye nae langer wish tae chynge it, ye can ignore this message n continue uisin yer auld passwaird.",
        "noemail": "Thaur's nae wab-mail address recordit fer uiser \"$1\".",
        "noemailcreate": "Ye need tae provide ae valid wab-mail address.",
-       "passwordsent": "A new password haes been sent tae the e-mail address registert for \"$1\". Please log in again efter ye receive it.",
+       "passwordsent": "Ae new passwaird haes been sent tae the e-mail address registert fer \"$1\". Please log in again efter ye get it.",
        "blocked-mailpassword": "Yer IP address is blockit fae eeditin, sae it\ncanna uise the passwaird recoverie function, for tae hinder abuiss.",
        "eauthentsent": "Ae confirmation wab-mail haes been sent til the speceefied wab-mail address.\nAfore oni ither wab-mail is sent til the accoont, ye'll hae tae follae the instructions in the wab-mail, sae as tae confirm that the accoont is reallie yers.",
        "throttled-mailpassword": "Ae password reset wab-mail haes awreadie been sent, wiin the laist {{PLURAL:$1|hoor|$1 hoors}}.\nTae hinder abuiss, yinly the yin password reset wab-mail will be sent per {{PLURAL:$1|hoor|$1 hoors}}.",
        "mailerror": "Mistak sendin mail: $1",
-       "acct_creation_throttle_hit": "Veesitors tae this wiki uisin yer IP address haev created $1 {{PLURAL:$1|accoont|accoonts}} the day, which is the maist permeettit in that lang.\nSae veesitors uisin this IP address canna mak ony mair accoonts juist noo.",
+       "acct_creation_throttle_hit": "Veesiters tae this wiki uisin yer IP address hae creautit $1 {{PLURAL:$1|accoont|accoonts}} the day, this is the maist alloued in that lang.\nSae veesiters uisin this IP address canna creaut onie mair accoonts juist nou.",
        "emailauthenticated": "Yer wab-mail address wis confirmed oan $2 at $3.",
        "emailnotauthenticated": "Yer wab-mail address isna yet confirmed.\nNae wab-mail will be sent fer oni o the follaein features.",
-       "noemailprefs": "Nae email address haes been specifee'd, the follaein featurs willna wirk.",
-       "emailconfirmlink": "Check yer e-mail address",
+       "noemailprefs": "Specifie aen email address in yer preferances fer thir featurs tae wairk.",
+       "emailconfirmlink": "Conferm yer e-mail address",
        "invalidemailaddress": "The wab-mail address canna be acceptit sin it seems tae be formattit wrang.\nPlease enter ae weel-formattit address or mak that field tuim.",
        "cannotchangeemail": "Accoont wab-mail addresses canna be chynged oan this wiki.",
        "emaildisabled": "This site canna send wab-mails.",
        "accountcreated": "Accoont cræftit",
        "accountcreatedtext": "The uiser accoont fer [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|tauk]]) haes been cræftit.",
-       "createaccount-title": "Accoont makin for {{SITENAME}}",
+       "createaccount-title": "Accoont creaution fer {{SITENAME}}",
        "createaccount-text": "Somebodie cræftit aen accoont fer yer wab-mail address oan {{SITENAME}} ($4) named \"$2\", wi passwaird \"$3\".\nYe shid log in n chynge yer passwaird nou.\n\nYe can ignore this message, gif this accoont wis cræftit bi mistak.",
        "login-throttled": "Ye'v makit ower monie recynt login attempts.\nPlease wait $1 afore giein it anither gae.",
        "login-abort-generic": "Yer login wisna successful - Aborted",
        "php-mail-error-unknown": "Onken't mistak in PHP's mail() function.",
        "user-mail-no-addy": "Tried tae send wab-mail wiout ae wab-mail address.",
        "user-mail-no-body": "Tried tae send wab-mail wi ae tuim or onreasonably short body o tex.",
-       "changepassword": "Chynge password",
+       "changepassword": "Chynge passwaird",
        "resetpass_announce": "Tae finish loggin in, ye maun set ae new passwaird.",
-       "resetpass_header": "Chynge accoont password",
+       "resetpass_header": "Chynge accoont passwaird",
        "oldpassword": "Auld passwaird",
        "newpassword": "New passwaird:",
        "retypenew": "Retype new passwaird:",
        "resetpass_submit": "Set passwaird n log in",
        "changepassword-success": "Yer passwaird chynge wis braw!",
        "changepassword-throttled": "Ye'v makit ower monie recynt login attempts.\nPlease wait $1 afore giein it anither gae.",
-       "resetpass_forbidden": "Passwords canna be chynged",
+       "resetpass_forbidden": "Passwairds canna be chynged",
        "resetpass-no-info": "Ye maun be loggit in tae access this page directly.",
        "resetpass-submit-loggedin": "Chynge passwaird",
        "resetpass-submit-cancel": "Cancel",
        "bold_tip": "Baud tex",
        "italic_sample": "Italic tex",
        "italic_tip": "Italic tex",
-       "link_sample": "Airtin teitle",
+       "link_sample": "Airtin teetle",
        "link_tip": "Internal airtin",
-       "extlink_sample": "http://www.example.com airtin teitle",
+       "extlink_sample": "http://www.example.com airtin teetle",
        "extlink_tip": "External link (mynd the http:// prefix)",
        "headline_sample": "Heidline tex",
        "headline_tip": "Level 2 heidline",
        "image_sample": "Exemplar.jpg",
        "image_tip": "Embeddit eemage",
        "media_sample": "Exemplar.ogg",
-       "media_tip": "Media file airtin",
+       "media_tip": "File airtin",
        "sig_tip": "Yer seignatur wi timestamp",
        "hr_tip": "Horizontal line (dinna ower uise)",
        "summary": "Ootline:",
-       "subject": "Subject/headline:",
+       "subject": "Subject/heidline:",
        "minoredit": "This is ae smaa eedit",
-       "watchthis": "Leuk ower this page",
+       "watchthis": "Watch this page",
        "savearticle": "Hain page",
        "preview": "Luikower",
        "showpreview": "Shaw luikower",
        "anoneditwarning": "<strong>Warnishment:</strong>Ye'r naw loggit in. Yer IP address will be recordit in this page's eedit histerie.",
        "anonpreviewwarning": "<em>Ye'r no loggit in. Hainin will record yer IP address in this page's eedit histerie.</em>",
        "missingsummary": "<strong>Mynd:</strong> Ye'v naw gien aen eedit owerview. Gif ye clap oan \"{{int:savearticle}}\" again, yer eedit will be haint wioot ane.",
-       "missingcommenttext": "Please enter a comment ablo.",
+       "missingcommenttext": "Please enter ae comment ablo.",
        "missingcommentheader": "<strong>Mynd:</strong> Ye'v na gien ae subject/heidline fer this comment.\nGif ye clap \"{{int:savearticle}}\" again, yer eedit will be hained wioot yin.",
        "summary-preview": "Ootline leuk ower:",
-       "subject-preview": "Subject/headline leuk ower:",
+       "subject-preview": "Subject/heidline leuk ower:",
        "blockedtitle": "Uiser is blockit",
        "blockedtext": "<strong>Yer uisername or IP address haes been blockit.</strong>\n\nThe block wis makit bi $1.\nThe raison gieen is <em>$2</em>.\n\n* Stairt o block: $8\n* Expirie o block: $6\n* Intended blockee: $7\n\nYe can contact $1 or anither [[{{MediaWiki:Grouppage-sysop}}|admeenistrater]] tae discuss the block.\nYe canna uise the \"wab-mail this uiser\" feature onless ae valid wab-mail address is speceefied in yer [[Special:Preferences|accoont preferences]] n ye'v naw been blockit fae uisin it.\nYer current IP address is $3, n the block ID is #$5.\nPlease incluide aw the abuin details in onie speirins that ye mak.",
        "autoblockedtext": "Yer IP address haes been autæmateeclie blockit cause it wis uised bi anither uiser that wis blockit bi $1.\nThe raison gien is:\n\n:<em>$2</em>\n\n* Stairt o block: $8\n* Expirie o block: $6\n* Intended blockee: $7\n\nYe can contact $1 or yin o the ither [[{{MediaWiki:Grouppage-sysop}}|admeenistraters]] tae discuss the block.\n\nMynd that ye canna uise the \"wab-mail this uiser\" feature onless ye hae ae valid wab-mail address registered in yer [[Special:Preferences|uiser preeferances]] n ye'v na been blockit fae uisin it.\n\nYer current IP address is $3, n the block ID is #$5.\nPlease incluid aw abuin details in onie speirins that ye mak.",
        "confirmedittext": "Ye maun confirm yer wab-mail address afore eeditin pages. Please set n validate yer wab-mail address throogh yer [[Special:Preferences|uiser settins]].",
        "nosuchsectiontitle": "Canna find section",
        "nosuchsectiontext": "Ye tried tae eedit ae section that disna exeest.\nIt micht hae been muived or delytit while ye were luikin at the page.",
-       "loginreqtitle": "Login Requirit!",
+       "loginreqtitle": "Login needit!",
        "loginreqlink": "log in",
        "loginreqpagetext": "Please $1 tae see ither pages.",
        "accmailtitle": "Passwaird sent.",
        "usercssyoucanpreview": "<strong>Tip:</strong> Uise the \"{{int:showpreview}}\" button tae test yer new CSS afore hainin.",
        "userjsyoucanpreview": "<strong>Tip:</strong> Uise the \"{{int:showpreview}}\" button tae test yer new JavaScript afore hainin.",
        "usercsspreview": "<strong>Mynd that ye'r yinly previewing yer uiser CSS.\nIt haesna been hained yet!</strong>",
-       "userjspreview": "'''Mynd that ye're juist testin/previewing yer uiser JavaScript; it haesna been hained yet!'''",
+       "userjspreview": "'''Mynd that ye're juist testin/previewin yer uiser JavaScript; it haesna been hained yet!'''",
        "sitecsspreview": "<strong>Mynd that ye'r yinly previewing this CSS.\nIt's no been hained yet!</strong>",
        "sitejspreview": "<strong>Mynd that ye'r yinly previewing this JavaScript code.\nIt's no been hained yet!</strong>",
        "userinvalidcssjstitle": "<strong>Warnishmant</strong> Thaur's na ae skin \"$1\". Mynd that yer ain .css n .js pages uise ae lowercase teetle, e.g. {{ns:user}}:Foo/vector.css in steid o {{ns:user}}:Foo/Vector.css.",
        "session_fail_preview_html": "<strong>Sairrie! We coudna process yer eedit cause o ae loss o session data.</strong>\n\n<em>Cause {{SITENAME}} haes raw HTML enabled, the owerluik is skaukt aes ae precaution again JavaScript attacks.</em>\n\n<strong>Gif this is ae legeetimate eedit attempt, please gei it anither gae.</strong>\nGif it still disna wairk, try [[Special:UserLogout|loggin oot]] n loggin back in.",
        "token_suffix_mismatch": "<strong>Yer eedit haes been rejectit cause yer client makit ae richt mess o the punctuation chairacters in the eedit token.</strong>\nThe eedit haes been rejectit tae hinder rot o the page tex.\nThis whiles happens when ye'r uisin ae broken wab-based anonymoos proxie service.",
        "edit_form_incomplete": "<strong>Some pairts o the eedit form didna reach the server; dooble-check that yer edits ar intact n gie it anither gae.</strong>",
-       "editing": "Editin $1",
+       "editing": "Eeditin $1",
        "creating": "Makin $1",
-       "editingsection": "Editin $1 (section)",
+       "editingsection": "Eeditin $1 (section)",
        "editingcomment": "Editin $1 (new section)",
        "editconflict": "Eidit conflict: $1",
        "explainconflict": "Some ither body haes chynged this page syne ye stertit eiditin it.\nThe upper tex area hauds the page tex aes it currentlie exeests.\nYer chynges is shawn in the lower tex area.\nYe'll hae tae merge yer chynges intil the exeestin tex.\n<strong>Juist</strong> the tex in the upper tex area will be hained whan ye press \"{{int:savearticle}}\".",
        "storedversion": "Storit version",
        "nonunicodebrowser": "<strong>Warnishmant: Yer brouser isna unicode compliant.</strong> Ae wairkaroond is in place tae lat ye sauflie eedit airticles: non-ASCII chairacters will kythe in the eedit kist aes hexadecimal codes.",
        "editingold": "<strong>Warnishment:</strong> Ye'r eiditin aen oot-o-date reveesion o this page. Gin ye hain it, onie chynges makit sin this reveesion will be lost.",
-       "yourdiff": "Differs",
+       "yourdiff": "Differances",
        "copyrightwarning": "Please mynd that aw contreebutions til {{SITENAME}} is conseedert tae be released unner the $2 (see $1 for details). Gif ye dinna want yer writin tae be eeditit wioot mercie n redistreebuted at will, than dinna haun it it here.<br /> Forbye thon, ye'r promisin us that ye wrat this yersel, or copied it fae ae publeec domain or siclike free resoorce. <strong>Dinna haun in copierichtit wark wioot permeession!</strong>",
        "copyrightwarning2": "Please mynd that aa contreebutions til {{SITENAME}} micht be eeditit, chynged, or remuived bi ither contreebuters.\nGin ye dinna want yer writin tae be eeditit wioot mercie n redistreebuted at will, than dinna haun it in here.<br />\nYe'r promisin us forbye that ye wrat this yersel, or copied it fae ae\npubleec domain or siclike free resoorce (see $1 fer details).\n<strong>Dinna haun in copierichtit wark wioot permeession!</strong>",
        "longpageerror": "<strong>Mistak: The tex ye'v submitted is {{PLURAL:$1|yin kilobyte|$1 kilobytes}} lang, n this is langer than the maist muckle o {{PLURAL:$2|yin kilobyte|$2 kilobytes}}.</strong>\nIt canna be hained.",
        "sectioneditnotsupported-title": "Section eiditin isna supported",
        "sectioneditnotsupported-text": "Section eiditing isna supported in this page.",
        "permissionserrors": "Permission mistak",
-       "permissionserrorstext": "Ye dinnae hae the richts tae dae that, acause o the followin {{PLURAL:$1|grund|grunds}}:",
+       "permissionserrorstext": "Ye dinnae hae the richts tae dae that, cause o the follaein {{PLURAL:$1|grund|grunds}}:",
        "permissionserrorstext-withaction": "Ye dinna hae the richts tae $2, fer the follaein {{PLURAL:$1|raison|raisons}}:",
        "recreate-moveddeleted-warn": "<strong>Warnishment: Ye'r recræftin ae page that haes been delytit.</strong>\n\nYe shid check that it is guid tae keep eeditin this page.\nThe delytion n muiv log fer this page is providit here fer conveeniance:",
        "moveddeleted-notice": "This page haes been delytit. \nThe delytion n muiv log fer the page ar gien ablo fer referance.",
        "post-expand-template-inclusion-warning": "<strong>Warnishment Template incluid size is owermuckle. \nSome templates will na be incluidit.",
        "post-expand-template-inclusion-category": "Pages whaur template include size is exceeded",
        "post-expand-template-argument-warning": "<strong>Warnishment:</strong> This page hauds at least the ae template argument that haes aen ower muckle expansion size.\nThir arguments hae been left oot.",
-       "post-expand-template-argument-category": "Pages containing omitted template arguments",
+       "post-expand-template-argument-category": "Pages containing omittit template arguments",
        "parser-template-loop-warning": "Template luip detected: [[$1]]",
        "parser-template-recursion-depth-warning": "Template recursion depth limit owershote ($1)",
        "language-converter-depth-warning": "Leid converter depth limit owershote ($1)",
        "parser-unstrip-recursion-limit": "Unstrip recursion limit owershote ($1)",
        "converter-manual-rule-error": "mistak detected in manual leid conversion rule",
        "undo-success": "The eidit can be ondun. Please check the chynges albo tae check that this is whit ye wint tae dae, n than hain the chynges albo tae be duin ondaein the eidit.",
-       "undo-failure": "The edit culdnae be undone acause o conflictin edits inatween.",
+       "undo-failure": "The eedit coudna be ondun cause o confleectin eedits inatween.",
        "undo-norev": "The eedit coudna be ondun cause it disna exeest or wis delytit.",
        "undo-nochange": "The edit appears tae hae awready been ondone.",
        "undo-summary": "Ondae reveesion $1 bi [[Special:Contributions/$2|$2]] ([[User talk:$2|Tauk]])",
        "undo-summary-username-hidden": "Ondae reveesion $1 bi ae skauk't uiser",
-       "cantcreateaccounttitle": "Canna mak accoont",
+       "cantcreateaccounttitle": "Canna creaut accoont",
        "cantcreateaccount-text": "Accoont cræftin fae this IP address ('''$1''') haes been blockit bi [[User:$3|$3]].\n\nThe raison fer this, gien bi $3 is ''$2''",
        "cantcreateaccount-range-text": "Accoont cræftin fae IP addresses in the range '''$1''', that inclædes yer IP address ('''$4'''), haes been blockit bi [[User:$3|$3]].\n\nThe raison gien bi $3 is ''$2''",
        "viewpagelogs": "Leuk at logs fer this page",
        "nextrevision": "Newer reveesion →",
        "currentrevisionlink": "Latest reveesion",
        "cur": "nou",
-       "next": "neist",
-       "last": "hind",
+       "next": "neix",
+       "last": "afore",
        "page_first": "first",
-       "page_last": "hindermaist",
+       "page_last": "hintmaist",
        "histlegend": "Diff selection: Maurk the radio kists o the reveesions tae compare n hit enter or the button at the bottom.<br />\nLegend: <strong>({{int:cur}})</strong> = differance wi laitest reveesion, <strong>({{int:last}})</strong> = differance wi preceedin reveesion, <strong>{{int:minoreditletter}}</strong> = smaa eidit.",
        "history-fieldset-title": "Brouse histerie",
        "history-show-deleted": "Delytit yinlie",
        "histfirst": "auldest",
        "histlast": "newest",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
-       "historyempty": "(empie)",
+       "historyempty": "(tuim)",
        "history-feed-title": "Reveesion histerie",
        "history-feed-description": "Reveesion histerie fer this page oan the wiki",
        "history-feed-item-nocomment": "$1 at $2",
        "history-feed-empty": "The requestit page disnae exeest.\nIt micht hae been delytit fae the wiki, or the name micht hae been chynged.\nTry [[Special:Search|rakin oan the wiki]] fer new pages ye micht be interestit in.",
        "rev-deleted-comment": "(eedit ootline remuived)",
-       "rev-deleted-user": "(uisername removit)",
+       "rev-deleted-user": "(uisername remuivit)",
        "rev-deleted-event": "(log action remuived)",
        "rev-deleted-user-contribs": "[uisername or IP address remuived - eidit skauk't fae contreebutions]",
        "rev-deleted-text-permission": "This page reveesion haes been <strong>delytit</strong>.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
        "revdel-restore": "chynge veesibeelitie",
        "pagehist": "Page histerie",
        "deletedhist": "Delytit histerie",
-       "revdelete-hide-current": "Mistak skaukin the eitem dated $2, $1: This is the current reveesion.\nIt cannna be skauk't.",
-       "revdelete-show-no-access": "Mistak shawin the eitem dated $2, $1: This eitem haes been maurked \"restreected\".\nYe dinna hae access til it.",
-       "revdelete-modify-no-access": "Mistak modifiein the eitem dated $2, $1: This eitem haes been maurked \"restreected\".\nYe dinna hae access til it.",
+       "revdelete-hide-current": "Mistak skaukin the eetem datit $2, $1: This is the nou reveesion.\nIt cannna be skauk't.",
+       "revdelete-show-no-access": "Mistak shawin the eetem datit $2, $1: This eetem haes been maurkit \"restreectit\".\nYe dinna hae access tae it.",
+       "revdelete-modify-no-access": "Mistak modifiein the eetem datit $2, $1: This eetem haes been maurkit \"restreectit\".\nYe dinna hae access tae it.",
        "revdelete-modify-missing": "Mistak modifiein item ID $1: It is missing fae the database!",
        "revdelete-no-change": "<strong>Warnishment:</strong> The eetem dated $2, $1 awreadie haed the requested veesibeelitie settins.",
-       "revdelete-concurrent-change": "Mistak modifiein the eitem dated $2, $1: Its status appears tae'v been chynged bi some ither bodie while ye attempted tae modifie it.\nPlease check the logs.",
+       "revdelete-concurrent-change": "Mistak modifiein the eetem datit $2, $1: Its status seems tae'v been chynged bi some ither bodie while ye ettled tae modifie it.\nPlease check the logs.",
        "revdelete-only-restricted": "Mistak skaukin the eetem dated $2, $1: Ye canna suppress eetems fae sicht bi admeenistraters wioot selectin yin o the ither veesibeelitie opties ava.",
        "revdelete-reason-dropdown": "*Commyn delyte raisons\n** Copiericht violation\n** Galus comment or personal information\n** Galus uisername\n** Potentiallie libelous information",
        "revdelete-otherreason": "Ither/addeetional raison:",
        "mergehistory-autocomment": "Merged [[:$1]] intil [[:$2]]",
        "mergehistory-comment": "Merged [[:$1]] intil [[:$2]]: $3",
        "mergehistory-same-destination": "Soorce n destination pages canna be the same",
-       "mergehistory-reason": "Raeson:",
+       "mergehistory-reason": "Raison:",
        "mergelog": "Merge log.",
        "pagemerge-logentry": "merged [[$1]] intil [[$2]] (reveesions up til $3)",
-       "revertmerge": "Unmerge",
+       "revertmerge": "Onmerge",
        "mergelogpagetext": "Ablow is ae leet o the maist recent merges o yin page histerie intil anither.",
        "history-title": "Reveesion histerie o \"$1\"",
        "difference-title": "Difference atween reveesions o \"$1\"",
        "diff-multi-otherusers": "({{PLURAL:$1|yin intermeediate reveesion|$1 intermeediate reveesions}} bi {{PLURAL:$2|yin ither uiser|$2 uisers}} no shawn)",
        "diff-multi-manyusers": "({{PLURAL:$1|Yin intermeediate reveesion|$1 intermeediate reveesions}} bi mair than $2 {{PLURAL:$2|uiser|uisers}} no shawn)",
        "difference-missing-revision": "{{PLURAL:$2|Yin reveesion|$2 reveesions}} o this difference ($1) {{PLURAL:$2|wis|were}} na foond.\n\nThis is usuallie caused bi follaein aen ootdated diff airtin til ae page that's been delytit.\nDetails can be foond in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} delytion log].",
-       "searchresults": "Rake results",
+       "searchresults": "Rake ootcomes",
        "searchresults-title": "Rake ootcome fer \"$1\"",
        "toomanymatches": "Ower moni matches were returned, please try ae different speirin",
-       "titlematches": "Airticle teitle matches",
+       "titlematches": "Page teetle matches",
        "textmatches": "Page tex matches",
        "notextmatches": "Nae page tex matches",
        "prevn": "foregaun {{PLURAL:$1|$1}}",
-       "nextn": "neist {{PLURAL:$1|$1}}",
-       "prevn-title": "Previous $1 {{PLURAL:$1|ootcome|ootcomes}}",
-       "nextn-title": "Next $1 {{PLURAL:$1|ootcome|ootcomes}}",
+       "nextn": "neix {{PLURAL:$1|$1}}",
+       "prevn-title": "Aforegaun $1 {{PLURAL:$1|ootcome|ootcomes}}",
+       "nextn-title": "Neix $1 {{PLURAL:$1|ootcome|ootcomes}}",
        "shown-title": "Shaw $1 {{PLURAL:$1|ootcome|ootcomes}} per page",
        "viewprevnext": "See the ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "<strong>Thaur's ae page named \"[[:$1]]\" oan this wiki.</strong> {{PLURAL:$2|0=|See the ither rake ootcomes foond aes weel.}}",
        "searchprofile-articles": "Content pages",
        "searchprofile-project": "Heelp n Waurk pages",
        "searchprofile-images": "Multimedia",
-       "searchprofile-everything": "Everything",
+       "searchprofile-everything": "Awthing",
        "searchprofile-advanced": "Advanced",
        "searchprofile-articles-tooltip": "Rake in $1",
        "searchprofile-project-tooltip": "Rake in $1",
        "searchprofile-images-tooltip": "Rake fer files",
        "searchprofile-everything-tooltip": "Rake aw o content (inclædin tauk pages)",
        "searchprofile-advanced-tooltip": "Rake in custom namespaces",
-       "search-result-size": "$1 ({{PLURAL:$2|1 word|$2 words}})",
-       "search-result-category-size": "{{PLURAL:$1|1 member|$1 members}} ({{PLURAL:$2|1 subcategory|$2 subcategories}}, {{PLURAL:$3|1 file|$3 files}})",
+       "search-result-size": "$1 ({{PLURAL:$2|1 waird|$2 wairds}})",
+       "search-result-category-size": "{{PLURAL:$1|1 memmer|$1 memmers}} ({{PLURAL:$2|1 subcategerie|$2 subcategeries}}, {{PLURAL:$3|1 file|$3 files}})",
        "search-result-score": "Relevanc: $1%",
        "search-redirect": "(reguide $1)",
        "search-section": "(section $1)",
        "search-interwiki-more": "(mair)",
        "search-relatedarticle": "Relatit",
        "searcheverything-enable": "Rake in aw namespaces",
-       "searchrelated": "related",
+       "searchrelated": "relatit",
        "searchall": "aw",
-       "showingresults": "Shawin ablo up tae {{PLURAL:$1|'''1''' result|'''$1''' results}} stertin wi #'''$2'''.",
+       "showingresults": "Shawin ablo up tae {{PLURAL:$1|'''1''' ootcome|'''$1''' ootcomes}} stertin wi #'''$2'''.",
        "showingresultsinrange": "Shawin ablo up til {{PLURAL:$1|<strong>1</strong> ootcome|<strong>$1</strong> ootcome}} in range #<strong>$2</strong> til #<strong>$3</strong>.",
-       "showingresultsnum": "Shawin ablo {{PLURAL:$3|'''1''' result|'''$3''' results}} stertin wi #'''$2'''.",
+       "showingresultsnum": "Shawin ablo {{PLURAL:$3|'''1''' ootcome|'''$3''' ootcomes}} stertin wi #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Ootcome <strong>$1</strong> o <strong>$3</strong>|Ootcomes <strong>$1 - $2</strong> o <strong>$3</strong>}} fer <strong>$4</strong>",
        "search-nonefound": "Thaur were naw ootcomes matchin the speiring.",
        "powersearch-legend": "Advanced rake",
        "powersearch-toggleall": "Aw",
        "powersearch-togglenone": "Nane",
        "search-external": "Eixternal rake",
-       "searchdisabled": "Rakin throu {{SITENAME}} is disabled for performance raesons. Ye can rake via Google juist nou. Mynd that thair indexes o {{SITENAME}} content micht be oot o date.",
+       "searchdisabled": "Rakin throu {{SITENAME}} is disabled fer performance raisons. Ye can rake bi wa o Google juist nou. Mynd that thair indexes o {{SITENAME}} content micht be oot o date.",
        "search-error": "Ae mistak haes occurred while rakin: $1",
        "preferences": "Ma preferences",
        "mypreferences": "Ma preferences",
        "prefs-edits": "Nummer o eidits:",
        "prefsnologintext2": "Please $1 tae chynge yer preferences.",
-       "prefs-skin": "Huil",
+       "prefs-skin": "Skin",
        "skin-preview": "First Leuk",
-       "datedefault": "Nae preference",
+       "datedefault": "Nae preferance",
        "prefs-labs": "Labs featurs",
        "prefs-user-pages": "Uiser pages",
        "prefs-personal": "Uiser data",
        "prefs-watchlist-edits": "Mucklest nummer o chynges tae shaw in expanded watchleet:",
        "prefs-watchlist-edits-max": "Mucklest nummer: 1000",
        "prefs-watchlist-token": "Watchleet token:",
-       "prefs-misc": "Antrin settins",
+       "prefs-misc": "Ither",
        "prefs-resetpass": "Chynge passwaird",
        "prefs-changeemail": "Chynge Wab-mail address",
        "prefs-setemail": "Set ae wab-mail address",
        "prefs-rendering": "Appearence",
        "saveprefs": "Hain preferences",
        "restoreprefs": "Restore aw defaut settins (in aw sections)",
-       "prefs-editing": "Editin",
+       "prefs-editing": "Eeditin",
        "rows": "Raws:",
-       "searchresultshead": "Rake result settins",
+       "searchresultshead": "Rake ootcome settins",
        "stub-threshold": "Threeshaud fer <a href=\"#\" class=\"stub\">stub airtin</a> formattin (bytes):",
-       "stub-threshold-disabled": "Tuckie",
+       "stub-threshold-disabled": "Disablt",
        "recentchangesdays": "Days tae shaw in recynt chynges:",
        "recentchangesdays-max": "Mucklest $1 {{PLURAL:$1|day|days}}",
        "recentchangescount": "Nummer o eedits tae shaw bi defaut:",
        "timezoneuseserverdefault": "Uise wiki defaut ($1)",
        "timezoneuseoffset": "Ither (speceefie affset)",
        "servertime": "Server time the nou",
-       "guesstimezone": "Fill in frae brouser",
+       "guesstimezone": "Fill in fae brouser",
        "timezoneregion-africa": "Africae",
        "timezoneregion-america": "Americae",
        "timezoneregion-antarctica": "Antairctica",
        "timezoneregion-australia": "Australie",
        "timezoneregion-europe": "Europ",
        "timezoneregion-pacific": "Paceefic Ocean",
-       "allowemail": "Allou email frae ither uisers",
+       "allowemail": "Allou email fae ither uisers",
        "prefs-searchoptions": "Rake",
        "defaultns": "Itherwise rake in thir namespaces:",
        "default": "defaut",
        "yournick": "New seegnatur:",
        "prefs-help-signature": "Comments oan talk pages shid be signed wi \"<nowiki>~~~~</nowiki>\", this will be convertit intil yer signatur n ae timestamp.",
        "badsig": "Raw signature nae guid; check HTML tags.",
-       "badsiglength": "Yer nickname is ower lang; it haes tae be $1 {{PLURAL:$1|character|characters}} or less.",
+       "badsiglength": "Yer signatur is ower lang; it haes tae be $1 {{PLURAL:$1|chairacter|chairacters}} or less.",
        "yourgender": "Hou dae ye prefer tae be described?",
        "gender-unknown": "Ah prefer tae na say",
        "gender-male": "He eedits wiki pages",
        "email-address-validity-valid": "Wab-mail address appears tae be valid",
        "email-address-validity-invalid": "Enter ae valid wab-mail address",
        "userrights": "Uiser richts managemant",
-       "userrights-lookup-user": "Manish uiser boorachs",
-       "userrights-user-editname": "Enter a uisername:",
+       "userrights-lookup-user": "Manage uiser groops",
+       "userrights-user-editname": "Enter ae uisername:",
        "editusergroup": "Eidit uiser boorach",
        "editinguser": "Chynging uiser richts o uiser <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Eedit uiser groops",
        "saveusergroups": "Hain uiser groops",
-       "userrights-groupsmember": "Member o:",
+       "userrights-groupsmember": "Memmer o:",
        "userrights-groupsmember-auto": "Impleecit memmer o:",
        "userrights-groups-help": "Ye can alter the groops this uiser is in:\n* Ae checkit kist means that the uiser is in that groop.\n* Aen oncheckit kist means that the uiser's na in that groop.\n* Ae * indeecates that ye canna remuiv the groop yince ye'v eikit it, or vice versa.",
        "userrights-reason": "Raison:",
        "nchanges": "$1 {{PLURAL:$1|chynge|chynges}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sin laist veesit}}",
        "enhancedrc-history": "histeri",
-       "recentchanges": "Recent chynges",
+       "recentchanges": "Recynt chynges",
        "recentchanges-legend": "Recynt chynges opties",
-       "recentchanges-summary": "Follae the maist recent chynges tae the wiki on this page.",
+       "recentchanges-summary": "Follae the maist recynt chynges tae the wiki oan this page.",
        "recentchanges-noresult": "Naw chynges durin the gien period matchin thir guidins.",
-       "recentchanges-feed-description": "Follae the maist recent chynges tae the wiki in this feed.",
-       "recentchanges-label-newpage": "This edit created a freish page",
+       "recentchanges-feed-description": "Follae the maist recynt chynges tae the wiki in this feed.",
+       "recentchanges-label-newpage": "This eedit creautit ae new page",
        "recentchanges-label-minor": "This is ae smaa eedit",
        "recentchanges-label-bot": "This eedit wis performed bi ae bot",
-       "recentchanges-label-unpatrolled": "This edit haes nae yet bin patrolled",
+       "recentchanges-label-unpatrolled": "This eedit haes no bin patrolled yet",
        "recentchanges-label-plusminus": "The page size chynged bi this nummer o bytes",
        "recentchanges-legend-newpage": "(see [[Special:NewPages|leet o new pages]] ava)",
        "rcnotefrom": "Ablo ar the chynges sin <strong>$2</strong> (up til <strong>$1</strong> shawn).",
-       "rclistfrom": "Shaw new chynges stertin frae $3 $2",
-       "rcshowhideminor": "$1 smaa edits",
+       "rclistfrom": "Shaw new chynges stertin fae $3 $2",
+       "rcshowhideminor": "$1 smaa eedits",
        "rcshowhideminor-show": "Shaw",
        "rcshowhideminor-hide": "Skauk",
        "rcshowhidebots": "$1 bots",
        "rcshowhideanons": "$1 anonymous uisers",
        "rcshowhideanons-show": "Shaw",
        "rcshowhideanons-hide": "Skauk",
-       "rcshowhidepatr": "$1 patrolled edits",
+       "rcshowhidepatr": "$1 patrolled eedits",
        "rcshowhidepatr-show": "Shaw",
        "rcshowhidepatr-hide": "Skauk",
-       "rcshowhidemine": "$1 ma edits",
+       "rcshowhidemine": "$1 ma eedits",
        "rcshowhidemine-show": "Shaw",
        "rcshowhidemine-hide": "Skauk",
        "rclinks": "Shaw last $1 chynges in last $2 days<br />$3",
        "diff": "diff",
        "hist": "hist",
        "hide": "Skauk",
-       "show": "shaw",
+       "show": "Shaw",
        "minoreditletter": "s",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 watchin {{PLURAL:$1|uiser|uisers}}]",
        "rc_categories": "Limit til categeries (separate wi \"|\")",
-       "rc_categories_any": "Ony",
+       "rc_categories_any": "Onie",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} efter chynge",
        "rc-enhanced-expand": "Shaw details",
        "rc-enhanced-hide": "Skauk details",
        "uploadbtn": "Uplaid file",
        "reuploaddesc": "Gang back til the uplaid form.",
        "upload-tryagain": "Haunn in modified file descreeption",
-       "uploadnologin": "Nae loggit in",
+       "uploadnologin": "No loggit in",
        "uploadnologintext": "Please $1 tae uplaid files.",
        "upload_directory_missing": "The uplaid directerie ($1) is missin n coudna be cræftit bi the wabserver.",
        "upload_directory_read_only": "The uplaid directerie ($1) is naw writable bi the wabserver.",
        "upload-permitted": "Permitit file types: $1.",
        "upload-prohibited": "Proheebited file types: $1.",
        "uploadlogpage": "Uplaid log",
-       "uploadlogpagetext": "Ablo is a leet o the maist recent file uplaids.",
+       "uploadlogpagetext": "Ablo is ae leet o the maist recynt file uplaids.\nSee the [[Special:NewFiles|gallerie o new files]] fer ae mair veesual luikower.",
        "filedesc": "Ootline",
        "fileuploadsummary": "Ootline:",
        "filereuploadsummary": "File chynges:",
-       "filestatus": "Copyricht status:",
+       "filestatus": "Copiericht status:",
        "filesource": "Soorce:",
        "ignorewarning": "Ignore warnishment n hain file oniewey.",
-       "ignorewarnings": "Ignore ony warnins",
+       "ignorewarnings": "Ignore onie warnishmants",
        "minlength1": "Filenames maun be at least yin letter.",
        "illegalfilename": "The filename \"$1\" haes chairacters that's naw permitit in page teitles. Please rename the file n gie uplaidin it anither shote.",
        "filename-toolong": "Filenames canna be langer than 240 bytes.",
        "tmp-create-error": "Coudna cræft temperie file.",
        "tmp-write-error": "Mistak writin temperie file.",
        "large-file": "It's recommended that files ar nae muckler than $1;\nthis file is $2.",
-       "largefileserver": "This file is bigger nor the server is confeigurt tae allou.",
+       "largefileserver": "This file is bigger than the server is confeeegurt tae allou.",
        "emptyfile": "The file that ye uplaided seems tae be tuim.\nThis micht be cause o ae typeower in the filename.\nPlease check whether ye reallie want tae uplaid this file.",
        "windows-nonascii-filename": "This wiki disna support filenames wi speecial chairacters.",
        "fileexists": "Ae file wi this name exeests aareadies, please check <strong>[[:$1]]</strong> gif ye'r no sair that ye want tae chynge it.\n[[$1|thumb]]",
        "uploadwarning": "Uplaid warnishment",
        "uploadwarning-text": "Please modeefie the file descreeption ablo n gie it anither gae.",
        "savefile": "Hain file",
-       "uploadedimage": "uplaidit \"$1\"",
+       "uploadedimage": "uplaidit \"[[$1]]\"",
        "overwroteimage": "uplaided ae new version o \"[[$1]]\"",
-       "uploaddisabled": "Sorry, uplaidin is disabled.",
+       "uploaddisabled": "Sarrie, uplaidin is disablit.",
        "copyuploaddisabled": "Uplaid bi URL disabled.",
        "uploaddisabledtext": "File uplaids ar disabled.",
        "php-uploaddisabledtext": "File uplaids ar disabled in PHP.\nPlease check the file_uploads settin.",
-       "uploadscripted": "This file hauds HTML or script code that micht be wrang interpretit bi a wab brouser.",
+       "uploadscripted": "This file hauds HTML or script code that micht be wranglie interpretit bi ae wab brouser.",
        "uploadscriptednamespace": "This SVG file contains aen illegal namespace \"$1\"",
        "uploadinvalidxml": "The XML in the uplaided file coudna be parsed.",
        "uploadvirus": "The file hauds a virus! Details: $1",
        "upload-curl-error6-text": "The URL gien coudna be reached.\nPlease dooble-check that the URL is correct n the site is up.",
        "upload-curl-error28": "Uplaid timeoot",
        "upload-curl-error28-text": "The site tuik ower lang tae respond.\nPlease check that the site is up, wait ae short while n gei it anither gae.\nYe micht want tae try at ae less busie time.",
-       "license": "Licensing:",
+       "license": "Licensin:",
        "license-header": "Licensin",
-       "nolicense": "Nane selected",
+       "nolicense": "Nane selectit",
        "license-nopreview": "(Luikower naw available)",
        "upload_source_url": "(ae valid, publeeclie accessible URL)",
        "upload_source_file": "(ae file oan yer computer)",
        "filehist-revert": "revert",
        "filehist-current": "current",
        "filehist-datetime": "Date/Time",
-       "filehist-thumb": "Thumbnail",
+       "filehist-thumb": "Thummnail",
        "filehist-thumbtext": "Thumbnail fer version aes o $1",
        "filehist-nothumb": "Naw thummnail",
        "filehist-user": "Uiser",
        "listduplicatedfiles": "Leet o files wi dupleecates",
        "listduplicatedfiles-summary": "This is ae leet o files whaur the maist recynt version o the file is ae duplicate o the maist recynt version o some ither file. Yinlie local files ar conseederit.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] haes [[$3|{{PLURAL:$2|ae dupleecate|$2 dupleecates}}]].",
-       "unusedtemplates": "Templates that arena uised",
+       "unusedtemplates": "Onuised templates",
        "unusedtemplatestext": "This page leets aw pages in the {{ns:template}} namespace that's naw incuidit in anither page. Mynd n check fer ither airtins til the templates afore delytin thaim.",
        "unusedtemplateswlh": "ither airtins",
-       "randompage": "Wale page allevolie",
+       "randompage": "Random page",
        "randompage-nopages": "Thaur's naw pages in the follaein {{PLURAL:$2|namespace|namespaces}}: $1.",
        "randomincategory": "Random page in categerie",
        "randomincategory-invalidcategory": "\"$1\" isna ae valid categerie name.",
        "pageswithprop-prophidden-binary": "binarie propertie value skaukt ($1)",
        "doubleredirects": "Dooble reguidals",
        "doubleredirectstext": "This page leets pages that reguide til ither reguidal pages.\nIlka raw contains airtins til the first n seicont reguidals, n the tairget o the seicont reguidal ava, this is uisuallie the \"real\" tairget page whaur the first reguidal shid poynt.\n<del>Crossed oot</del> entries hae been solved.",
-       "double-redirect-fixed-move": "[[$1]] haes been muived.\nIt nou reguides til [[$2]].",
-       "double-redirect-fixed-maintenance": "Fixin dooble reguidal fae [[$1]] til [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] haes been muived.\nIt wis autæmaticlie updatit n nou it reguides tae [[$2]].",
+       "double-redirect-fixed-maintenance": "Autæmaticlie fixin dooble reguidal fae [[$1]] tae [[$2]] in ae maintenance job.",
        "double-redirect-fixer": "Reguidal fixer",
        "brokenredirects": "Brucken reguidals",
        "brokenredirectstext": "The folling redirects link til non-existent pages:",
        "withoutinterwiki-submit": "Shaw",
        "fewestrevisions": "Pages wi the fewest reeveesions",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
-       "ncategories": "$1 {{PLURAL:$1|category|categories}}",
+       "ncategories": "$1 {{PLURAL:$1|categerie|categeries}}",
        "nlinks": "$1 {{PLURAL:$1|airtin|airtins}}",
-       "nmembers": "$1 {{PLURAL:$1|membir|membirs}}",
+       "nmembers": "$1 {{PLURAL:$1|memmer|memmers}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|memmer|memmers}}",
        "nrevisions": "$1 {{PLURAL:$1|reveesion|reveesions}}",
        "nviews": "$1 {{PLURAL:$1|luik|luiks}}",
        "specialpage-empty": "Thaur's naw ootcomes fer this report.",
        "lonelypages": "Orphant pages",
        "lonelypagestext": "The follaein pages'r naw linkt fae or transcluided intil ither pages in {{SITENAME}}.",
-       "uncategorizedpages": "Uncategoreised pages",
-       "uncategorizedcategories": "Uncategoreised categories",
+       "uncategorizedpages": "Oncategerised pages",
+       "uncategorizedcategories": "Oncategerised categeries",
        "uncategorizedimages": "Oncategerized files",
        "uncategorizedtemplates": "Oncategerized templates",
-       "unusedcategories": "Unuised categories",
+       "unusedcategories": "Onuised categeries",
        "unusedimages": "Unuised eemages",
-       "wantedcategories": "Wantit categories",
+       "wantedcategories": "Wantit categeries",
        "wantedpages": "Wantit pages",
        "wantedpages-badtitle": "Onvalid title in ootcome set: $1",
        "wantedfiles": "Wantit files",
        "wantedfiletext-cat": "The follaein files ar uised but dinna exeest. Files fae foreign repositeries micht be leetit despite exeestin. Onie sic false poseeteeves will be <del>struck oot</del>. Addeetionallie, pages that embed files that dinna exeest ar leetit in [[:$1]].",
        "wantedfiletext-nocat": "The follaein files ar uised but dinna exeest. Files fae foreign repositeries micht be leetit despite exeestin. Onie sic false poseeteeves will be <del>struck oot</del>.",
        "wantedtemplates": "Wantit templates",
-       "mostlinked": "Maist airtit-til pages",
-       "mostlinkedcategories": "Maist airtit-til categories",
+       "mostlinked": "Maist airtit-tae pages",
+       "mostlinkedcategories": "Maist airtit-tae categeries",
        "mostlinkedtemplates": "Maist linkt-til templates",
        "mostcategories": "Airticles wi the maist categeries",
        "mostimages": "Maist uised eemages",
        "mostinterwikis": "Pages wi the maist interwikis",
-       "mostrevisions": "Maist revised airticles",
+       "mostrevisions": "Pages wi the maist luikowers",
        "prefixindex": "Aw pages wi prefix",
        "prefixindex-namespace": "Aw pages wi preefix ($1 namespace)",
        "prefixindex-strip": "Strip preefix in leet",
        "move": "Muiv",
        "movethispage": "Muiv this page",
        "unusedimagestext": "The follaein files exeest but arna embeddit in onie page.\nPlease mynd that ither wab sites micht link til ae file wi ae direct URL, n sae micht still be leetit here despite being in acteeve uiss.",
-       "unusedcategoriestext": "The follaein category pages exists, tho nae ither airticle or category maks uiss o thaim.",
+       "unusedcategoriestext": "The follaein categerie pages exeest, tho nae ither page or categerie maks uiss o thaim.",
        "notargettitle": "Nae target",
-       "notargettext": "Ye hivna specifee'd a tairget page or uiser tae perform this function on.",
+       "notargettext": "Ye'v na speceefie'd ae tairget page or uiser tae perform this function oan.",
        "nopagetitle": "Naw sic tairget page",
        "nopagetext": "The tairget page that ye'v speeceefied disna exeest.",
        "pager-newer-n": "{{PLURAL:$1|newer 1|newer $1}}",
-       "pager-older-n": "{{PLURAL:$1|older 1|older $1}}",
+       "pager-older-n": "{{PLURAL:$1|aulder 1|aulder $1}}",
        "suppress": "Owersicht",
        "querypage-disabled": "This speecial page is disablit fer performance raisons.",
        "booksources": "Buik soorces",
        "log": "Logs",
        "all-logs-page": "Aw public logs",
        "alllogstext": "Combined displey o aw available logs o {{SITENAME}}.\nYe can narrae doon the whit ye see bi selectin ae log type, the uisername (case-sensiteeve), or the affected page (case-sensiteeve ava).",
-       "logempty": "Nae matchin items in log.",
+       "logempty": "Nae matchin eetems in log.",
        "log-title-wildcard": "Rake titles stairtin wi this tex",
        "showhideselectedlogentries": "Chynge veesibeelitie o selectit log entries",
        "allpages": "Aw pages",
        "alphaindexline": "$1 til $2",
-       "nextpage": "Neist page ($1)",
-       "prevpage": "Page afore ($1)",
+       "nextpage": "Neis page ($1)",
+       "prevpage": "Aforegaun page ($1)",
        "allpagesfrom": "Shaw pages stairtin at:",
        "allpagesto": "Displey pages endin at:",
-       "allarticles": "Aa airticles",
-       "allinnamespace": "Aa pages ($1 namespace)",
+       "allarticles": "Aw pages",
+       "allinnamespace": "Aw pages ($1 namespace)",
        "allpagessubmit": "Gang",
        "allpagesprefix": "Shaw pages wi prefix:",
-       "allpagesbadtitle": "The page teitle gien wis wrang or haed a cross-lied or cross-wiki prefix. It micht hae ane or twa characters that canna be uised in teitles",
-       "allpages-bad-ns": "{{SITENAME}} disna hae a namespace \"$1\".",
+       "allpagesbadtitle": "The page teetle gien wis onvalit or haed ae cross-lied or cross-wiki prefix. It micht hae ane or twa chairacters that canna be uised in teetles",
+       "allpages-bad-ns": "{{SITENAME}} disna hae ae namespace \"$1\".",
        "allpages-hide-redirects": "Skauk reguidals",
        "cachedspecial-viewing-cached-ttl": "Ye'r seein ae cached version o this page, this can be up til $1 auld.",
        "cachedspecial-viewing-cached-ts": "Ye'r seein ae cached version o this page, this micht naw be compleatelie actual.",
        "cachedspecial-refresh-now": "See latest.",
-       "categories": "Categories",
+       "categories": "Categeries",
        "categoriespagetext": "The follaein {{PLURAL:$1|categerie contains|categeries contain}} pages or media.\n[[Special:UnusedCategories|Onuised categeries]] arna shawn here.\nSee [[Special:WantedCategories|wanted categeries]] ava.",
        "categoriesfrom": "Displey categeries stairtin at:",
        "special-categories-sort-count": "sairt bi coont",
        "linksearch-ns": "Namespace:",
        "linksearch-ok": "Rake",
        "linksearch-text": "Wildcairds like \"*.wikipedia.org\" can be uised.\nNeeds at least ae top-level domain, fer example \"*.org\".<br />\nSupported {{PLURAL:$2|protocol|protocols}}: <code>$1</code> (defaults to http:// gif naw protocol is speceefied).",
-       "linksearch-line": "$1 is linked from $2",
+       "linksearch-line": "$1 is airtit fae $2",
        "linksearch-error": "Wildcards micht appear yinlie at the stairt o the hoastname.",
        "listusersfrom": "Displey uisers stairtin at:",
        "listusers-submit": "Shaw",
        "listgrouprights-group": "Groop",
        "listgrouprights-rights": "Richts",
        "listgrouprights-helppage": "Help:Groop richts",
-       "listgrouprights-members": "(leet o members)",
+       "listgrouprights-members": "(leet o memmers)",
        "listgrouprights-addgroup": "Eik {{PLURAL:$2|groop|groops}}: $1",
        "listgrouprights-removegroup": "Remuiv {{PLURAL:$2|grop|groops}}: $1",
        "listgrouprights-addgroup-all": "Eik aw groops",
        "trackingcategories-msg": "The Trackin Categerie",
        "trackingcategories-name": "The Message name",
        "trackingcategories-desc": "Categerie inclusion criteria",
-       "noindex-category-desc": "The page haes ae <code><nowiki>__NOINDEX__</nowiki></code> mageec waird oan it (n is in ae namespace whaur that flag is permitit), n sae it's na indext bi the robots.",
-       "index-category-desc": "The page haes ae <code><nowiki>__INDEX__</nowiki></code> oan it (n is in ae namespace whaur that flag is permitit), n sae it's indext bi the robots whaur it widna normallie be.",
-       "post-expand-template-inclusion-category-desc": "Efter makin aw o the templates muckler, the page size is muckler than <code>$wgMaxArticleSize</code>, sae some templates were na makit muckler.",
+       "noindex-category-desc": "The page haes ae <code><nowiki>__NOINDEX__</nowiki></code> mageec waird oan it (n is in ae namespace whaur that flag is alloud), n sae it's no indext bi the robots.",
+       "index-category-desc": "The page haes ae <code><nowiki>__INDEX__</nowiki></code> oan it (n is in ae namespace whaur that flag is alloud), n sae it's indext bi the robots whaur it widna normallie be.",
+       "post-expand-template-inclusion-category-desc": "Efter makin aw o the templates muckler, the page size is muckler than <code>$wgMaxArticleSize</code>, sae some templates were no makit muckler.",
        "post-expand-template-argument-category-desc": "Efter makin ae template argument muckler (sommit in triple braces, lik <code>{{{Foo}}})</code>, the page is muckler than <code>$wgMaxArticleSize</code>.",
        "expensive-parserfunction-category-desc": "Ower monie expenseeve parser functions (lik <code>#ifexist</code>) incluidit oan ae page. See [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "Categerie eikit gif the page contains ae broken file airtin (aen airtin tae embed ae file whan the file disna exeest).",
        "usermessage-editor": "Seestem messenger",
        "watchlist": "Ma watchleet",
        "mywatchlist": "Ma watchleet",
-       "watchlistfor2": "For $1 $2",
+       "watchlistfor2": "Fer $1 $2",
        "nowatchlist": "Ye'v nae eitems oan yer watchleet.",
        "watchlistanontext": "Please $1 tae see or eedit eetems oan yer watchlet.",
        "watchnologin": "Nae loggit in",
        "removewatch": "Remuiv fae watchleet",
        "removedwatchtext": "The page \"[[:$1]]\" haes been remuied fae [[Special:Watchlist|yer watchleet]].",
        "watch": "Watch",
-       "watchthispage": "Leuk ower this page",
-       "unwatch": "Unwatch",
+       "watchthispage": "Watch this page",
+       "unwatch": "Onwatch",
        "unwatchthispage": "Stap watchin",
        "notanarticle": "Naw ae content page",
        "notvisiblerev": "The last reeveesion bi ae differant uiser haes been delytit",
-       "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} oan yer watchleet, na coontin tauk pages.",
+       "watchlist-details": "{{PLURAL:$1|$1 page|$1 pages}} oan yer watchleet, no coontin tauk pages seperatlie.",
        "wlheader-enotif": "Wab-mail annooncemant is enabled.",
        "wlheader-showupdated": "Pages that hae been chynged sin ye last veesitit thaim ar shawn in '''baud'''.",
        "wlnote2": "Ablo ar the chynges in the hainmaist {{PLURAL:$1|hoor|<strong>$1</strong> hours}}, aes o $3, $2.",
-       "wlshowlast": "Shaw lest $1 hours $2 days $3",
-       "watchlist-options": "Watchleet options",
+       "wlshowlast": "Shaw hainmaist $1 hoors $2 days $3",
+       "watchlist-options": "Watchleet opties",
        "watching": "Watchin...",
-       "unwatching": "Unwatchin...",
+       "unwatching": "Onwatchin...",
        "watcherrortext": "Ae mistak occurred while chyngin yer watchleet settins fer \"$1\".",
-       "enotif_reset": "Merk aa pages visitit",
+       "enotif_reset": "Maurk aw pages aes veesitit",
        "enotif_impersonal_salutation": "{{SITENAME}} uiser",
        "enotif_subject_deleted": "{{SITENAME}} page $1 haes been {{GENDER:$2|delytit}} bi $2",
        "enotif_subject_created": "{{SITENAME}} page $1 haes been {{GENDER:$2|cræftit}} bi $2",
        "dellogpagetext": "Ablo is ae leet o the maist recynt delytions.",
        "deletionlog": "delytion log",
        "reverted": "Revertit til aulder reveesion",
-       "deletecomment": "Raeson:",
+       "deletecomment": "Raison:",
        "deleteotherreason": "Ither/addeetional raison:",
-       "deletereasonotherlist": "Ither raeson",
+       "deletereasonotherlist": "Ither raison",
        "deletereason-dropdown": "* Commyn delyte raisons\n** Spam\n** Vandaleesm\n** Copiericht violation\n** Writer request\n** Broken reguidal",
        "delete-edit-reasonlist": "Eedit delytion raisons",
        "delete-toobig": "This page haes ae muckle eedit histerie, ower $1 {{PLURAL:$1|reveesion|reveesions}}.\nDelytion o sic pages haes been restrictit tae stap accidental disruption o {{SITENAME}}.",
        "delete-warning-toobig": "This page haes ae muckle eedit histerie, ower $1 {{PLURAL:$1|reveesion|reveesions}}.\nDelytin it micht disrupt database operations o {{SITENAME}};\nproceed wi caution.",
        "deleting-backlinks-warning": "'''Warnishment:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Ither pages]] airt til or transcluide the page ye'r aboot tae delyte.",
-       "rollback": "Row back edits",
+       "rollback": "Row back eedits",
        "rollback_short": "Rowback",
        "rollbacklink": "rowback",
        "rollbacklinkcount": "rowback $1 {{PLURAL:$1|eedit|eedits}}",
        "modifiedarticleprotection": "chynged protection level fer \"[[$1]]\"",
        "unprotectedarticle": "remuied protection fae \"[[$1]]\"",
        "movedarticleprotection": "muived protection settins fae \"[[$2]]\" til \"[[$1]]\"",
-       "protect-title": "Protectin \"$1\"",
+       "protect-title": "Chynge protection level fer \"$1\"",
        "protect-title-notallowed": "See protection level o \"$1\"",
-       "prot_1movedto2": "[[$1]] flittit til [[$2]]",
+       "prot_1movedto2": "[[$1]] muivit tae [[$2]]",
        "protect-badnamespace-text": "Pages in this namespace canna be protected.",
        "protect-norestrictiontypes-text": "This page canna be protected aes thaur's naw restreection types available.",
-       "protectcomment": "Raeson:",
+       "protectcomment": "Raison:",
        "protectexpiry": "Expires:",
        "protect_expiry_invalid": "Expirie time is onvalit.",
        "protect_expiry_old": "Expirie time is in the past.",
        "protect-locked-dblock": "Protection levels canna be chynged cause o aen acteeve database lock.\nHere ar the settins fer the page <strong>$1</strong> nou:",
        "protect-locked-access": "Yer accont disna hae permeession tae chynge page protection levels.\nHere ar the settins fer the page <strong>$1</strong> the nou:",
        "protect-cascadeon": "This page is nou protected cause it is incluided in the follaein {{PLURAL:$1|page, this haes|pages, thir hae}} cascadin protection turned oan.\nChynges til this page's protection level will na affect the cascadin protection.",
-       "protect-default": "Allow aw uisers",
+       "protect-default": "Allou aw uisers",
        "protect-fallback": "permit yinlie uisers wi \"$1\" permission",
        "protect-level-autoconfirmed": "Allou yinly autæconfirmed uisers",
        "protect-level-sysop": "Allou admeenistraters yinly",
        "maximum-size": "Mucklest size:",
        "restriction-edit": "Eidit",
        "restriction-move": "Muiv",
-       "restriction-create": "Mak",
+       "restriction-create": "Creaut",
        "restriction-upload": "Uplaid",
        "restriction-level-sysop": "fulie protected",
        "restriction-level-autoconfirmed": "semie protected",
        "sp-contributions-newbies": "Shaw contreebutions o freish accoonts ainlie",
        "sp-contributions-newbies-sub": "Fer new accoonts",
        "sp-contributions-newbies-title": "Uiser contreebutions fer new accoonts",
-       "sp-contributions-blocklog": "block log",
+       "sp-contributions-blocklog": "the block log",
        "sp-contributions-suppresslog": "suppressed uiser contreebutions",
        "sp-contributions-deleted": "delytit uiser contreebutions",
-       "sp-contributions-uploads": "uploads",
+       "sp-contributions-uploads": "uplaids",
        "sp-contributions-logs": "logs",
        "sp-contributions-talk": "tauk",
        "sp-contributions-userrights": "uiser richts management",
        "isredirect": "reguidal page",
        "istemplate": "transclusion",
        "isimage": "file airtin",
-       "whatlinkshere-prev": "{{PLURAL:$1|previous|previous $1}}",
-       "whatlinkshere-next": "{{PLURAL:$1|next|next $1}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|aforegaun|aforegaun $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|neix|neix $1}}",
        "whatlinkshere-links": "← airtins",
-       "whatlinkshere-hideredirs": "$1 redirects",
+       "whatlinkshere-hideredirs": "$1 reguidals",
        "whatlinkshere-hidetrans": "$1 transclusions",
        "whatlinkshere-hidelinks": "$1 airtins",
        "whatlinkshere-hideimages": "$1 file airtins",
        "blockip": "Block uiser",
        "blockip-legend": "Block uiser",
        "blockiptext": "Uise the form ablo tae block write access fae ae speceefic IP address or uisername. This shid be dun juist tae hinder vandaleesm, n in accord wi [[{{MediaWiki:Policy-url}}|policie]]. Fil in ae speceefic raison ablo (fer exemplar, citin parteecular pages that were vandalised).",
-       "ipadressorusername": "IP Address or uisername",
+       "ipadressorusername": "IP address or uisername:",
        "ipbexpiry": "Expirie:",
-       "ipbreason": "Raeson:",
+       "ipbreason": "Raison:",
        "ipbreason-dropdown": "*Commyn block raisons\n** Insertin false information\n** Remuivin content fae pages\n** Spammin airtins til ootby steids\n** Insertin nonsense/gibberish intil pages\n** Inteemidatin behavier/harassment\n** Abuisin multiple accoonts\n** Onacceptable uisername",
        "ipb-hardblock": "Stap loggit-in uisers fae eeditin fae this IP address",
        "ipbcreateaccount": "Stap accoont cræftin",
        "ipbemailban": "Stap uiser fae sendin wab-mail",
        "ipbenableautoblock": "Autæmateeclie block the laist IP address uised bi this uiser, n onie subsequent IP addresses that thay attempt tae eedit fae",
        "ipbsubmit": "Block this uiser",
-       "ipbother": "Ither time",
-       "ipboptions": "2 hours:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,indefinite:infinite",
+       "ipbother": "Ither time:",
+       "ipboptions": "2 hoors:2 hours,1 day:1 day,3 days:3 days,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,indefinite:infinite",
        "ipbhidename": "Skauk uisername fae eedits n leets",
        "ipbwatchuser": "Watch this uiser's uiser n tauk pages",
        "ipb-disableusertalk": "Stap this uiser fae eeditin thair ain tauk page while blockit",
        "ipblocklist-otherblocks": "Ither {{PLURAL:$1|block|blocks}}",
        "infiniteblock": "infeenite",
        "expiringblock": "dies oan $1 at $2",
-       "anononlyblock": "anon. juist",
+       "anononlyblock": "anon. yinlie",
        "noautoblockblock": "autæblock disabled",
-       "createaccountblock": "accoont-makkin blockit",
+       "createaccountblock": "account creaution disablt",
        "emailblock": "wab-mail disabled",
        "blocklist-nousertalk": "canna eedit yer ain tauk page",
        "ipblocklist-empty": "The block leet is tuim.",
        "blocklogentry": "blockit [[$1]] wi aen expirie time o $2 $3",
        "reblock-logentry": "chynged block settins fer [[$1]] wi ae diein time o $2 $3",
        "blocklogtext": "This is ae log o uiser blockin n onblockin actions. Autaematiclie blockit IP addresses isna leetit. See the [[Special:BlockList|block leet]] fer the leet o bans n blocks oan the nou.",
-       "unblocklogentry": "unblockit $1",
+       "unblocklogentry": "onblockit $1",
        "block-log-flags-anononly": "anonymos uisers yinlie",
-       "block-log-flags-nocreate": "accoont-makkin blockit",
+       "block-log-flags-nocreate": "account creaution disablt",
        "block-log-flags-noautoblock": "autæblock disabled",
        "block-log-flags-noemail": "wab-mail disabled",
        "block-log-flags-nousertalk": "canna eedit yer ain tauk page",
        "block-log-flags-angry-autoblock": "enhanced autæblock enabled",
        "block-log-flags-hiddenname": "uisername skaukt",
-       "range_block_disabled": "The administrator abeility tae mak range blocks is disabled.",
+       "range_block_disabled": "The admeenistrater abeelitie tae creaut range blocks is disablt.",
        "ipb_expiry_invalid": "Expirie time is onvalit.",
        "ipb_expiry_temp": "Skaukt uisername blocks maun be permanent.",
        "ipb_hide_invalid": "Onable tae suppress this accoont; it haes mair than {{PLURAL:$1|yin eedit|$1 eedits}}.",
        "locknoconfirm": "Ye didna tick the confirmation kist.",
        "lockdbsuccesssub": "Database lock fine",
        "unlockdbsuccesssub": "Database lowsed",
-       "lockdbsuccesstext": "The database haes been lockit. <br />Mynd an tak the lock aff efter yer maintenance is feinisht.",
+       "lockdbsuccesstext": "The database haes been lockit. <br />Mynd an [[Special:UnlockDB|tak the lock aff]] efter yer maintenance is compleate.",
        "unlockdbsuccesstext": "The database haes bin lowsed.",
        "lockfilenotwritable": "The database lock file isna writable.\nTae lock or lowse the database, this needs tae be writable bi the wab server.",
-       "databasenotlocked": "The database isna lockit.",
+       "databasenotlocked": "The database is no lockit.",
        "lockedbyandtime": "(bi {{GENDER:$1|$1}} oan $2 at $3)",
        "move-page": "Muiv $1",
        "move-page-legend": "Muiv page",
        "newtitle": "Til new teitle",
        "move-watch": "Watch soorce page n tairget page",
        "movepagebtn": "Muiv page",
-       "pagemovedsub": "Flittin succeedit",
+       "pagemovedsub": "Muiv succeedit",
        "movepage-moved": "<strong>\"$1\" has been muived til \"$2\"</strong>",
        "movepage-moved-redirect": "Ae reguidal haes been cræftit.",
        "movepage-moved-noredirect": "The cræftin o ae reguidal haes been suppressed.",
-       "articleexists": "A page o that name aareadies exists, or the name ye'v waled isna guid. Please wale anither name.",
+       "articleexists": "Ae page o that name awreadie exeests, or the name that ye'v chosen is no valit. Please chuise anither name.",
        "cantmove-titleprotected": "Ye canna muiv ae page til this location cause the new title haes been protected fae cræftin",
        "movetalk": "Muiv associated tauk page",
        "move-subpages": "Muiv subpages (up til $1)",
        "movepage-page-unmoved": "The page $1 coudna be muived til $2.",
        "movepage-max-pages": "The mmucklest o $1 {{PLURAL:$1|page|pages}} haes been muived n naw mair will be muived autæmateeclie.",
        "movelogpage": "Muiv log",
-       "movelogpagetext": "A leet o pages that's flitted is ablo.",
+       "movelogpagetext": "Ae leet o aw page muives is ablo.",
        "movesubpagetext": "This page haes $1 {{PLURAL:$1|subpage|subpages}} shawn ablo.",
        "movenosubpage": "This page haes naw subpages.",
-       "movereason": "Raeson:",
+       "movereason": "Raison:",
        "revertmove": "revert",
        "delete_and_move": "Delyte n muiv",
        "delete_and_move_text": "==Delytion caad fer==\n\nThe destination airticle \"[[:$1]]\" aareadies exists. Div ye want tae delyte it fer tae mak wey fer the muiv?",
        "allmessagesname": "Name",
        "allmessagesdefault": "Defaut message tex",
        "allmessagescurrent": "Message tex the nou",
-       "allmessagestext": "This is ae leet o system messages available in the MediaWiki namespace.\nPlease veesit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] n [//translatewiki.net translatewiki.net] gif ye wish tae contreebute til the generic MediaWiki localisation.",
-       "allmessagesnotsupportedDB": "'''{{ns:special}}:AllMessages''' nae supportit acause '''$wgUseDatabaseMessages''' is aff.",
+       "allmessagestext": "This is ae leet o seestem messages available in the MediaWiki namespace.\nPlease veesit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] n [//translatewiki.net translatewiki.net] gif ye wish tae contreebute tae the generic MediaWiki localisation.",
+       "allmessagesnotsupportedDB": "This page canna be uised cause <strong>$wgUseDatabaseMessages</strong> haes been disablt.",
        "allmessages-filter": "Filter b custymization state:",
        "allmessages-filter-unmodified": "Onmodified",
        "allmessages-filter-all": "Aw",
        "allmessages-language": "Leid:",
        "allmessages-filter-submit": "Gang",
        "allmessages-filter-translate": "Owerset",
-       "thumbnail-more": "Eik",
+       "thumbnail-more": "Mak Muckler",
        "filemissing": "File missin",
        "thumbnail_error": "Mistak makin thummnail: $1",
        "thumbnail_error_remote": "Mistak message fae $1:\n$2",
        "tooltip-pt-anonuserpage": "The uiser page fer the IP address that ye'r eeditin aes",
        "tooltip-pt-mytalk": "Yer tauk page",
        "tooltip-pt-anontalk": "Discussion aneat eedits fae this IP address",
-       "tooltip-pt-preferences": "Ma preferences",
+       "tooltip-pt-preferences": "Ma preferances",
        "tooltip-pt-watchlist": "Ae leet o pages ye'r moniterin fer chynges",
        "tooltip-pt-mycontris": "Leet o yer contreebutions",
-       "tooltip-pt-login": "It's a guid idea tae log i, but ye dinna hae tae.",
+       "tooltip-pt-login": "It's ae guid idea tae log in, but ye dinna hae tae.",
        "tooltip-pt-logout": "Log oot",
        "tooltip-ca-talk": "Discussion aneat the content page",
        "tooltip-ca-edit": "Ye can eedit this page. Please uise the luikower button afore hainin",
        "tooltip-ca-undelete": "Restore the eedits dun oan this page afore it wis delytit",
        "tooltip-ca-move": "Muiv this page",
        "tooltip-ca-watch": "Eik this page til yer watchleet",
-       "tooltip-ca-unwatch": "Remove this page frum yer watchleet",
+       "tooltip-ca-unwatch": "Remuiv this page fae yer watchleet",
        "tooltip-search": "Rake {{SITENAME}}",
        "tooltip-search-go": "Gang til ae page wi this exact name gif exeests",
        "tooltip-search-fulltext": "Rake the pages fer this tex",
        "tooltip-n-mainpage": "Gang til the Main Page",
        "tooltip-n-mainpage-description": "Gang til the Main Page",
        "tooltip-n-portal": "Aneat the project, whit ye can dae, whaur tae fynd things",
-       "tooltip-n-currentevents": "Fin' background speirins oan current events",
-       "tooltip-n-recentchanges": "The leet o recent chynges in the wiki",
+       "tooltip-n-currentevents": "Fynd backgroond speirins oan the nou events",
+       "tooltip-n-recentchanges": "Ae leet o recynt chynges in the wiki",
        "tooltip-n-randompage": "Laid ae random page",
        "tooltip-n-help": "The steid tae fynd oot",
-       "tooltip-t-whatlinkshere": "List o' a' wiki pages that link 'ere",
+       "tooltip-t-whatlinkshere": "Ae leet o aw wiki pages that airt here",
        "tooltip-t-recentchangeslinked": "Recynt chynges in pages linkt fae this page",
        "tooltip-feed-rss": "RSS feed fer this page",
        "tooltip-feed-atom": "Atom feed fer this page",
        "tooltip-t-contributions": "See ae leet o this uiser's contreebutions",
        "tooltip-t-emailuser": "Send ae wab-mail til this uiser",
        "tooltip-t-upload": "Uplaid files",
-       "tooltip-t-specialpages": "Leet o byordinar pages",
-       "tooltip-t-print": "Printable version o' this page",
+       "tooltip-t-specialpages": "Ae leet o aw byordinar pages",
+       "tooltip-t-print": "Prentable version o this page",
        "tooltip-t-permalink": "Permanent link til this reveesion o the page",
-       "tooltip-ca-nstab-main": "Leuk at content page",
+       "tooltip-ca-nstab-main": "Leuk at the content page",
        "tooltip-ca-nstab-user": "See the uiser page",
        "tooltip-ca-nstab-media": "See the media page",
        "tooltip-ca-nstab-special": "This is ae byordinair page, ye canna eedit the page itsel",
        "tooltip-ca-nstab-template": "See the template",
        "tooltip-ca-nstab-help": "See the heelp page",
        "tooltip-ca-nstab-category": "See the categerie page",
-       "tooltip-minoredit": "Mairk this as a smaa edit",
+       "tooltip-minoredit": "Maurk this aes ae smaa eedit",
        "tooltip-save": "Hain yer chynges",
        "tooltip-preview": "Luikower yer chynges, please uise this afore hainin!",
        "tooltip-diff": "Shaw the chynges that ye makit til the tex.",
        "pageinfo-category-pages": "Nummer o pages",
        "pageinfo-category-subcats": "Nummer o subcategeries",
        "pageinfo-category-files": "Nummer o files",
-       "markaspatrolleddiff": "Merk as patrolled",
-       "markaspatrolledtext": "Merk this airticle as patrolled",
-       "markedaspatrolled": "Merkit as patrolled",
+       "markaspatrolleddiff": "Maurk aes patrolled",
+       "markaspatrolledtext": "Maurk this page aes patrolled",
+       "markedaspatrolled": "Maurkit aes patrolled",
        "markedaspatrolledtext": "The selected reveesion o [[:$1]] haes been maurked aes patrolled.",
        "rcpatroldisabled": "Recynt chynges patrol disabled",
        "rcpatroldisabledtext": "The Recynt Chynges Patrol featur is disabled the nou.",
        "imagemaxsize": "Eemage size leemit:<br /><em>(fer file descreeption pages)</em>",
        "thumbsize": "Thummnail size:",
        "file-info-size": "$1 × $2 pixels, file size: $3, MIME type: $4",
-       "file-nohires": "Na higher resolution available.",
-       "svg-long-desc": "SVG file, nominally $1 × $2 pixels, file size: $3",
+       "file-nohires": "Nae heier resolution available.",
+       "svg-long-desc": "SVG file, nominallie $1 × $2 pixels, file size: $3",
        "svg-long-desc-animated": "Animated SVG file, nominallie $1 × $2 pixels, file size: $3",
        "svg-long-error": "Onvalit SVG file: $1",
        "show-big-image": "Oreeginal file",
        "file-info-png-repeat": "pleyed $1 {{PLURAL:$1|time|times}}",
        "file-no-thumb-animation": "<strong>Mynd: Due til techneecal limitations, thummnails o this file will na be animated.</strong>",
        "file-no-thumb-animation-gif": "<strong>Mynd: Due til techneecal limitations, thummnails o hei resolution GIF eemages sic aes this will na be animated.</strong>",
-       "newimages": "Gallery o new files",
+       "newimages": "Gallerie o new files",
        "imagelisttext": "Ablo is a leet o $1 {{PLURAL:$1|eemage|eemages}} sortit $2.",
        "newimages-summary": "This byordinair page shaws the last uplaidit files.",
        "newimages-label": "Filename (or ae pairt o it):",
        "exif-imagedescription": "Eemage title",
        "exif-software": "Saffware uised",
        "exif-artist": "Writer",
-       "exif-copyright": "Copyricht hauder",
+       "exif-copyright": "Copiericht hauder",
        "exif-flashpixversion": "Supportit Flashpix version",
        "exif-colorspace": "Colour space",
        "exif-componentsconfiguration": "Meanin o ilka component",
        "exif-urgency-high": "Hei ($1)",
        "exif-urgency-other": "Uiser-defined prioritie ($1)",
        "watchlistall2": "aw",
-       "namespacesall": "aa",
+       "namespacesall": "aw",
        "monthsall": "aw",
        "confirmemail": "Confirm wab-mail address",
-       "confirmemail_noemail": "Ye dinna hae a valid email address set in yer [[Special:Preferences|uiser preferences]].",
+       "confirmemail_noemail": "Ye dinna hae ae valid email address set in yer [[Special:Preferences|uiser preferances]].",
        "confirmemail_text": "This wiki needs ye tae validate yer wab-mail address\nafore uisin wab-mail featurs. Acteevate the button ablo tae send a confirmation\nmail til yer address. The mail will incluide ae link containin ae code; laid the\n link in yer brouser tae confirm that yer wab-mail address is guid.",
        "confirmemail_pending": "Ae confirmation code haes awreadie been wab-mailed til ye;\ngif ye recantlie cræftit yer accoont, ye micht wish tae wait ae few minutes fer it tae arrive afore speirin fer ae new code.",
        "confirmemail_send": "Mail ae confirmation code",
        "confirmemail_invalid": "Onvalid confirmation code.\nThe code micht hae expired.",
        "confirmemail_needlogin": "Please $1 fer tae confirm yer wab-mail address.",
        "confirmemail_success": "Yer wab-mail address haes been confirmed. Ye can nou [[Special:UserLogin|login]]  n enjoy the wiki.",
-       "confirmemail_loggedin": "Yer e-mail address haes noo been confirmed.",
+       "confirmemail_loggedin": "Yer e-mail address haes nou been confirmed.",
        "confirmemail_subject": "{{SITENAME}} wab-mail address confirmation",
        "confirmemail_body": "Somebodie, maist likely ye, fae IP address $1,\nhaes registered aen accoont \"$2\" wi this wab-mail address oan {{SITENAME}}.\n\nTae confirm that this accoont reallie is yers n acteevate wab-mail featurs oan {{SITENAME}}, apen this link in yer brouser:\n\n$3\n\nGif ye div *naw* register the accoont, follae this link\ntae cancel the wab-mail address confirmation:\n\n$5\n\nThis confirmation code will expire oan $4.",
        "confirmemail_body_changed": "Somebodie, proabablie ye, from IP address $1,\nhaes chynged the wab-mail address o the accoont \"$2\" til this address oan {{SITENAME}}.\n\nTae confirm that this accoont reallie dis belang til ye n reacteevate\nwab-mail featurs oan {{SITENAME}}, apen this link in yer brouser:\n\n$3\n\nGif the account dis *na* belang til ye, follae this link\ntae cancel the wab-mail address confirmation:\n\n$5\n\nThis confirmation code will die oan $4.",
        "table_pager_limit": "Shaw $1 eetems per page",
        "table_pager_limit_label": "Eetems per page:",
        "table_pager_limit_submit": "Gang",
-       "table_pager_empty": "Nae results",
+       "table_pager_empty": "Nae ootcomes",
        "autosumm-blank": "Blanked the page",
        "autosumm-replace": "Replacin page wi '$1'",
        "autoredircomment": "Reguidin til [[$1]]",
        "specialpages-group-media": "Media reports n uplaids",
        "specialpages-group-users": "Uisers n richts",
        "specialpages-group-highuse": "Hei uiss pages",
-       "specialpages-group-pages": "leet o pages",
+       "specialpages-group-pages": "Leets o pages",
        "specialpages-group-pagetools": "Page tuils",
        "specialpages-group-wiki": "Data n tuils",
        "specialpages-group-redirects": "Reguidin byordinair pages",
index b96e7e2..bf7e661 100644 (file)
@@ -33,7 +33,7 @@
        "tog-shownumberswatching": "Prikaži broj korisnika koji prate",
        "tog-oldsig": "Postojeći potpis:",
        "tog-fancysig": "Smatraj potpis kao wikitekst (bez automatskog linka)",
-       "tog-uselivepreview": "Koristite pretpregled uživo (potreban JavaScript) (eksperimentalno)",
+       "tog-uselivepreview": "Koristi pretpregled uživo (eksperimentalno)",
        "tog-forceeditsummary": "Opomeni me pri unosu praznog sažetka",
        "tog-watchlisthideown": "Sakrij moje izmjene sa spiska praćenih članaka",
        "tog-watchlisthidebots": "Sakrij izmjene botova sa spiska praćenih članaka",
@@ -46,6 +46,7 @@
        "tog-showhiddencats": "Prikaži skrivene kategorije",
        "tog-norollbackdiff": "Nakon povrata zanemari prikaz razlika",
        "tog-useeditwarning": "Upozori me kad napuštam stranicu za uređivanje bez snimanja izmjena",
+       "tog-prefershttps": "Uvijek koristi sigurnu vezu kod prijave",
        "underline-always": "Uvijek",
        "underline-never": "Nikad",
        "underline-default": "prema skinu ili postavkama preglednika",
        "newwindow": "(otvara se u novom prozoru)",
        "cancel": "Odustani - Одустани",
        "moredotdotdot": "Još...",
-       "morenotlisted": "Više nije prikazano...",
+       "morenotlisted": "Ovaj spisak nije kompletan.",
        "mypage": "Moja stranica",
        "mytalk": "Moj razgovor / Мој разговор",
        "anontalk": "Razgovor za ovu IP adresu",
        "permalink": "Trajni link",
        "print": "Štampa",
        "view": "Vidi",
+       "view-foreign": "Vidi na $1",
        "edit": "Uredi / Уреди",
+       "edit-local": "Uredi lokalni opis",
        "create": "Napravi",
+       "create-local": "Dodaj lokalni opis",
        "editthispage": "Uredite ovu stranicu",
        "create-this-page": "Stvori ovu stranicu",
        "delete": "Obrisati - Обрисати",
        "jumptonavigation": "navigacija",
        "jumptosearch": "pretraga",
        "view-pool-error": "Žao nam je, serveri su trenutno preopterećeni.\nPreviše korisnika pokušava da pregleda ovu stranicu.\nMolimo pričekajte trenutak prije nego što ponovno pokušate pristupiti ovoj stranici.\n\n$1",
+       "generic-pool-error": "Žao nam je, serveri su trenutno preopterećeni.\nPreviše korisnika pokušava da pregleda ovu stranicu.\nMolimo pričekajte trenutak prije nego što ponovno pokušate pristupiti ovoj stranici.",
        "pool-timeout": "Zaustavi čekanje za zaključavanje",
        "pool-queuefull": "Red na pool je prenapunjen",
        "pool-errorunknown": "nepoznata greška",
        "versionrequiredtext": "Potrebna je verzija $1 MediaWikija da bi se koristila ova stranica. Pogledaj [[Special:Version|verziju]].",
        "ok": "da",
        "retrievedfrom": "Dobavljeno iz \"$1\"",
-       "youhavenewmessages": "Imate / Имате $1 ($2).",
+       "youhavenewmessages": "Imate $1 ($2).",
        "youhavenewmessagesfromusers": "Imate $1 od {{PLURAL:$3|drugog korisnika|$3 korisnika|$3 korisnika}} ($2).",
        "youhavenewmessagesmanyusers": "Imate $1 od mnogo korisnika ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|novu poruku|$1 nove poruke|$1 novih poruka}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|posljednje uređivanje|$ posljednja uređivanja|$ posljednjih uređivanja}}",
+       "newmessageslinkplural": "{{PLURAL:$1|novu poruku|999=nove poruke}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|posljednju izmenu|999=posljednje izmjene}}",
        "youhavenewmessagesmulti": "Imate nove poruke na $1",
        "editsection": "uredi",
        "editold": "uredi",
        "nospecialpagetext": "<strong>Zatražili ste nevaljanu posebnu stranicu.</strong>\n\nLista valjanih posebnih stranica se može naći na [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Greška - Грешка",
        "databaseerror": "Greška u bazi podataka",
+       "databaseerror-text": "Došlo je do greške u upitu baze podataka. Možda je u pitanju \nsoftverska pogreška.",
+       "databaseerror-textcl": "Došlo je do greške u upitu baze podataka.",
+       "databaseerror-query": "Upit: $1",
+       "databaseerror-function": "Funkcija: $1",
+       "databaseerror-error": "Greška: $1",
        "laggedslavemode": "'''Upozorenje''': Stranica ne mora sadržavati posljednja ažuriranja.",
        "readonly": "Baza podataka je zaključana",
        "enterlockreason": "Unesite razlog za zaključavanje, uključujući procjenu vremena otključavanja",
        "cannotdelete": "Ne može se obrisati stranica ili datoteka \"$1\".\nMoguće je da ju je neko drugi već obrisao.",
        "cannotdelete-title": "Brisanje stranice \"$1\" nije moguće",
        "delete-hook-aborted": "Brisanje prekinuto softverskim priključkom (hook).\nNema obrazloženja ili poruke o grešci.",
+       "no-null-revision": "Nije se mogla stvoriti nova ništavna revizija za stranicu \"$1\"",
        "badtitle": "Loš naslov",
        "badtitletext": "Zatražena stranica je bila nevaljana, prazna ili neispravno povezana s među-jezičkim ili inter-wiki naslovom.\nMože sadržavati jedno ili više slova koja se ne mogu koristiti u naslovima.",
        "perfcached": "Sledeći podaci su keširani i mogu biti zastareli. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata|$1 rezultata}}.",
        "invalidtitle-knownnamespace": "Neispravan naslov s imenskim prostorom „$2“ i tekstom „$3“",
        "invalidtitle-unknownnamespace": "Neispravan naslov s imenskim prostorom br. $1 i tekstom „$2“",
        "exception-nologin": "Niste prijavljeni",
-       "exception-nologin-text": "Ova stranica ili aktivnost zahtijeva da budete prijavljeni na ovom wikiju.",
+       "exception-nologin-text": "Molimo [[Special:Userlogin|prijavite se]] da biste pristupili ovoj stranici ili radnji.",
+       "exception-nologin-text-manual": "Molimo $1 da biste pristupili ovoj stranici ili radnji.",
        "virus-badscanner": "Loša konfiguracija: nepoznati anti-virus program: ''$1''",
        "virus-scanfailed": "skeniranje nije uspjelo (code $1)",
        "virus-unknownscanner": "nepoznati anti-virus program:",
-       "logouttext": "'''Sad ste odjavljeni.'''\n\nMožete nastaviti da koristite {{SITENAME}} anonimno, ili se ponovo <span class='plainlinks'>[$1 prijaviti]</span> kao isti ili kao drugi korisnik.\nObratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste još uvijek prijavljeni, dok ne očistite keš svog preglednika.",
+       "logouttext": "'''Sad ste odjavljeni.'''\n\nObratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste još uvijek prijavljeni, dok ne očistite keš svog preglednika.",
        "welcomeuser": "Dobro došli, $1!",
        "welcomecreation-msg": "Vaš korisnički račun je napravljen.\nNe zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].",
        "yourname": "Vaše korisničko ime / Ваше корисничко име",
        "gotaccount": "Imate račun? '''$1'''.",
        "gotaccountlink": "Prijavite se / Пријавите се",
        "userlogin-resetlink": "Zaboravili ste detalje vaše prijave?",
-       "userlogin-resetpassword-link": "Resetirajte svoju lozinku/zaporku",
+       "userlogin-resetpassword-link": "Zaboravili ste lozinku/zaporku?",
+       "userlogin-helplink2": "Pomoć pri prijavljivanju",
+       "userlogin-loggedin": "Već ste prijavljeni kao {{GENDER:$1|$1}}.\nKoristite donji obrazac da biste se prijavili kao drugi korisnik.",
+       "userlogin-createanother": "Stvori još jedan račun",
        "createacct-emailrequired": "E-mail adresa",
        "createacct-emailoptional": "E-mail adresa (opcionalno)",
        "createacct-email-ph": "Unesite svoju E-mail adresu",
        "createacct-another-email-ph": "Postavite E-mail adresu",
-       "createaccountmail": "Koristite privremenu slučajno stvorenu lozinku i pošaljite na dolje specificiranu e-mail adresu",
+       "createaccountmail": "Koristite privremenu, slučajno stvorenu šifru/lozinku i pošaljite na navedenu adrеsu e-pošte",
        "createacct-realname": "Stvarno ime (opcionalno)",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "passwordtooshort": "Lozinka mora imati najmanje {{PLURAL:$1|1 znak|$1 znakova}}.",
        "password-name-match": "Vaša lozinka mora biti različita od Vašeg korisničkog imena.",
        "password-login-forbidden": "Korištenje ovog korisničkog imena i lozinke je zabranjeo.",
-       "mailmypassword": "Pošalji mi novu lozinku putem E-maila",
+       "mailmypassword": "Resetiraj lozinku/zaporku",
        "passwordremindertitle": "Nova privremena lozinka za {{SITENAME}}",
        "passwordremindertext": "Neko (vjerovatno Vi, sa IP adrese $1) je zahtjevao da vam pošaljemo novu šifru za {{SITENAME}}  ($4). Privremena šifra za korisnika \"$2\" je napravljena i glasi \"$3\". Ako ste to željeli, sad treba da se prijavite i promjenite šifru.\nVaša privremena šifra će isteči za {{PLURAL:$5|$5 dan|$5 dana}}.\n\nAko je neko drugi napravio ovaj zahtjev ili ako ste se sjetili vaše šifre i ne želite više da je promjenite, možete da ignorišete ovu poruku i da nastavite koristeći vašu staru šifru.",
        "noemail": "Ne postoji adresa e-maila za korisnika \"$1\".",
        "noemailcreate": "Morate da navedete valjanu e-mail adresu",
        "passwordsent": "Nova šifra je poslata na e-mail adresu korisnika \"$1\".\nMolimo Vas da se prijavite pošto je primite.",
        "blocked-mailpassword": "Da bi se spriječila nedozvoljena akcija, Vašoj IP adresi je onemogućeno uređivanje stranica kao i mogućnost zahtijevanje nove šifre.",
-       "eauthentsent": "Na navedenu adresu poslan je e-mail s potvrdom.\nPrije nego što pošaljemo daljnje poruke, molimo vas da otvorite e-mail i slijedite u njemu sadržana uputstva da potvrdite da ste upravo vi kreirali korisnički račun.",
+       "eauthentsent": "Na navedenu adresu poslana je e-poruka s potvrdom.\nPrije nego što pošaljemo daljnje poruke, pratite uputstva s e-pošte da biste potvrdili da je račun zaista Vaš.",
        "throttled-mailpassword": "Već Vam je poslan e-mail za promjenu šifre u {{PLURAL:$1|zadnjih sat vremena|zadnja $1 sata|zadnjih $1 sati}}.\nDa bi se spriječila zloupotreba, može se poslati samo jedan e-mail za promjenu šifre {{PLURAL:$1|svakih sat vremena|svaka $1 sata|svakih $1 sati}}.",
        "mailerror": "Greška pri slanju e-pošte: $1",
        "acct_creation_throttle_hit": "Posjetioci na ovoj wiki koji koriste Vašu IP adresu su već napravili {{PLURAL:$1|$1 račun|$1 računa}} u zadnjih nekoliko dana, što je najveći broj dopuštenih napravljenih računa za ovaj period.\nKao rezultat, posjetioci koji koriste ovu IP adresu ne mogu trenutno praviti više računa.",
-       "emailauthenticated": "Vaša e-mail adresa je autentificirana na $2 u $3.",
-       "emailnotauthenticated": "Vaša e-mail adresa još nije autentificirana.\nNijedan e-mail neće biti poslan za bilo koju uslugu od slijedećih.",
+       "emailauthenticated": "Vaša adresa e-pošte potvrđena je $2 u $3.",
+       "emailnotauthenticated": "Vaša adresa e-pošte još nije potvrđena.\nNijedna e-poruka neće biti poslana za bilo koju uslugu od sljedećih.",
        "noemailprefs": "Unesite e-mail adresu za osposobljavanje slijedećih usluga.",
        "emailconfirmlink": "Potvrdite Vašu e-mail adresu",
        "invalidemailaddress": "Ova e-mail adresa ne može biti prihvaćena jer je u neodgovarajućem obliku.\nMolimo vas da unesete ispravnu adresu ili ostavite prazno polje.",
        "cannotchangeemail": "Na ovom wikiju ne možete promeniti e-mail adresu računa.",
        "emaildisabled": "Ova web-stranica ne može da šalje e-poruke.",
        "accountcreated": "Korisnički nalog kreiran / Кориснички налог креиран",
-       "accountcreatedtext": "Korisnički račun za $1 je kreiran. Кориснички налог за $1 је креиран.",
+       "accountcreatedtext": "Korisnički račun za [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|razgovor]]) je napravljen.",
        "createaccount-title": "Pravljenje korisničkog računa za {{SITENAME}}",
        "createaccount-text": "Neko je napravio korisnički račun za vašu e-mail adresu na {{SITENAME}} ($4) sa imenom \"$2\", i sa šifrom \"$3\".\nTrebali biste se prijaviti i promjeniti šifru.\n\nMožete ignorisati ovu poruku, ako je korisnički račun napravljen greškom.",
-       "login-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate prije nego što pokušate ponovo.",
+       "login-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
        "login-abort-generic": "Vaša prijava nije bila uspješna – Prekinuto",
        "loginlanguagelabel": "Jezik: $1",
        "suspicious-userlogout": "Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.",
+       "createacct-another-realname-tip": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje za vaš rad.",
        "pt-login": "Prijavi me / Пријави ме",
        "pt-login-button": "Prijavi me / Пријави ме",
        "pt-createaccount": "Napraviti novi nalog / Направити нови налог",
        "user-mail-no-addy": "Pokušaj slanja e-maila bez e-mail adrese.",
        "user-mail-no-body": "Pokušano slanje e-maila s praznim ili nerazumno kratkim sadržajem.",
        "changepassword": "Promijeni lozinku",
-       "resetpass_announce": "Prijavili ste se sa privremenim kodom koji ste dobili na e-mail.\nDa biste završili prijavu, morate unijeti novu šifru ovdje:",
+       "resetpass_announce": "Da biste završili prijavu, podesite novu lozinku ovde.",
        "resetpass_header": "Obnovi lozinku za račun",
        "oldpassword": "Stara šifra:",
        "newpassword": "Nova šifra:",
        "retypenew": "Ukucajte ponovo novu šifru:",
        "resetpass_submit": "Odredi lozinku i prijavi se",
        "changepassword-success": "Vaša šifra je uspiješno promjenjena! Prijava u toku...",
+       "changepassword-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
        "resetpass_forbidden": "Šifre ne mogu biti promjenjene",
        "resetpass-no-info": "Morate biti prijavljeni da bi ste pristupili ovoj stranici direktno.",
        "resetpass-submit-loggedin": "Promijeni lozinku",
        "resetpass-submit-cancel": "Odustani",
        "resetpass-wrong-oldpass": "Privremena ili trenutna lozinka nije valjana.\nMožda ste već uspješno promijenili Vašu lozinku ili ste tražili novu privremenu lozinku.",
+       "resetpass-recycled": "Molimo resetirajte vašu lozinku/zaporku u nešto drugo od vaše trenutne lozinke/zaporke.",
+       "resetpass-temp-emailed": "Prijavili ste se sa privremenim kodom iz e-pošte.\nDa biste završili prijavljivanje morate postaviti novu lozinku ovde:",
        "resetpass-temp-password": "Privremena lozinka:",
        "resetpass-abort-generic": "Promjenu lozinke/zaporke je prekinula ekstenzija.",
+       "resetpass-expired": "Vaša lozinka je istekla. Postavite novu lozinku da biste se prijavili.",
+       "resetpass-expired-soft": "Vaša lozinka je istekla i morate postaviti novu. Postavite novu lozinku ili kliknite „{{int:resetpass-submit-cancel}}“ da je postavite kasnije.",
+       "resetpass-validity-soft": "Vaša loznika nije valjana: $1\n\nMolimo da sada odaberete novu lozinku ili kliknete \"{{int:resetpass-submit-cancel}}\" kako bi je resetirali kasnije.",
        "passwordreset": "Ponovno postavi lozinku",
        "passwordreset-text-one": "Dovršite ovaj obrazac kako biste resetirali svoju lozinku/zaporku.",
        "passwordreset-text-many": "{{PLURAL:$1|Ispunite jedno od polja kako bi ste resetirali svoju lozinku/zaporku.}}",
        "changeemail-password": "Tvoja šifra/lozinka za {{SITENAME}}:",
        "changeemail-submit": "Promijeni e-mail",
        "changeemail-cancel": "Odustani",
+       "changeemail-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
+       "resettokens": "Resetirajte tokene",
+       "resettokens-text": "Možete resetirati tokene koji dozvoljavaju pristup određenim privatnim podacima povezanim sa vašim računom ovdje.\n\nTo možete učiniti ako ste ih slučajno podijelili sa nekim ili ako je vaš račun kompromitiran.",
+       "resettokens-no-tokens": "Nema tokena za resetiranje.",
+       "resettokens-legend": "Resetiranje tokena",
+       "resettokens-tokens": "Tokeni:",
+       "resettokens-token-label": "$1 (trenutna vrijednost: $2)",
+       "resettokens-watchlist-token": "Token za web feed (Atom/RSS) [[Special:Watchlist|promjena za vašem spisku praćenja]]",
+       "resettokens-done": "Tokeni resetirani.",
+       "resettokens-resetbutton": "Resetiraj odabrane tokene",
        "bold_sample": "Podebljan tekst",
        "bold_tip": "Podebljan tekst",
        "italic_sample": "Kurzivan tekst",
        "confirmedittext": "Morate potvrditi Vašu e-mail adresu prije nego počnete mijenjati stranice.\nMolimo da postavite i verifikujete Vašu e-mail adresu putem Vaših [[Special:Preferences|korisničkih opcija]].",
        "nosuchsectiontitle": "Ne mogu pronaći sekciju",
        "nosuchsectiontext": "Pokušali ste uređivati sekciju koja ne postoji.\nMožda je premještena ili obrisana dok ste pregledavali stranicu.",
-       "loginreqtitle": "Potrebno je da se [[{{ns:-1}}:Userlogin|prijavite]]",
+       "loginreqtitle": "Potrebno je prijavljivanje",
        "loginreqlink": "prijavi se",
        "loginreqpagetext": "Morate $1 da bi ste vidjeli druge stranice.",
        "accmailtitle": "Šifra je poslana!\n\n\nШифра је послата!",
-       "accmailtext": "Šifra za nalog '$1' je poslana na adresu $2.\n\n\nШифра за налог '$1' је послата на адресу $2.",
+       "accmailtext": "Nasumično odabrana šifra za [[User talk:$1|$1]] je poslata na adresu $2.\n\nŠifra/lozinka za ovaj novi račun može biti promijenjena na stranici ''[[Special:ChangePassword|izmjene šifre]]'' nakon prijave.",
        "newarticle": "(Novi)",
        "newarticletext": "Preko linka ste došli na stranicu koja još uvijek ne postoji.\n* Ako želite stvoriti stranicu, počnite tipkati u okviru dolje (v. [$1 stranicu za pomoć] za više informacija).\n* Ukoliko ste došli greškom, pritisnike dugme '''Nazad''' ('''back''') na vašem pregledniku.",
        "anontalkpagetext": "----''Ovo je stranica za razgovor za anonimnog korisnika koji još nije napravio račun ili ga ne koristi.\nZbog toga moramo da koristimo brojčanu IP adresu kako bismo identifikovali njega ili nju.\nTakvu adresu može dijeliti više korisnika.\nAko ste anonimni korisnik i mislite da su vam upućene nebitne primjedbe, molimo Vas da [[Special:UserLogin/signup|napravite račun]] ili se [[Special:UserLogin|prijavite]] da biste izbjegli buduću zabunu sa ostalim anonimnim korisnicima.''",
        "copyrightwarning": "Molimo da uzmete u obzir kako se smatra da su svi doprinosi u {{SITENAME}} izdani pod $2 (v. $1 za detalje).\nUkoliko ne želite da vaše pisanje bude nemilosrdno uređivano i redistribuirano po tuđoj volji, onda ga nemojte ovdje objavljivati.<br />\nTakođer obećavate kako ste ga napisali sami ili kopirali iz izvora u javnoj domeni ili sličnog slobodnog izvora.\n'''NEMOJTE SLATI RAD ZAŠTIĆEN AUTORSKIM PRAVIMA BEZ DOZVOLE!'''",
        "copyrightwarning2": "Zapamtite da svaki doprinos na stranici {{SITENAME}} može biti izmijenjen, promijenjen ili uklonjen od strane ostalih korisnika. Ako ne želite da ovo desi sa Vašim tekstom, onda ga nemojte slati ovdje.<br />\nTakođer nam garantujete da ste ovo Vi napisali, ili da ste ga kopirali iz javne domene ili sličnog slobodnog izvora informacija (pogledajte $1 za više detalja).\n'''NE ŠALJITE DJELA ZAŠTIĆENA AUTORSKIM PRAVOM BEZ DOZVOLE!'''",
        "longpageerror": "'''Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
-       "readonlywarning": "<font color=\"#FF0000\">'''PAŽNJA:'''</font> Baza je upravo zaključana zbog održavanja,\ntako da nećete moći da snimite svoje izmene upravo sada. Možda želite da iskopirate i nalepite\ntekst u tekst editor i snimite ga za kasnije.\n<br>\n<font color=\"#FF0000\">'''ПАЖЊА:'''</font> База је управо закључана због одржавања,\nтако да нећете моћи да снимите своје измене управо сада. Можда желите да ископирате и налепите\nтекст у текст едитор и снимите га за касније.",
+       "readonlywarning": "<strong>Upozorenje: baza podataka je zaključana radi održavanja, tako da trenutno nećete moći da sačuvate izmene.</strong>\nMožda biste želeli sačuvati tekst za kasnije u nekoj tekstualnoj datoteci.\n\nAdministrator koji je zaključao bazu dao je sledeće objašnjenje: $1",
        "protectedpagewarning": "'''PAŽNJA: Ova stranica je zaključana tako da samo korisnici sa administratorskim privilegijama mogu da je mijenjaju.'''\nPosljednja stavka u registru je prikazana ispod kao referenca:",
        "semiprotectedpagewarning": "'''Pažnja:''' Ova stranica je zaključana tako da je samo registrovani korisnici mogu uređivati.\nPosljednja stavka registra je prikazana ispod kao referenca:",
        "cascadeprotectedwarning": "'''Upozorenje:''' Ova stranica je zaključana tako da je samo administratori mogu mijenjati, jer je ona uključena u {{PLURAL:$1|ovu, lančanu povezanu, zaštićenu stranicu|sljedeće, lančano povezane, zaštićene stranice}}:",
        "content-failed-to-parse": "Ne mogu da raščlanim sadržaj tipa $2 za model $1: $3",
        "invalid-content-data": "Neispravni podaci sadržaja",
        "content-not-allowed-here": "Sadržaj modela „$1“ nije dozvoljen na stranici [[$2]]",
-       "editwarning-warning": "Napuštanje ove stranice može dovesti do gubitka svih promjena koje ste načinili.\nAko ste prijavljeni, možete isključiti ovo upozorenje u sekciji \"Uređivanje\" vaših postavki.",
+       "editwarning-warning": "Ako napustite ovu stranicu, izgubićete sve izmene koje ste napravili.\nAko ste prijavljeni, možete onemogućiti ovo upozorenje u svojim podešavanjima, u odeljku \"{{int:prefs-editing}}\".",
+       "editpage-notsupportedcontentformat-title": "Format sadržaja nije podržan",
+       "editpage-notsupportedcontentformat-text": "Format sadržaja $1 nije podržan modelom sadržaja $2.",
        "content-model-wikitext": "wikitekst",
        "content-model-text": "obični tekst",
        "content-model-javascript": "JavaScript",
        "undo-success": "Izmjena se može vratiti.\nMolimo da provjerite usporedbu ispod da budete sigurni da to želite učiniti, a zatim spremite promjene da bi ste završili vraćanje izmjene.",
        "undo-failure": "Izmjene se ne mogu vratiti zbog konflikta sa izmjenama u međuvremenu.",
        "undo-norev": "Izmjena se ne može vratiti jer ne postoji ranija ili je obrisana.",
+       "undo-nochange": "Ovo je uređivanje izgleda već bilo poništeno.",
        "undo-summary": "Poništena izmjena $1 [[Special:Contributions/$2|korisnika $2]] ([[User talk:$2|razgovor]])",
        "undo-summary-username-hidden": "Poništi izmjenu $1 od skrivenog korisnika",
        "cantcreateaccounttitle": "Nije moguće napraviti korisnički račun",
        "cantcreateaccount-text": "Pravljenje korisničkog računa sa ove IP adrese ('''$1''') je blokirano od strane [[User:$3|$3]].\n\nRazlog koji je naveo $3 je ''$2''",
+       "cantcreateaccount-range-text": "Stvaranje računa od IP adresa iz pojasa'''$1''', koji uključuje vašu IP adresu ('''$4'''), je blokirao/la [[User:$3|$3]].\n\nRazlog koji je dao/la $3 je ''$2''",
        "viewpagelogs": "Pogledaj protokole ove stranice",
        "nohistory": "Ne postoji historija izmjena za ovu stranicu.",
        "currentrev": "Trenutna revizija",
        "revdelete-no-file": "Navedena datoteka ne postoji.",
        "revdelete-show-file-confirm": "Da li ste sigurni da želite pogledati obrisanu reviziju datoteke \"<nowiki>$1</nowiki>\" od $2 u $3?",
        "revdelete-show-file-submit": "Da",
+       "revdelete-selected-text": "{{PLURAL:$1|Izabrana izmjena|Izabrane izmjene}} [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Izabrana verzija datoteke|Izabrane verzije datoteke}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Označena stavka registra|Označene stavke registra}}:",
+       "revdelete-text-text": "Izbrisane revizije će se još pojavljivati u historiji stranice, ali dijelovi njihovog sadržaja neće biti javno dostupni.",
+       "revdelete-text-file": "Izbrisane verzije datoteke će se još pojavljivati u historiji datoteke, ali dijelovi sadržaja neće biti dostupni javnosti.",
+       "logdelete-text": "Izbrisane stavke u registru događaja će se još pojavljivati u registrima, ali dijelovi njihovog sadržaja neće biti javno dostupni.",
+       "revdelete-text-others": "Drugi administratori {{SITENAME}} će još uvijek moći pristupiti skrivenom sadržaju i mogu ga ponovno odbrisati kroz isti interfejs, ukoliko nisu postavljena dodatna ograničenja.",
        "revdelete-confirm": "Molimo potvrdite da namjeravate ovo učiniti, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
-       "revdelete-suppress-text": "Ograničenja bi trebala biti korištena '''samo''' u sljedećim slučajevima:\n* Osjetljive korisničke informacije\n*: ''kućne adrese, brojevi telefona, brojevi bankovnih kartica itd.''",
+       "revdelete-suppress-text": "Sakrivanje izmjena bi se trebalo koristiti <strong>samo</strong> za sljedeće slučajeve:\n* potencijalno klevetničke informacije\n* neprimjerene lične informacije\n*: <em>kućne adrese i telefonski brojevi, matični i lični identifikacijski brojevi itd.</em>",
        "revdelete-legend": "Postavi ograničenja vidljivosti",
-       "revdelete-hide-text": "Sakrij tekst revizije",
+       "revdelete-hide-text": "Tekst revizije",
        "revdelete-hide-image": "Sakrij sadržaj datoteke",
        "revdelete-hide-name": "Sakrij akciju i cilj",
-       "revdelete-hide-comment": "Sakrij izmjene komentara",
+       "revdelete-hide-comment": "Opis izmjene",
        "revdelete-hide-user": "Sakrij korisničko ime / IP adresu korisnika koji je uređivao stranicu",
        "revdelete-hide-restricted": "Ograniči podatke za administratore kao i za druge korisnike",
        "revdelete-radio-same": "(ne mijenjaj)",
-       "revdelete-radio-set": "Da",
-       "revdelete-radio-unset": "Ne",
+       "revdelete-radio-set": "Sakriveno",
+       "revdelete-radio-unset": "Vidljivo",
        "revdelete-suppress": "Sakrij podatke od administratora kao i od drugih",
        "revdelete-unsuppress": "Ukloni ograničenja na vraćenim revizijama",
        "revdelete-log": "Razlog:",
        "showhideselectedversions": "Pokaži/sakrij odabrane verzije",
        "editundo": "ukloni ovu izmjenu - уклони ову измену",
        "diff-empty": "(nema razlike)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}} istog korisnika)",
+       "diff-multi-otherusers": "({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}} {{PLURAL:$2|jednog|$2}} korisnika)",
        "diff-multi-manyusers": "({{PLURAL:$1|Nije prikazana jedna međuverzija|Nisu prikazane $1 međuverzije|Nije prikazano $1 međuverzija}}) od strane {{PLURAL:$2|korisnika|korisnika}}",
        "difference-missing-revision": "Ne mogu da pronađem {{PLURAL:$2|jednu izmenu|$2 izmene|$2 izmena}} od ove razlike ($1).\n\nOvo se obično dešava kada pratite zastarjelu vezu do stranice koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} evidenciji brisanja].",
        "searchresults": "Rezultati pretrage",
        "textmatches": "Tekst stranice odgovara",
        "notextmatches": "Tekst stranice ne odgovara",
        "prevn": "prethodna {{PLURAL:$1|$1}}",
-       "nextn": "sljedećih - следећих $1",
+       "nextn": "{{PLURAL:$1|slijedeći $1|slijedećih $1}}",
        "prevn-title": "{{PLURAL:$1|Prethodni $1 rezultat|Prethodna $1 rezultata|Prethodnih $1 rezultata}}",
        "nextn-title": "{{PLURAL:$1|Slijedeći $1 rezultat|Slijedeća $1 rezultata|Slijedećih $1 rezultata}}",
        "shown-title": "Pokaži $1 {{PLURAL:$1|rezultat|rezultata}} po stranici",
        "viewprevnext": "Pogledaj ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Postoji stranica pod nazivom \"[[:$1]]\" na ovoj wiki'''",
-       "searchmenu-new": "'''Napravi stranicu \"[[:$1|$1]]\" na ovoj wiki!'''",
+       "searchmenu-new": "<strong>Napravi stranicu \"[[:$1]]\" na ovoj wiki!</strong> {{PLURAL:$2|0=|Pogledajte također straniu pronađenu vašom pretragom.|Pogledajte također i vaše rezultate pretrage.}}",
        "searchprofile-articles": "Stranice sadržaja",
        "searchprofile-project": "Stranice pomoći i projekta",
        "searchprofile-images": "Multimedija",
        "search-result-score": "Relevantnost: $1%",
        "search-redirect": "(preusmjeravanje $1)",
        "search-section": "(sekcija $1)",
+       "search-file-match": "(odgovara sadržaju datoteke)",
        "search-suggest": "Da li ste mislili: $1",
        "search-interwiki-caption": "Srodni projekti",
-       "search-interwiki-default": "$1 rezultati:",
+       "search-interwiki-default": "Rezultati od $1:",
        "search-interwiki-more": "(više)",
        "search-relatedarticle": "Povezano",
        "searcheverything-enable": "Pretraga u svim imenskim prostorima",
        "searchrelated": "povezano",
        "searchall": "sve",
        "showingresults": "Dole {{PLURAL:$1|je prikazan '''1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}} počev od '''$2'''.",
+       "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
        "showingresultsnum": "Dolje {{PLURAL:$3|je prikazan '''1''' rezultat|su prikazana '''$3''' rezultata|je prikazano '''$3''' rezultata}} počev od #'''$2'''.",
        "showingresultsheader": "{{PLURAL:$5|Rezultat '''$1''' od '''$3'''|Rezultati '''$1 - $2''' od '''$3'''}} za '''$4'''",
        "search-nonefound": "Nisu pronađeni rezultati koji odgovaraju upitu.",
        "preferences": "Postavke / Подешавања",
        "mypreferences": "Moje postavke / Моја подешавања",
        "prefs-edits": "Broj izmjena:",
+       "prefsnologintext2": "Molimo $1 kako bi promijenili vaše postavke.",
        "prefs-skin": "Izgled (skin)",
        "skin-preview": "Pretpregled",
        "datedefault": "Bez preferenci",
        "prefs-email": "E-mail opcije",
        "prefs-rendering": "Izgled",
        "saveprefs": "Snimi postavke",
-       "restoreprefs": "Vrati sve pretpostavljene postavke",
+       "restoreprefs": "Vrati sve na podrazumijevano (u svim odjeljcima)",
        "prefs-editing": "Uređivanje",
        "rows": "Redova:",
        "columns": "Kolona:",
        "recentchangesdays-max": "(najviše $1 {{PLURAL:$1|dan|dana}})",
        "recentchangescount": "Broj uređivanja za prikaz po pretpostavkama:",
        "prefs-help-recentchangescount": "Ovo uključuje nedavne izmjene, historije stranice i registre.",
+       "prefs-help-watchlist-token2": "Ovo je tajni ključ prema sažetku Vašeg popisa praćenja. Svaki suradnik kojem je poznat, moći će čitati Vaš popis praćenih stranica. Ne dijelite ga ni s kim. [[Special:ResetTokens|Kliknite ovdje ako ga želite ponovo postaviti]].",
        "savedprefs": "Vaša postavke su snimljene.",
        "timezonelegend": "Vremenska zona / Временска зона",
        "localtime": "Lokalno vrijeme:",
        "prefs-help-signature": "Komentari na stranicama za razgovor trebaju biti potpisani sa \"<nowiki>~~~~</nowiki>\" koje će biti pretvoreno u vaš potpis i vrijeme.",
        "badsig": "Loš sirovi potpis.\nProvjerite HTML tagove.",
        "badsiglength": "Vaš potpis je predug.\nMora biti manji od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
-       "yourgender": "Spol:",
-       "gender-unknown": "neodređen",
-       "gender-male": "Muški",
-       "gender-female": "Ženski",
-       "prefs-help-gender": "Opcionalno: koristi se za ispravke gramatičkog roda u porukama softvera.\nOva informacija će biti javna.",
+       "yourgender": "Kako želite da se predstavite?",
+       "gender-unknown": "Preferiram da se ne odredim",
+       "gender-male": "On uređuje wiki stranice",
+       "gender-female": "Ona uređuje wiki stranice",
+       "prefs-help-gender": "Postavljanje ove preferencije nije obavezno.\nSoftver koristi ovu vrijednost kako bi vam se obratio i spomenuo vas drugima koristeći vaš gramatički rod.\nOva informacija će biti javna.",
        "email": "E-mail",
        "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.",
-       "prefs-help-email": "* E-mail (nije obavezno): omogućuje drugima da Vas kontaktiraju na korisničkoj strani ili strani za razgovor bez javnog pokazivanja Vaše elektronske adrese. Ako zaboravite šifru možemo Vam na ovu adresu poslati novu, privremenu. <br/>\n\n* Е-пошта (није обавезно): Омогућује другима да Вас контактирају на корисничкој страни или страни за разговор без јавног показивања Ваше електронске адресе. Ако заборавите шифру, можемо Вам на ову адресу послати нову, привремену.",
+       "prefs-help-email": "E-mail adresa je opcionalna, ali je potrebna jer omogućava da Vam se pošalje nova šifra u slučaju da je izgubite ili zaboravite.",
        "prefs-help-email-others": "Također možete da odaberete da vas drugi kontaktiraju putem vaše korisničke stranice ili stranice za razgovor bez otkrivanja vašeg identiteta.",
        "prefs-help-email-required": "Neophodno je navesti e-mail adresu.",
        "prefs-info": "Osnovne informacije",
        "prefs-signature": "Potpis",
        "prefs-dateformat": "Format datuma",
        "prefs-timeoffset": "Vremenska razlika",
-       "prefs-advancedediting": "Općenito",
+       "prefs-advancedediting": "Opće opcije",
        "prefs-editor": "Uređivač",
        "prefs-preview": "Pretpregled",
        "prefs-advancedrc": "Napredne opcije",
        "prefs-displayrc": "Postavke displeja",
        "prefs-displaywatchlist": "Postavke prikaza",
        "prefs-diffs": "Razlike",
+       "prefs-help-prefershttps": "Ova mogućnost će stupiti na snagu kod vaše sljedeće prijave.",
+       "prefs-tabs-navigation-hint": "Savjet: Možete koristi lijevu i desnu navigacijsku tipku kako biste se kretali između tabova u popisu tabova.",
        "email-address-validity-valid": "E-mail adresa izgleda valjano",
        "email-address-validity-invalid": "Unesite valjanu e-mail adresu",
        "userrights": "Postavke korisničkih prava",
        "userrights-no-interwiki": "Nemate dopuštenja da uređujete korisnička prava na drugim wikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalna baza.",
        "userrights-nologin": "Morate se [[Special:UserLogin|prijaviti]] sa administratorskim računom da bi ste mogli postavljati korisnička prava.",
-       "userrights-notallowed": "Vaš račun Vam ne daje dozvolu da postavljate i uklanjate korisnička prava.",
+       "userrights-notallowed": "Vaš račun nema privilegije da dodaje ili oduzima prava korisnika.",
        "userrights-changeable-col": "Grupe koje možete mijenjati",
        "userrights-unchangeable-col": "Grupe koje ne možete mijenjati",
-       "userrights-conflict": "Sukob u korisničkim pravima! Molimo pošaljite Vaše promjene ponovno.",
+       "userrights-conflict": "Sukob u izmjeni korisničkih prava! Molimo da razmotrite i potvrdite Vaše promjene.",
        "userrights-removed-self": "Uspješno ste uklonili vlastite prava. Zbog toga više niste u stanju pristupiti ovoj stranici.",
        "group": "Grupa:",
        "group-user": "Korisnici",
        "right-hideuser": "Blokiranje korisničkog imena, i njegovo sakrivanje od javnosti",
        "right-ipblock-exempt": "Zaobilaženje IP blokada, autoblokada i blokada IP grupe",
        "right-proxyunbannable": "Zaobilaženje automatskih blokada proxy-ja",
-       "right-unblockself": "Deblokiranje samog sebe",
+       "right-unblockself": "Deblokiraj samog sebe",
        "right-protect": "Promjena nivoa zaštite i uređivanje kaskadno zaštićenih stranica",
        "right-editprotected": "Uređivanje stranice zaštićenih kao \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Uređivanje stranica zaštićenih kao  \"{{int:protect-level-autoconfirmed}}\"",
        "action-block": "blokiranje uređivanja ovog korisnika",
        "action-protect": "promijeniti nivo zaštite ove stranice",
        "action-rollback": "brzo vraćanje izmjena posljednjeg korisnika koji je mijenjao određenu stranicu",
-       "action-import": "uvoženje ove stranice s drugog wikija",
-       "action-importupload": "uvoženje ove stranice postavljanjem datoteke",
+       "action-import": "uvoženje stranica s drugog wikija",
+       "action-importupload": "uvoženje stranica postavljanjem datoteke",
        "action-patrol": "označavanje tuđih izmjena patroliranim",
        "action-autopatrol": "označavanje vlastitih izmjena kao patroliranih",
        "action-unwatchedpages": "pregled spiska nenadgledanih strana",
        "action-viewmyprivateinfo": "pogledajte svoje privatne informacije",
        "action-editmyprivateinfo": "uredite svoje privatne informacije",
        "nchanges": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmjena od Vaše posljedne posjete}}",
+       "enhancedrc-history": "historija",
        "recentchanges": "Nedavne izmjene / Скорашње измене",
        "recentchanges-legend": "Postavke za Nedavne promjene",
        "recentchanges-summary": "Na ovoj stranici možete pratiti nedavne izmjene.",
        "recentchanges-label-minor": "Ovo je manja izmjena",
        "recentchanges-label-bot": "Ovu je izmjenu učinio bot",
        "recentchanges-label-unpatrolled": "Ova izmjena još nije patrolirana",
-       "recentchanges-legend-newpage": "$1 - nova stranica",
-       "rcnotefrom": "Ispod {{PLURAL:$1|je '''$1''' izmjena|su '''$1''' zadnje izmjene|su '''$1''' zadnjih izmjena}} u {{PLURAL:$2|posljednjem '''$2''' danu|posljednja '''$2''' dana|posljednjih '''$2''' dana}}, od $4, $5.",
+       "recentchanges-label-plusminus": "Veličina stranice promijenila se za ovoliko bajtova",
+       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-newpage": "(također pogledajte [[Special:NewPages|spisak novih stranica]])",
+       "rcnotefrom": "Ispod su izmjene od <strong>$2</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove poruke od / Прикажи нове поруке од $3 $2",
        "rcshowhideminor": "$1 male izmjene / мале измене",
+       "rcshowhideminor-show": "Pokaži",
+       "rcshowhideminor-hide": "Sakrij",
        "rcshowhidebots": "$1 botove / ботове",
-       "rcshowhideliu": "$1 prijavljene korisnike",
+       "rcshowhidebots-show": "Pokaži",
+       "rcshowhidebots-hide": "Sakrij",
+       "rcshowhideliu": "$1 registrovanih korisnika",
+       "rcshowhideliu-show": "Pokaži",
+       "rcshowhideliu-hide": "Sakrij",
        "rcshowhideanons": "$1 anonimne / анонимне",
+       "rcshowhideanons-show": "Pokaži",
+       "rcshowhideanons-hide": "Sakrij",
        "rcshowhidepatr": "$1 označene / означене",
+       "rcshowhidepatr-show": "Pokaži",
+       "rcshowhidepatr-hide": "Sakrij",
        "rcshowhidemine": "$1 vlastite izmjene / сопствене измене",
-       "rclinks": "<br>\nPrikaži zadnjih / Прикажи последњих $1 promjena / промена<br>\nu zadnjih / у последњних $2 dana / дана<br />\n<br>\n$3\n<br>",
+       "rcshowhidemine-show": "Pokaži",
+       "rcshowhidemine-hide": "Sakrij",
+       "rclinks": "Prikaži najskorijih $1 izmjena u posljednjih $2 dana<br />$3",
        "diff": "razl-разл",
        "hist": "his-пов",
        "hide": "Sakrij",
        "rc_categories_any": "Sve",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} posle izmene",
        "newsectionsummary": "/* $1 */ nova sekcija",
-       "rc-enhanced-expand": "Pokaži detalje (neophodan JavaScript)",
+       "rc-enhanced-expand": "Pokaži detalje",
        "rc-enhanced-hide": "Sakrij detalje",
        "rc-old-title": "prvobitno kreirano kao \"$1\"",
        "recentchangeslinked": "Srodne izmjene / Сродне измене",
        "fileexists-shared-forbidden": "Datoteka sa ovim imenom već postoji u zajedničkoj ostavi; molimo Vas da se vratite i pošaljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Ova datoteka je dvojnik {{PLURAL:$1|slijedećoj datoteci|slijedećim datotekama}}:",
        "file-deleted-duplicate": "Datoteka koje je identična ovoj datoteci ([[:$1]]) je ranije bila obrisana. Trebate provjeriti historiju brisanja te datoteke prije nego što nastavite sa njenim ponovnim postavljanjem.",
+       "file-deleted-duplicate-notitle": "Datoteka identična ovoj datoteci je prethodno bila izbrisana, a naslov je bio sakriven.\nPrije nego što nastavite ponovno postavljanje trebali biste pitati nekoga sa mogućnošću pregleda sakrivenih podataka o datotekama.",
        "uploadwarning": "Upozorenje pri slanju",
        "uploadwarning-text": "Molimo izmijeniti opis datoteke ispod i pokušajte kasnije.",
        "savefile": "Snimi datoteku",
        "uploaddisabledtext": "Postavljanje datoteka je onemogućeno.",
        "php-uploaddisabledtext": "Postavljanje datoteka preko PHP je onemogućeno. \nMolimo provjerite postavku za postavljanje datoteka.",
        "uploadscripted": "Ova datoteka sadrži HTML ili skriptni kod koji može izazvati grešku kod internet preglednika.",
+       "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor „$1“",
+       "uploadinvalidxml": "XML u postavljenoj datoteci nije mogao biti parsiran.",
        "uploadvirus": "Fajl sadrži virus!  Detalji:  $1",
        "uploadjava": "Datoteka je ZIP datoteka koja sadrži Java .class datoteku.\nPostavljanje Java datoteka nije dopušteno, jer one mogu prouzrokovati zaobilaženje sigurnosnih ograničenja.",
        "upload-source": "Izvorna datoteka",
        "license-nopreview": "(Pregled nije dostupan)",
        "upload_source_url": "(valjani, javno dostupni URL)",
        "upload_source_file": "(datoteka na Vašem kompjuteru)",
-       "listfiles-summary": "Ova posebna stranica pokazuje sve postavljene datoteke.\nKad je filtriran po korisniku, popis prikazuje samo one datoteke čiju je posljednju verziju postavio taj korisnik.",
+       "listfiles-summary": "Ova posebna stranica prikazuje sve postavljene datoteke.",
        "listfiles_search_for": "Traži ime medija:",
        "imgfile": "datoteka",
        "listfiles": "Spisak slika",
        "listfiles_size": "Veličina",
        "listfiles_description": "Opis",
        "listfiles_count": "Verzije",
+       "listfiles-show-all": "Uključi starije verzije slika",
+       "listfiles-latestversion": "Trenutna verzija",
+       "listfiles-latestversion-yes": "Da",
+       "listfiles-latestversion-no": "Ne",
        "file-anchor-link": "Datoteka",
        "filehist": "Historija datoteke",
        "filehist-help": "Kliknite na datum/vrijeme da vidite kako je tada izgledala datoteka/fajl.",
        "download": "učitaj",
        "unwatchedpages": "Nepraćene stranice",
        "listredirects": "Spisak preusmjerenja",
+       "listduplicatedfiles": "Spisak datoteka sa duplikatima",
+       "listduplicatedfiles-summary": "Ovo je popis datoteka gdje su najskorije verzije datoteke duplikati najskorijih verzija neke druge datoteke. Samo se lokalne datoteke uzimaju u obzir.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]] ima [[$3|{{PLURAL:$2|duplikat|$2 duplikata}}]].",
        "unusedtemplates": "Nekorišteni šabloni",
        "unusedtemplatestext": "Ova stranica prikazuje sve stranice u imenskom prostoru {{ns:template}} koji se ne koriste.\nPrije brisanja provjerite da li druge stranice vode na te šablone.",
        "unusedtemplateswlh": "ostali linkovi",
        "randompage": "Slučajna stranica / Случајна страница",
        "randompage-nopages": "Nema stranica u {{PLURAL:$2|slijedećem imenskom prostoru|slijedećim imenskim prostorima}}: \"$1\".",
+       "randomincategory": "Slučajna stranica u kategoriji",
+       "randomincategory-invalidcategory": "\"$1\" nije valjano ime kategorije.",
+       "randomincategory-nopages": "Nema stranica u kategoriji [[:Category:$1|$1]].",
+       "randomincategory-selectcategory": "Dobij slučajnu stranicu iz kategorije: $1 $2.",
+       "randomincategory-selectcategory-submit": "Idi",
        "randomredirect": "Slučajno preusmjerenje / Случајно преусмјерење",
        "randomredirect-nopages": "Nema preusmjerenja u imenskom prostoru \"$1\".",
        "statistics": "Statistike / Статистике",
        "pageswithprop-text": "Ova stranica navodi stranice sa specifičnim svojstvom stranice.",
        "pageswithprop-prop": "Naziv svojstva:",
        "pageswithprop-submit": "Idi",
+       "pageswithprop-prophidden-long": "vrijednost svojstva dugog teksta sakrivena ($1)",
+       "pageswithprop-prophidden-binary": "vrijednost binarnog svojstva sakrivena ($1)",
        "doubleredirects": "Dvostruka preusmjerenja",
        "doubleredirectstext": "Ova stranica prikazuje stranice koje preusmjeravaju na druga preusmjerenja.\nSvaki red sadrži veze na prvo i drugo preusmjerenje, kao i na prvu liniju teksta drugog preusmjerenja, što obično daje \"pravi\" ciljni članak, na koji bi prvo preusmjerenje i trebalo da pokazuje.\n<del>Precrtane</del> stavke su riješene.",
-       "double-redirect-fixed-move": "[[$1]] je premješten, sada je preusmjerenje na [[$2]]",
-       "double-redirect-fixed-maintenance": "Popravak dvostrukih datoteka od [[$1]] do [[$2]].",
+       "double-redirect-fixed-move": "[[$1]] je bio premješten.\nAutomatski je ažuriran i sada preusmjeruje na [[$2]]",
+       "double-redirect-fixed-maintenance": "Automatski popravak dvostrukih datoteka od [[$1]] do [[$2]] u poslu održavanja.",
        "double-redirect-fixer": "Popravljač preusmjerenja",
        "brokenredirects": "Pokvarena preusmjerenja",
        "brokenredirectstext": "Slijedeća preusmjerenja vode na nepostojeće stranice:",
        "ninterwikis": "$1 {{PLURAL:$1|međuviki|međuvikija|međuvikija}}",
        "nlinks": "$1 {{PLURAL:$1|link|linka|linkova}}",
        "nmembers": "$1 {{PLURAL:$1|član|članova}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|član|članova}}",
        "nrevisions": "$1 {{PLURAL:$1|revizija|revizije|revizija}}",
        "nviews": "$1 {{PLURAL:$1|pregled|pregleda}}",
        "nimagelinks": "Koristi se na $1 {{PLURAL:$1|stranici|stranice|stranica}}",
        "mostrevisions": "Stranice sa najviše izmjena",
        "prefixindex": "Sve stranice sa prefiksom",
        "prefixindex-namespace": "Sve stranice s predmetkom (imenski prostor $1)",
+       "prefixindex-strip": "Sakrij prefiks u spisku",
        "shortpages": "Kratke stranice",
        "longpages": "Duge stranice / Дуге странице",
        "deadendpages": "Članci bez internih linkova / Чланци без интерних линкова",
        "deadendpagestext": "Slijedeće stranice nisu povezane s drugim stranicama na {{SITENAME}}.",
        "protectedpages": "Zaštićene stranice / Заштићене странице",
        "protectedpages-indef": "Samo neograničena zaštićenja",
+       "protectedpages-summary": "Ovaj stranica navodi popis postojećih stranica koje su trenutno zaštićene. Za popis stranica zaštićenih od stvaranja, vidi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Samo prenosive zaštite",
+       "protectedpages-noredirect": "Sakrij preusmjerenja",
        "protectedpagesempty": "Trenutno nijedna stranica nije zaštićena s ovim parametrima.",
+       "protectedpages-timestamp": "Vremenska oznaka",
+       "protectedpages-page": "Stranica",
+       "protectedpages-expiry": "Istječe",
+       "protectedpages-performer": "Zaštitio/la",
+       "protectedpages-params": "Nivo zaštite",
+       "protectedpages-reason": "Razlog",
+       "protectedpages-unknown-timestamp": "Nepoznato",
+       "protectedpages-unknown-performer": "Nepoznati korisnik",
        "protectedtitles": "Zaštićeni naslovi",
        "protectedtitlesempty": "Nema naslova zaštićenih članaka sa ovim parametrima.",
        "listusers": "Spisak korisnika",
index e14700a..fa7f4a9 100644 (file)
        "jumptonavigation": "navigacija",
        "jumptosearch": "iskanje",
        "view-pool-error": "Žal so strežniki trenutno preobremenjeni.\nPreveč uporabnikov skuša obiskati to stran.\nProsimo za potrpežljivost, obiščite nas spet kmalu.\n\n$1",
+       "generic-pool-error": "Žal so strežniki trenutno preobremenjeni.\nPreveč uporabnikov si skuša ogledati ta vir.\nProsimo za potrpežljivost, obiščite nas spet kmalu.",
        "pool-timeout": "Časovno obdobje čakanja na zaklep",
        "pool-queuefull": "Čakalna vrsta zaloge je polna",
        "pool-errorunknown": "Neznana napaka",
index d18f2b4..5a26e27 100644 (file)
        "jumptonavigation": "навигацију",
        "jumptosearch": "претрагу",
        "view-pool-error": "Нажалост, сервери су тренутно преоптерећени.\nПревише корисника покушава да прегледа ову страницу.\nСачекајте неко време пре него што поново покушате да јој приступите.\n\n$1",
+       "generic-pool-error": "Нажалост, сервери су тренутно преоптерећени.\nПревише корисника покушава да види овај ресурс.\nСачекајте неко време пре него што поново покушате да му приступите.",
        "pool-timeout": "Истек времена чека на закључавање",
        "pool-queuefull": "Ред је пун захтева",
        "pool-errorunknown": "Непозната грешка",
        "changeemail-password": "Ваша лозинка:",
        "changeemail-submit": "Промени",
        "changeemail-cancel": "Откажи",
+       "resettokens-tokens": "Токени:",
        "resettokens-token-label": "$1 (тренутна вредност: $2)",
        "bold_sample": "Подебљан текст",
        "bold_tip": "Подебљан текст",
        "search-section": "(одељак $1)",
        "search-suggest": "Да ли сте мислили на: $1",
        "search-interwiki-caption": "Братски пројекти",
-       "search-interwiki-default": "$1 резултати:",
+       "search-interwiki-default": "Резултати са $1:",
        "search-interwiki-more": "(више)",
        "search-relatedarticle": "Повезано",
        "searcheverything-enable": "сви именски простори",
        "prefs-advancedwatchlist": "Напредне поставке",
        "prefs-displayrc": "Поставке приказа",
        "prefs-displaywatchlist": "Поставке приказа",
+       "prefs-tokenwatchlist": "Токен",
        "prefs-diffs": "Разлике",
        "prefs-help-prefershttps": "Ова подешавања ће ступити на снагу при следећој пријави.",
        "email-address-validity-valid": "Е-адреса је исправна",
        "action-block": "блокирање даљих измена овог корисника",
        "action-protect": "мењање степена заштите ове странице",
        "action-rollback": "брзо враћање измена последњег корисника који је мењао одређену страницу",
-       "action-import": "Ñ\83воз Ð¾Ð²Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\81 Ð´Ñ\80Ñ\83гог викија",
-       "action-importupload": "Ñ\83воз Ð¾Ð²Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\81лаÑ\9aем датотеке",
+       "action-import": "Ñ\83вожеÑ\9aе Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¸Ð· Ð´Ñ\80Ñ\83гиÑ\85 викија",
+       "action-importupload": "Ñ\83вожеÑ\9aе Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¸Ð· Ð¾Ñ\82пÑ\80емÑ\99ене датотеке",
        "action-patrol": "означавање туђих измена прегледаним",
        "action-autopatrol": "самоозначавање измена прегледаним",
        "action-unwatchedpages": "прегледање списка ненадгледаних страница",
        "recentchanges-label-newpage": "Нова страница",
        "recentchanges-label-minor": "Мања измена",
        "recentchanges-label-bot": "Ову измену је направио бот",
-       "recentchanges-label-unpatrolled": "Ова измена још није прегледана",
-       "recentchanges-label-plusminus": "Промена величине странице (у бајтовима)",
+       "recentchanges-label-unpatrolled": "Ова измена још није патролирана",
+       "recentchanges-label-plusminus": "Промена величине странице у бајтовима",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "recentchanges-legend-newpage": "([[Special:NewPages|списак нових страница]])",
        "rcnotefrom": "Испод су измене од <strong>$2</strong> (до <strong>$1</strong> измена).",
-       "rclistfrom": "Прикажи нове измене почев од $3 $2",
+       "rclistfrom": "Прикажи нове измене почев од $2 $3",
        "rcshowhideminor": "$1 мање измене",
        "rcshowhideminor-show": "Прикажи",
        "rcshowhideminor-hide": "Сакриј",
        "listgrouprights-removegroup-self": "уклањање {{PLURAL:$2|групе|група}} са свог налога: $1",
        "listgrouprights-addgroup-self-all": "Додај све групе на сопствени налог",
        "listgrouprights-removegroup-self-all": "Уклони све групе са сопственог налога",
+       "listgrouprights-namespaceprotection-namespace": "Именски простор",
+       "trackingcategories-nodesc": "Опис није доступан.",
        "mailnologin": "Нема адресе за слање",
        "mailnologintext": "Морате бити [[Special:UserLogin|пријављени]] и имати исправну е-адресу у [[Special:Preferences|подешавањима]] да бисте слали е-поруке другим корисницима.",
        "emailuser": "Пошаљи е-поруку",
        "markedaspatrollederror": "Не могу да означим као патролирано",
        "markedaspatrollederrortext": "Морате изабрати измену да бисте је означили као прегледану.",
        "markedaspatrollederror-noautopatrol": "Не можете да означите своје измене као патролиране.",
-       "markedaspatrollednotify": "Ова измена на страници „$1“ је означена као прегледана.",
-       "markedaspatrollederrornotify": "Ð\9dиÑ\98е Ñ\83Ñ\81пеÑ\88но Ð¾Ð·Ð½Ð°Ñ\87аваÑ\9aе Ð¾Ð²Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86е ÐºÐ°Ð¾ Ð¿Ñ\80егледаном.",
+       "markedaspatrollednotify": "Ова измена на страници „$1“ је означена као патролирана.",
+       "markedaspatrollederrornotify": "Ð\9eзнаÑ\87аваÑ\9aе Ð¾Ð²Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¿Ð°Ñ\82Ñ\80олиÑ\80аном Ð½Ð¸Ñ\98е Ñ\83Ñ\81пело.",
        "patrol-log-page": "Дневник патролирања",
        "patrol-log-header": "Ово је дневник патролираних измена.",
        "log-show-hide-patrol": "$1 дневник патролирања",
index a1f71c5..a0e1228 100644 (file)
        "recentchanges-label-newpage": "Nova stranica",
        "recentchanges-label-minor": "Manja izmena",
        "recentchanges-label-bot": "Ovu izmenu je napravio bot",
-       "recentchanges-label-unpatrolled": "Ova izmena još nije pregledana",
-       "recentchanges-label-plusminus": "Promena veličine stranice (u bajtovima)",
+       "recentchanges-label-unpatrolled": "Ova izmena još nije patrolirana",
+       "recentchanges-label-plusminus": "Promena veličine stranice u bajtovima",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "([[Special:NewPages|spisak novih stranica]])",
        "rcnotefrom": "Ispod su izmene od <b>$2</b> (do <b>$1</b> izmena).",
-       "rclistfrom": "Prikaži nove izmene počev od $3 $2",
+       "rclistfrom": "Prikaži nove izmene počev od $2 $3",
        "rcshowhideminor": "$1 manje izmene",
        "rcshowhideminor-show": "Prikaži",
        "rcshowhideminor-hide": "Sakrij",
        "markedaspatrollederror": "Ne mogu da označim kao patrolirano",
        "markedaspatrollederrortext": "Morate izabrati izmenu da biste je označili kao pregledanu.",
        "markedaspatrollederror-noautopatrol": "Ne možete da označite svoje izmene kao patrolirane.",
-       "markedaspatrollednotify": "Ova izmena na stranici „$1“ je označena kao pregledana.",
-       "markedaspatrollederrornotify": "Nije uspešno označavanje ove stranice kao pregledanom.",
+       "markedaspatrollednotify": "Ova izmena na stranici „$1“ je označena kao patrolirana.",
+       "markedaspatrollederrornotify": "Označavanje ove stranice patroliranom nije uspelo.",
        "patrol-log-page": "Dnevnik patroliranja",
        "patrol-log-header": "Ovo je dnevnik patroliranih izmena.",
        "log-show-hide-patrol": "$1 dnevnik patroliranja",
index 36d115c..b029fa6 100644 (file)
        "jumptonavigation": "navigering",
        "jumptosearch": "sök",
        "view-pool-error": "Tyvärr är servrarna överbelastade för tillfället.\nFör många användare försöker visa denna sida.\nVänta en liten stund och försök igen lite senare.\n\n$1",
+       "generic-pool-error": "Tyvärr är servrarna överbelastade för tillfället.\nFör många användare försöker visa denna resurs.\nVänta en liten stund innan du försöker komma åt resursen igen.",
        "pool-timeout": "Timeout i väntan på låsning",
        "pool-queuefull": "Kön är full",
        "pool-errorunknown": "Okänt fel",
index e92ac97..f3cdf84 100644 (file)
        "jumptonavigation": "导航",
        "jumptosearch": "搜索",
        "view-pool-error": "对不起,服务器当前正超负荷运转。过多用户正尝试查看本页面。请在再次尝试访问本页面前稍等片刻。\n\n$1",
+       "generic-pool-error": "对不起,服务器目前超负荷运转。太多用户尝试查看本页面。请稍等片刻再重新尝试。",
        "pool-timeout": "等待锁超时",
        "pool-queuefull": "请求队列已满",
        "pool-errorunknown": "未知错误",
        "templatesused": "该页面使用的{{PLURAL:$1|模板}}:",
        "templatesusedpreview": "本预览使用的{{PLURAL:$1|模板}}:",
        "templatesusedsection": "该段落使用的{{PLURAL:$1|模板}}:",
-       "template-protected": "(保护)",
+       "template-protected": "(保护)",
        "template-semiprotected": "(半保护)",
        "hiddencategories": "该页面属于$1个隐藏分类:",
        "edittools": "<!-- 这里的文字将显示在编辑和上传表格下面。 -->",
        "action-unwatchedpages": "查看未受监视页面的列表",
        "action-mergehistory": "合并本页面的历史",
        "action-userrights": "编辑所有用户的权限",
-       "action-userrights-interwiki": "编辑其它wiki的用户的用户权限",
+       "action-userrights-interwiki": "编辑其他wiki用户的用户权限",
        "action-siteadmin": "锁定或解锁数据库",
        "action-sendemail": "电邮联系其他用户",
        "action-editmywatchlist": "编辑你的监视列表",
        "action-viewmywatchlist": "查看你的监视列表",
        "action-viewmyprivateinfo": "查看您的私人信息",
        "action-editmyprivateinfo": "编辑你的私人信息",
-       "nchanges": "$1更改",
+       "nchanges": "$1更改",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|上次访问后}}$1个",
        "enhancedrc-history": "历史",
        "recentchanges": "最近更改",
        "protect-summary-cascade": "联锁",
        "protect-expiring": "终止于$1(UTC)",
        "protect-expiring-local": "$1到期",
-       "protect-expiry-indefinite": "限期",
+       "protect-expiry-indefinite": "限期",
        "protect-cascade": "保护本页中包含的页面(连锁保护)",
        "protect-cantedit": "您无法更改这个页面的保护等级,因为您没有权限去编辑它。",
        "protect-othertime": "其它时间:",
        "ipblocklist-submit": "搜索",
        "ipblocklist-localblock": "本地封禁",
        "ipblocklist-otherblocks": "其他{{PLURAL:$1|封禁}}",
-       "infiniteblock": "限期",
+       "infiniteblock": "限期",
        "expiringblock": "$1 $2到期",
        "anononlyblock": "仅匿名用户",
        "noautoblockblock": "自动封禁停用",
index 157ee0b..348b444 100644 (file)
                        "아라"
                ]
        },
-       "tog-underline": "é\80£çµ\90å\8a åº\95ç·\9aï¼\9a",
-       "tog-hideminor": "隱藏最近更改中的小修改",
+       "tog-underline": "連結底線:",
+       "tog-hideminor": "隱藏最近變更中的小修訂",
        "tog-hidepatrolled": "隱藏最近更改中巡查過的編輯",
        "tog-newpageshidepatrolled": "隱藏新頁面清單中巡查過的頁面",
-       "tog-extendwatchlist": "展開監視列表以顯示所有更改,不只是最近的",
-       "tog-usenewrc": "在最近更改和監視列表中整合同一頁的修改",
+       "tog-extendwatchlist": "展開監視列表以顯示所有變更,不只是最近的",
+       "tog-usenewrc": "依頁面分類最近變更和監視列表中的修改",
        "tog-numberheadings": "標題自動編號",
-       "tog-showtoolbar": "顯示編輯工具",
-       "tog-editondblclick": "雙擊編輯頁面",
-       "tog-editsectiononrightclick": "å\85\81許å\8f³æ\93\8aæ¨\99é¡\8c編輯段è\90½",
+       "tog-showtoolbar": "顯示編輯工具",
+       "tog-editondblclick": "啟用滑鼠雙擊編輯頁面",
+       "tog-editsectiononrightclick": "å\95\9fç\94¨æ»\91é¼ å\8f³é\8dµé»\9eé\81¸ç« ç¯\80æ¨\99é¡\8c編輯",
        "tog-watchcreations": "將我建立的頁面和上傳的檔案加入監視列表",
        "tog-watchdefault": "將我更改的頁面和檔案加入監視列表",
        "tog-watchmoves": "將我移動的頁面和檔案加入監視列表",
        "tog-watchdeletion": "將我刪除的頁面和檔案加入監視列表",
-       "tog-minordefault": "預設將所有編輯標記為小修改",
-       "tog-previewontop": "在編輯框上方顯示預覽",
-       "tog-previewonfirst": "第一次編輯時顯示預覽",
-       "tog-enotifwatchlistpages": "當我監視列表中的頁面或檔案有變更時,發送電子郵件通知我",
-       "tog-enotifusertalkpages": "我的對話頁有變更時,發送電子郵件通知我",
-       "tog-enotifminoredits": "頁面和檔案的小修改也發電子郵件給我",
+       "tog-minordefault": "預設標記所有的編輯為小修訂",
+       "tog-previewontop": "顯示預覽於編輯框上方",
+       "tog-previewonfirst": "顯示預覽於第一次編輯時",
+       "tog-enotifwatchlistpages": "ç\95¶æ\88\91ç\9a\84ç\9b£è¦\96å\88\97表中ç\9a\84é \81é\9d¢æ\88\96æª\94æ¡\88æ\9c\89è®\8aæ\9b´æ\99\82ï¼\8cç\99¼é\80\81é\9b»å­\90é\83µä»¶é\80\9aç\9f¥æ\88\91",
+       "tog-enotifusertalkpages": "當我的對話頁面有變更時,發送電子郵件通知我",
+       "tog-enotifminoredits": "當頁面與檔案有小修訂時,發送電子郵件通知我",
        "tog-enotifrevealaddr": "在通知信件中顯示我的電子郵件位址",
-       "tog-shownumberswatching": "顯示正在監視的使用者數",
-       "tog-oldsig": "有簽名:",
-       "tog-fancysig": "將簽名視為圍記文字(Wikitext)(不會自動產生連結)",
-       "tog-uselivepreview": "使用即時預覽(實驗性)",
-       "tog-forceeditsummary": "未輸入編輯摘要時提醒我",
-       "tog-watchlisthideown": "監視列表中隱藏我的編輯",
-       "tog-watchlisthidebots": "監視列表中隱藏機器人的編輯",
-       "tog-watchlisthideminor": "監視列表中隱藏小修改",
-       "tog-watchlisthideliu": "監視列表中隱藏已登入使用者的編輯",
-       "tog-watchlisthideanons": "監視列表中隱藏匿名使用者的編輯",
-       "tog-watchlisthidepatrolled": "監視清單中隱藏已巡查的編輯",
-       "tog-ccmeonemails": "ç\95¶æ\88\91å¯\84é\9b»å­\90é\83µä»¶çµ¦å\85¶ä»\96使ç\94¨è\80\85æ\99\82ï¼\8cä¹\9få¯\84ä¸\80份å\89¯æ\9c¬å\88°æ\88\91ç\9a\84信箱",
+       "tog-shownumberswatching": "顯示正在監視的使用者數",
+       "tog-oldsig": "有簽名:",
+       "tog-fancysig": "將簽名視為 Wikitext 語言 (不自動產生連結)",
+       "tog-uselivepreview": "使用即時預覽 (實驗中)",
+       "tog-forceeditsummary": "未填寫編輯摘要時提示我",
+       "tog-watchlisthideown": "隱藏監視列表中我的編輯",
+       "tog-watchlisthidebots": "隱藏監視列表中機器人的編輯",
+       "tog-watchlisthideminor": "隱藏監視列表中的小修訂",
+       "tog-watchlisthideliu": "隱藏監視列表中已登入使用者的編輯",
+       "tog-watchlisthideanons": "隱藏監視列表中匿名使用者的編輯",
+       "tog-watchlisthidepatrolled": "隱藏監視列表中已巡查的編輯",
+       "tog-ccmeonemails": "ç\99¼é\80\81é\83µä»¶çµ¦ä»\96人æ\99\82ï¼\8cä¹\9fé\80\81ä¸\80份å\89¯æ\9c¬å\88°æ\88\91ç\9a\84é\9b»å­\90é\83µä»¶信箱",
        "tog-diffonly": "比對版本差異時下面不顯示頁面內容",
        "tog-showhiddencats": "顯示隱藏分類",
-       "tog-norollbackdiff": "å\9b\9eé\80\80å¾\8cä¸\8då\81\9a差異比對",
-       "tog-useeditwarning": "當離開頁面時編輯仍未儲存,請提醒我",
-       "tog-prefershttps": "登入時始終使用安全連線",
-       "underline-always": "總是使用",
-       "underline-never": "不使用",
-       "underline-default": "外觀或瀏覽器預設",
+       "tog-norollbackdiff": "å\9f·è¡\8cé\82\84å\8e\9få¾\8cç\95¥é\81\8e差異比對",
+       "tog-useeditwarning": "未儲存離開編輯頁面時警告我",
+       "tog-prefershttps": "永遠使用安全連線登入",
+       "underline-always": "永遠使用",
+       "underline-never": "不使用",
+       "underline-default": "外觀或瀏覽器預設",
        "editfont-style": "編輯區字型樣式:",
-       "editfont-default": "瀏覽器預設",
+       "editfont-default": "瀏覽器預設",
        "editfont-monospace": "等距字型",
        "editfont-sansserif": "無襯線字型",
        "editfont-serif": "襯線字型",
        "thu": "四",
        "fri": "五",
        "sat": "六",
-       "january": "1月",
-       "february": "2月",
-       "march": "3月",
-       "april": "4月",
-       "may_long": "5月",
-       "june": "6月",
-       "july": "7月",
-       "august": "8月",
-       "september": "9月",
-       "october": "10月",
-       "november": "11月",
-       "december": "12月",
+       "january": "月",
+       "february": "月",
+       "march": "月",
+       "april": "月",
+       "may_long": "月",
+       "june": "月",
+       "july": "月",
+       "august": "月",
+       "september": "月",
+       "october": "月",
+       "november": "十一月",
+       "december": "十二月",
        "january-gen": "一月",
        "february-gen": "二月",
        "march-gen": "三月",
        "october-gen": "十月",
        "november-gen": "十一月",
        "december-gen": "十二月",
-       "jan": "1月",
-       "feb": "2月",
-       "mar": "3月",
-       "apr": "4月",
-       "may": "5月",
-       "jun": "6月",
-       "jul": "7月",
-       "aug": "8月",
-       "sep": "9月",
-       "oct": "10月",
-       "nov": "11月",
-       "dec": "12月",
-       "january-date": "1月$1日",
-       "february-date": "2月$1日",
-       "march-date": "3月$1日",
-       "april-date": "4月$1日",
-       "may-date": "5月$1日",
-       "june-date": "6月$1日",
-       "july-date": "7月$1日",
-       "august-date": "8月$1日",
-       "september-date": "9月$1日",
-       "october-date": "10月$1日",
-       "november-date": "11月$1日",
-       "december-date": "12月$1日",
+       "jan": "1 月",
+       "feb": "2 月",
+       "mar": "3 月",
+       "apr": "4 月",
+       "may": "5 月",
+       "jun": "6 月",
+       "jul": "7 月",
+       "aug": "8 月",
+       "sep": "9 月",
+       "oct": "10 月",
+       "nov": "11 月",
+       "dec": "12 月",
+       "january-date": "一月 $1 日",
+       "february-date": "二月 $1 日",
+       "march-date": "三月 $1 日",
+       "april-date": "四月 $1 日",
+       "may-date": "五月 $1 日",
+       "june-date": "六月 $1 日",
+       "july-date": "七月 $1 日",
+       "august-date": "八月 $1 日",
+       "september-date": "九月 $1 日",
+       "october-date": "十月 $1 日",
+       "november-date": "十一月 $1 日",
+       "december-date": "十二月 $1 日",
        "pagecategories": "{{PLURAL:$1|分類}}",
-       "category_header": "「$1」分類中的頁面",
+       "category_header": "分類 \"$1\" 中的頁面",
        "subcategories": "子分類",
-       "category-media-header": "「$1」分類中的媒體",
-       "category-empty": "''此分類目前未包含頁面或媒體。''",
+       "category-media-header": "分類 \"$1\" 中的媒體",
+       "category-empty": "<em>此分類目前未包含頁面或媒體。</em>",
        "hidden-categories": "{{PLURAL:$1|隱藏分類}}",
        "hidden-category-category": "隱藏分類",
-       "category-subcat-count": "{{PLURAL:$2|此分類有以下一個子分類。|此分類有 $2 個子分類,以下列出了 $1 個。}}",
+       "category-subcat-count": "{{PLURAL:$2|此分類僅有以下 1 個子分類。|此分類有以下 $1 個字分類,共 $2 個。}}",
        "category-subcat-count-limited": "此分類有以下 $1 個子分類。",
        "category-article-count": "{{PLURAL:$2|此分類有以下一個頁面。|此分類有 $2 個頁面,以下列出了 $1 個。}}",
        "category-article-count-limited": "此分類有以下 $1 個頁面。",
        "category-file-count": "{{PLURAL:$2|此分類有以下一個檔案。|此分類有 $2 個檔案,以下列出了 $1 個。}}",
        "category-file-count-limited": "此分類有 $1 個檔案。",
        "listingcontinuesabbrev": "續",
-       "index-category": "已索引的頁面",
-       "noindex-category": "未索引的頁面",
+       "index-category": "已索引的頁面",
+       "noindex-category": "未索引的頁面",
        "broken-file-category": "含有損壞檔案連結的頁面",
        "about": "關於",
        "article": "內容頁面",
-       "newwindow": "(以新視窗開啟)",
+       "newwindow": "(以新視窗開啟)",
        "cancel": "取消",
        "moredotdotdot": "更多...",
-       "morenotlisted": "æ­¤å\88\97表並ä¸\8då®\8cæ\95´ã\80\82",
+       "morenotlisted": "此列表不完整。",
        "mypage": "頁面",
-       "mytalk": "討論",
-       "anontalk": "此IP的對話頁",
+       "mytalk": "對話",
+       "anontalk": "此 IP 位址的對話頁面",
        "navigation": "導覽",
        "and": "及",
        "qbfind": "尋找",
        "qbbrowse": "瀏覽",
        "qbedit": "編輯",
-       "qbpageoptions": "頁面選項",
-       "qbmyoptions": "æ\88\91ç\9a\84é\81¸é \85",
-       "faq": "常見問題解答",
-       "faqpage": "Project:常見問題解答",
+       "qbpageoptions": "此頁面",
+       "qbmyoptions": "æ\88\91ç\9a\84é \81é\9d¢",
+       "faq": "常見問答",
+       "faqpage": "Project:FAQ",
        "vector-action-addsection": "加入主題",
        "vector-action-delete": "刪除",
        "vector-action-move": "移動",
        "vector-action-protect": "保護",
-       "vector-action-undelete": "恢復被刪頁面",
-       "vector-action-unprotect": "更改保護",
+       "vector-action-undelete": "取消刪除",
+       "vector-action-unprotect": "變更保護",
        "vector-view-create": "建立",
        "vector-view-edit": "編輯",
        "vector-view-history": "檢視歷史",
        "vector-view-view": "閱讀",
        "vector-view-viewsource": "檢視原始碼",
        "actions": "動作",
-       "namespaces": "å\90\8då­\97空間",
-       "variants": "變",
-       "navigation-heading": "å°\8eè\88ª",
+       "namespaces": "å\91½å\90\8d空間",
+       "variants": "變",
+       "navigation-heading": "å°\8e覽é\81¸å\96®",
        "errorpagetitle": "錯誤",
-       "returnto": "返回$1。",
-       "tagline": "出自{{SITENAME}}",
+       "returnto": "返回 $1。",
+       "tagline": "出自 {{SITENAME}}",
        "help": "說明",
        "search": "搜尋",
        "searchbutton": "搜尋",
        "searcharticle": "進入",
        "history": "頁面歷史",
        "history_short": "歷史",
-       "updatedmarker": "我上次訪問以來的修改",
+       "updatedmarker": "自我最後一次訪問以後的更新",
        "printableversion": "可列印版",
        "permalink": "永久連結",
        "print": "列印",
        "view": "檢視",
-       "view-foreign": "於$1查閱",
+       "view-foreign": "於 $1 查閱",
        "edit": "編輯",
        "edit-local": "編輯本地說明",
        "create": "建立",
-       "create-local": "æ·»å\8a 本地說明",
+       "create-local": "æ\96°å¢\9e本地說明",
        "editthispage": "編輯本頁",
        "create-this-page": "建立本頁",
        "delete": "刪除",
-       "deletethispage": "å\88ªé\99¤æ\9c¬頁",
+       "deletethispage": "å\88ªé\99¤æ­¤頁",
        "undeletethispage": "取消刪除此頁",
-       "undelete_short": "å\8f\8då\88ªé\99¤$1項修訂",
-       "viewdeleted_short": "æ\9f¥ç\9c\8b$1項已刪除的修訂",
+       "undelete_short": "å\8f\96æ¶\88å\88ªé\99¤ $1 項修訂",
+       "viewdeleted_short": "檢è¦\96 $1 項已刪除的修訂",
        "protect": "保護",
        "protect_change": "變更",
        "protectthispage": "保護本頁",
-       "unprotect": "更改保護",
-       "unprotectthispage": "更改此頁保護",
+       "unprotect": "變更保護",
+       "unprotectthispage": "變更此頁的保護",
        "newpage": "新頁面",
-       "talkpage": "è¨\8eè«\96æ\9c¬頁",
+       "talkpage": "è¨\8eè«\96æ­¤頁",
        "talkpagelinktext": "對話",
        "specialpage": "特殊頁面",
        "personaltools": "個人工具",
        "talk": "討論",
        "views": "檢視",
        "toolbox": "工具",
-       "userpage": "檢視用戶頁面",
-       "projectpage": "檢視計劃頁面",
+       "userpage": "檢視使用者頁面",
+       "projectpage": "檢視專案頁面",
        "imagepage": "檢視檔案頁面",
        "mediawikipage": "檢視使用者介面訊息",
        "templatepage": "檢視模板頁面",
        "categorypage": "檢視分類頁面",
        "viewtalkpage": "檢視討論頁面",
        "otherlanguages": "其他語言",
-       "redirectedfrom": "(重定向自$1)",
-       "redirectpagesub": "重向頁面",
+       "redirectedfrom": "(自 $1 重新導向)",
+       "redirectpagesub": "重新導向頁面",
        "lastmodifiedat": "此頁面最後修訂於 $1 $2。",
-       "viewcount": "æ\9c¬é \81é\9d¢å·²ç¶\93被ç\80\8f覽$1次。",
+       "viewcount": "æ­¤é \81é\9d¢å·²è¢«æª¢è¦\96é\81\8e $1 次。",
        "protectedpage": "受保護頁面",
-       "jumpto": "跳轉到:",
+       "jumpto": "前往:",
        "jumptonavigation": "導覽",
        "jumptosearch": "搜尋",
-       "view-pool-error": "抱歉,太多用戶正嘗試檢視此頁,使伺服器超出負荷。請稍候片刻再嘗試。\n\n$1",
-       "pool-timeout": "等待鎖定逾時",
-       "pool-queuefull": "請求池已滿",
+       "view-pool-error": "抱歉,太多使用者正嘗試檢視此頁面,伺服器超出負荷。\n請稍候片刻再嘗試。\n\n$1",
+       "generic-pool-error": "抱歉,太多使用者正嘗試檢視此資源,伺服器超出負荷。\n請稍候片刻再嘗試。",
+       "pool-timeout": "正在等待取消鎖定",
+       "pool-queuefull": "程序序列已滿",
        "pool-errorunknown": "未知錯誤",
-       "pool-servererror": "池計數器服務不可用($1)。",
+       "pool-servererror": "無法使用程序計數服務 ($1)。",
        "aboutsite": "關於 {{SITENAME}}",
-       "aboutpage": "Project:關於",
-       "copyright": "除非另有說明,否則本站內容均以$1條款提供。",
-       "copyrightpage": "{{ns:project}}:版權訊息",
+       "aboutpage": "Project:About",
+       "copyright": "除非額外說明,否則本站內容均使用 $1 授權條款。",
+       "copyrightpage": "{{ns:project}}:Copyrights",
        "currentevents": "新聞動態",
-       "currentevents-url": "Project:新聞動態",
+       "currentevents-url": "Project:Current events",
        "disclaimers": "免責聲明",
-       "disclaimerpage": "Project:一般免責聲明",
-       "edithelp": "編輯幫助",
+       "disclaimerpage": "Project:General disclaimer",
+       "edithelp": "編輯説明",
        "mainpage": "首頁",
        "mainpage-description": "首頁",
-       "policy-url": "Project:方針",
+       "policy-url": "Project:Policy",
        "portal": "社群主頁",
-       "portal-url": "Project:社群主頁",
+       "portal-url": "Project:Community portal",
        "privacy": "隱私政策",
-       "privacypage": "Project:隱私政策",
+       "privacypage": "Project:Privacy policy",
        "badaccess": "權限錯誤",
        "badaccess-group0": "系統不允許您執行這項操作。",
-       "badaccess-groups": "æ\82¨è«\8bæ±\82ç\9a\84æ\93\8dä½\9cå\8fªæ\9c\89{{PLURAL:$2|é\80\99å\80\8b\80\99äº\9b}}ç\94¨æ\88¶ç¾¤çµ\84ç\9a\84ç\94¨æ\88能使用:$1",
-       "versionrequired": "需 MediaWiki $1 版",
-       "versionrequiredtext": "需要版本 $1 的 MediaWiki 才能使用此頁面。\n詳情請見[[Special:Version|版本頁]]。",
+       "badaccess-groups": "æ\82¨è«\8bæ±\82ç\9a\84æ\93\8dä½\9cå\8fªæ\9c\89{{PLURAL:$2|é\80\99å\80\8b\80\99äº\9b}}群çµ\84ç\9a\84使ç\94¨è\80\85能使用:$1",
+       "versionrequired": "需使用 MediaWiki $1 版",
+       "versionrequiredtext": "需使用 $1 版本的 MediaWiki 才能使用此頁面。\n請參考 [[Special:Version|版本]]。",
        "ok": "確定",
-       "retrievedfrom": "取自「$1」",
-       "youhavenewmessages": "您有$1($2)。",
-       "youhavenewmessagesfromusers": "你有來自{{PLURAL:$3|另一位使用者|$3 位使用者}}的$1($2)。",
-       "youhavenewmessagesmanyusers": "你有來自多位使用者的$1( $2 )。",
+       "retrievedfrom": "取自 \"$1\"",
+       "youhavenewmessages": "您有 $1 ($2)。",
+       "youhavenewmessagesfromusers": "你有來自{{PLURAL:$3|另一位使用者|$3 位使用者}}的 $1 ($2)。",
+       "youhavenewmessagesmanyusers": "你有來自多位使用者的 $1 ($2)。",
        "newmessageslinkplural": "{{PLURAL:$1|一個新訊息|999=新訊息}}",
-       "newmessagesdifflinkplural": "æ\96°近{{PLURAL:$1|變更}}",
+       "newmessagesdifflinkplural": "æ\9c\80近{{PLURAL:$1|變更}}",
        "youhavenewmessagesmulti": "您在 $1 有新訊息",
        "editsection": "編輯",
        "editold": "編輯",
        "hidetoc": "隱藏",
        "collapsible-collapse": "摺叠",
        "collapsible-expand": "展開",
-       "thisisdeleted": "檢視或恢復$1?",
+       "thisisdeleted": "檢視或還原 $1 ?",
        "viewdeleted": "檢視 $1?",
-       "restorelink": "$1個被刪除的版本",
-       "feedlinks": "訂閱:",
+       "restorelink": "$1 個已刪除的編輯",
+       "feedlinks": "訂閱",
        "feed-invalid": "無效的訂閱類型。",
-       "feed-unavailable": "聯合訂閱並無提供",
-       "site-rss-feed": "$1的RSS訂閱",
-       "site-atom-feed": "$1的 Atom 訂閱",
-       "page-rss-feed": "「$1」的RSS訂閱",
-       "page-atom-feed": "「$1」的Atom訂閱",
-       "red-link-title": "$1(頁面未存在)",
-       "sort-descending": "倒序排列",
-       "sort-ascending": "升序排序",
+       "feed-unavailable": "目前未提供 RSS 或 Atom",
+       "site-rss-feed": "$1 的 RSS feed",
+       "site-atom-feed": "$1 的 Atom feed",
+       "page-rss-feed": "訂閱 \"$1\" 的 RSS feed",
+       "page-atom-feed": "訂閱 \"$1\" 的 Atom feed",
+       "red-link-title": "$1 (頁面不存在)",
+       "sort-descending": "降冪排序",
+       "sort-ascending": "昇冪排序",
        "nstab-main": "頁面",
        "nstab-user": "使用者頁面",
        "nstab-media": "媒體頁面",
        "nstab-special": "特殊頁面",
-       "nstab-project": "計劃頁面",
+       "nstab-project": "專案頁面",
        "nstab-image": "檔案",
        "nstab-mediawiki": "訊息",
        "nstab-template": "模板",
-       "nstab-help": "幫助頁面",
+       "nstab-help": "說明頁面",
        "nstab-category": "分類",
-       "nosuchaction": "這個命令不存在",
-       "nosuchactiontext": "該URL所指定的動作無效。\n您可能打錯URL,或點了錯誤連結。\n這也可能是{{SITENAME}}所使用的軟件出現了錯誤。",
-       "nosuchspecialpage": "此特殊頁面不存在",
-       "nospecialpagetext": "<strong>您請求的特殊頁面無效。</strong>\n\n[[Special:SpecialPages|{{int:specialpages}}]]中載有所有有效特殊頁面的列表。",
+       "nosuchaction": "無此動作",
+       "nosuchactiontext": "URL 所指定的動作無效。\n您的 URL 可能輸入錯誤,或點選了錯誤的連結。\n這也可能是 {{SITENAME}} 使用的系統出現問題。",
+       "nosuchspecialpage": "無此特殊頁面",
+       "nospecialpagetext": "<strong>您請求的特殊頁面無效。</strong>\n\n欲取得有效的特殊頁面清單可至 [[Special:SpecialPages|{{int:specialpages}}]]。",
        "error": "錯誤",
        "databaseerror": "資料庫錯誤",
-       "databaseerror-text": "出現資料庫查詢錯誤。\n這可能表示軟件中存在錯誤。",
+       "databaseerror-text": "出現資料庫查詢錯誤。\n這可能表示系統有問題存在。",
        "databaseerror-textcl": "資料庫查詢錯誤。",
        "databaseerror-query": "查詢:$1",
        "databaseerror-function": "功能:$1",
        "databaseerror-error": "錯誤:$1",
-       "laggedslavemode": "'''警告:'''頁面可能不包含最近的更新。",
-       "readonly": "資料庫禁止訪問",
-       "enterlockreason": "請輸入禁止訪問原因, 包括估計重新開放的時間",
-       "readonlytext": "資料庫目前禁止輸入新內容及更改,\n這很可能是由於資料庫正在維修,之後即可恢復。\n\n管理員有如下解釋:$1",
-       "missing-article": "è³\87æ\96\99庫æ\89¾ä¸\8då\88°æ\96\87å­\97ã\80\8c$1ã\80\8d $2ã\80\82\n\né\80\9a常é\80\99æ\98¯ç\94±æ\96¼ä¿®è¨\82æ­·å\8f²é \81é\9d¢ä¸\8aé\81\8eæ\99\82ç\9a\84é\80£çµ\90å\88°å·²ç¶\93被å\88ªé\99¤ç\9a\84é \81é\9d¢æ\89\80å°\8eè\87´ç\9a\84ã\80\82\n\nå¦\82æ\9e\9cæ\83\85æ³\81ä¸\8dæ\98¯é\80\99樣ï¼\8cæ\82¨å\8f¯è\83½æ\89¾å\88°äº\86è»\9fé«\94å\85§ç\9a\84ä¸\80å\80\8bç¨\8bå¼\8fé\8c¯èª¤ã\80\82\nè«\8bè¨\98é\8c\84 URL ä½\8då\9d\80ï¼\8c並å\90\91[[Special:ListUsers/sysop|管ç\90\86å\93¡]]報告此問題。",
-       "missingarticle-rev": "(修訂#: $1)",
-       "missingarticle-diff": "(差異: $1, $2)",
-       "readonly_lag": "附屬資料庫伺服器正在將快取更新到主伺服器,資料庫已被自動鎖定",
+       "laggedslavemode": "<strong>警告:</strong>頁面可能不包含最近的更新。",
+       "readonly": "資料庫已鎖定",
+       "enterlockreason": "請輸入鎖定的原因,包括估計重新開放的時間",
+       "readonlytext": "資料庫目前已鎖定無法新增或修改資料,\n可能正在進行例行的資料庫維修作業,完成之後即可恢復正常。\n\n鎖定資料庫的管理員說明:$1",
+       "missing-article": "è³\87æ\96\99庫æ\9f¥ç\84¡é \90æ\9c\9fç\9a\84é \81é\9d¢æ\96\87å­\97ï¼\8cé \81é\9d¢ \"$1\" $2ã\80\82\n\né\80\9a常æ\98¯å\9b æ\82¨é\80£çµ\90å\88°äº\86å·²é\81\8eæ\9c\9f(已被å\88ªé\99¤)ç\9a\84å·®ç\95°æ\88\96æ­·å\8f²é \81é\9d¢ã\80\82\n\nè\8b¥é\80\99ä¸\8dæ\98¯æ\82¨æ\89\80é\81\87å\88°ç\9a\84æ\83\85æ³\81ï¼\8cæ\82¨å\8f¯è\83½æ\89¾å\88°äº\86ä¸\80å\80\8b系統ç\9a\84å\95\8fé¡\8cã\80\82\nè«\8bè¨\98é\8c\84 URL ä½\8då\9d\80ï¼\8c並å\90\91 [[Special:ListUsers/sysop|管ç\90\86å\93¡]] 報告此問題。",
+       "missingarticle-rev": "(修訂#: $1)",
+       "missingarticle-diff": "(差異:$1, $2)",
+       "readonly_lag": "資料庫已自動鎖定,正在等候次要資料庫同步資料到主要資料庫",
        "internalerror": "內部錯誤",
        "internalerror_info": "內部錯誤:$1",
-       "filecopyerror": "無法複製檔案「$1」到「$2」。",
-       "filerenameerror": "無法重新命名檔案「$1」到「$2」。",
-       "filedeleteerror": "無法刪除「$1」檔案。",
-       "directorycreateerror": "無法建立目錄「$1」。",
-       "filenotfound": "找不到「$1」檔案。",
-       "unexpected": "不正常值:\"$1\"=\"$2\"。",
-       "formerror": "錯誤:無法提交表單",
+       "filecopyerror": "無法複製檔案 \"$1\" 至 \"$2\"。",
+       "filerenameerror": "無法重新命名檔案 \"$1\" 為 \"$2\"。",
+       "filedeleteerror": "無法刪除檔案 \"$1\"。",
+       "directorycreateerror": "無法建立目錄 \"$1\"。",
+       "filenotfound": "找不到檔案 \"$1\"。",
+       "unexpected": "未預期的資料:\"$1\"=\"$2\"。",
+       "formerror": "錯誤:無法送交表單。",
        "badarticleerror": "無法在此頁進行該操作。",
-       "cannotdelete": "無法刪除頁面或圖片「$1」。\n它可能已經被其他人刪除了。",
-       "cannotdelete-title": "無法刪除頁面「$1」",
-       "delete-hook-aborted": "刪除被勾點中止。\n它沒有提供解釋。",
-       "no-null-revision": "ç\84¡æ³\95å\89µå»ºå°\8d\"$1\"é \81é\9d¢新的空白修訂",
-       "badtitle": "錯誤的標題",
+       "cannotdelete": "無法刪除頁面或檔案 \"$1\"。\n它可能已經被其他人刪除。",
+       "cannotdelete-title": "無法刪除頁面 \"$1\"",
+       "delete-hook-aborted": "刪除已被 Hook 中止。\n無任何說明。",
+       "no-null-revision": "ç\84¡æ³\95å°\8dé \81é\9d¢ \"$1\" å»ºç«\8b新的空白修訂",
+       "badtitle": "無效的標題",
        "badtitletext": "所請求頁面的標題是無效的、不存在,跨語言或跨wiki連結的標題錯誤。它可能包含一個或更多的不能用於標題的字符。",
        "perfcached": "下列是快取資料,因此可能不是最新的。最多{{PLURAL:$1|只有1個結果|$1個結果}}可用。",
        "perfcachedts": "下列是快取資料,其最後更新時間是$1。只有{{PLURAL:$4|一個結果|$4個結果}}會被顯示。 A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
        "protectedpagetext": "該頁面已被保護以防止編輯或其他操作。",
        "viewsourcetext": "{{GENDER:|你|妳|你}}可以檢視並複製本頁面的原始碼。",
        "viewyourtext": "您可以查看並複製'''您對此頁面作出編輯後'''的源代碼:",
-       "protectedinterface": "該頁提供此wiki軟體的介面文字,它已被保護以防止惡意修改。\n如欲修改所有wiki的翻譯,請到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化計畫。",
-       "editinginterface": "'''警告:'''您正在編輯的頁面是用於提供軟體的介面文字。\n改變此頁將影響其他在此wiki上的用戶介面外觀。\n如欲修改所有wiki的翻譯,請到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化計畫。",
+       "protectedinterface": "本頁用來提供此 Wiki 軟體介面上的文字,並且已被保護以防止惡意修改。\n如欲增加或修改 Wiki 的翻譯,請至 [//translatewiki.net/ translatewiki.net] 上的MediaWiki 本地化專案。",
+       "editinginterface": "<strong>警告:</strong>您正在編輯的頁面是用來提供軟體介面上的文字。\n更改此頁將影響其他在此 Wiki 上的使用者介面外觀。\n如欲修改 Wiki 的翻譯,請至 [//translatewiki.net/ translatewiki.net]上的MediaWiki 本地化專案。",
        "cascadeprotected": "這個頁面已經被保護,因為這個頁面被以下已標註\"聯鎖保護\"的{{PLURAL:$1|一個|多個}}被保護頁面包含:\n$2",
-       "namespaceprotected": "您並沒有權限編輯'''$1'''名字空間的頁面。",
-       "customcssprotected": "你並無權限編輯此CSS頁面,因為它包含了其他用戶的個人設置。",
-       "customjsprotected": "你並無權限去編輯此JavaScript頁面,因為他包含了另一位用戶的個人設定。",
+       "namespaceprotected": "您沒有權限編輯 <strong>$1</strong> 命名空間的頁面。",
+       "customcssprotected": "您並沒有權限編輯此 CSS 頁面,因為此頁面包含了其他使用者的個人設定。",
+       "customjsprotected": "您並沒有權限編輯此 JavaScript 頁面,因為此頁面包含了其他使用者的個人設定。",
        "mycustomcssprotected": "你沒有編輯這CSS頁面的權限。",
        "mycustomjsprotected": "你沒有編輯這JavaScript頁面的權限。",
        "myprivateinfoprotected": "您沒有權限來編輯您的個人信息。",
-       "mypreferencesprotected": "您沒有權限編輯您的設定。",
+       "mypreferencesprotected": "您沒有權限編輯您的偏好設定。",
        "ns-specialprotected": "特殊頁面是不可以編輯的。",
-       "titleprotected": "這個標題已經被[[User:$1|$1]]保護以防止建立。理由是''$2''。",
+       "titleprotected": "此標題已經被 [[User:$1|$1]] 保護以防止建立,原因是 \"<em>$2</em>\"。",
        "filereadonlyerror": "無法修改文件「$1」因為文件庫「$2」處於唯讀模式。 !\n管理員鎖定它的解釋是:「$3」。",
-       "invalidtitle-knownnamespace": "使用名字空間「$2」和文本「$3」的無效標題",
-       "invalidtitle-unknownnamespace": "使用未知名字空間編號$1和文本“$2”的無效標題",
+       "invalidtitle-knownnamespace": "無效的標題命名空間 \"$2\" 與名稱 \"$3\"",
+       "invalidtitle-unknownnamespace": "無效的標題,不明的命名空間編號 $1 與名稱 \"$2\"",
        "exception-nologin": "未登入",
-       "exception-nologin-text": "你需要[[Special:Userlogin|登錄]]此wiki查閲此頁或進行操作。",
+       "exception-nologin-text": "您需要先 [[Special:Userlogin|登入]] 檢視或者編輯此頁面。",
        "exception-nologin-text-manual": "請$1以便能夠訪問此頁或行動。",
        "virus-badscanner": "損壞設定: 未知的病毒掃瞄器: ''$1''",
        "virus-scanfailed": "掃瞄失敗 (代碼 $1)",
        "virus-unknownscanner": "未知的防病毒:",
        "logouttext": "您已經登出。\n\n請注意,如果你再次登入,此頁或會繼續顯示,直到您清除瀏覽器緩存。",
        "welcomeuser": "歡迎,$1!",
-       "welcomecreation-msg": "您的帳號已建立。\n不要忘記變更您的[[Special:Preferences| {{SITENAME}} 的偏好設定]]。",
+       "welcomecreation-msg": "您的帳號已建立。\n不要忘記變更您的 {{SITENAME}} [[Special:Preferences|偏好設定]]。",
        "yourname": "使用者名稱:",
-       "userlogin-yourname": "使用者名稱",
+       "userlogin-yourname": "使用者名稱",
        "userlogin-yourname-ph": "輸入您的使用者名稱",
        "createacct-another-username-ph": "輸入帳號名稱",
        "yourpassword": "您的密碼:",
        "userlogin-remembermypassword": "保持我的登入狀態",
        "userlogin-signwithsecure": "使用安全連線",
        "yourdomainname": "您的網域:",
-       "password-change-forbidden": "您不可變更此圍記(Wiki)上的密碼。",
+       "password-change-forbidden": "您不可變更此維基(Wiki)上的密碼。",
        "externaldberror": "這可能是由於驗證資料庫錯誤,或是您被禁止更新您的外部帳號。",
        "login": "登入",
        "nav-login-createaccount": "登入/建立新帳號",
        "gotaccountlink": "登入",
        "userlogin-resetlink": "忘記了您的登入細節?",
        "userlogin-resetpassword-link": "忘記您的密碼?",
-       "userlogin-helplink2": "ç\99»å\85¥å¹«助",
-       "userlogin-loggedin": "您已作為{{GENDER:$1|$1}}登錄。\n利用以下表單以作為另一賬戶登錄。",
+       "userlogin-helplink2": "ç\99»å\85¥å\8d\94助",
+       "userlogin-loggedin": "您目前已登入 {{GENDER:$1|$1}} 使用者,\n請使用下列表單登入另一位使用者。",
        "userlogin-createanother": "建立另一賬戶",
        "createacct-emailrequired": "電子郵件",
        "createacct-emailoptional": "電子郵件(可選)",
        "createacct-another-submit": "建立另一帳號",
        "createacct-benefit-heading": "{{SITENAME}}是由像您一樣的人建立。",
        "createacct-benefit-body1": "{{PLURAL:$1|次編輯}}",
-       "createacct-benefit-body2": "$1個頁面",
+       "createacct-benefit-body2": "$1 頁",
        "createacct-benefit-body3": "位近期{{PLURAL:$1|貢獻者}}",
        "badretype": "您所輸入的密碼並不符合。",
        "userexists": "您所輸入的使用者名稱已存在,請另選一個名稱。",
        "loginerror": "登入錯誤",
        "createacct-error": "帳號建立錯誤",
        "createaccounterror": "無法建立帳號:$1",
-       "nocookiesnew": "已成功建立新帳號!偵測到您已關閉 Cookies,請開啟它並登入。",
-       "nocookieslogin": "本站利用 Cookies 進行使用者登入,偵測到您已關閉 Cookies,請開啟它並重新登入。",
+       "nocookiesnew": "使用者帳號已建立成功,但您尚未登入。\n要登入 {{SITENAME}} 使用者需使用 Cookies,\n您的 Cookies 未尚開啟。\n請在開啟後使用您新的使用者名稱及密碼登入。",
+       "nocookieslogin": "要登入 {{SITENAME}} 使用者需使用 Cookies,\n您的 Cookies 未尚開啟。\n請在開啟後重試。",
        "nocookiesfornew": "這個使用者的帳號未建立,我們不能確認它的來源。\n請確認您已開啟 Cookie,重新載入後再試。",
-       "noname": "{{GENDER:|你|妳|你}}沒有輸入一個有效的使用者名稱。",
+       "noname": "您輸入的使用者名稱無效。",
        "loginsuccesstitle": "登入成功",
        "loginsuccess": "{{GENDER:|你|妳|你}}正在以「$1」的身份在 {{SITENAME}} 登入。",
-       "nosuchuser": "æ\89¾ä¸\8då\88°ç\94¨æ\88¶ \"$1\"ã\80\82\nç\94¨æ\88¶å\90\8d稱æ\98¯æ\9c\89大å°\8f寫å\8d\80å\88\86ç\9a\84ã\80\82\n檢æ\9f¥æ\82¨ç\9a\84æ\8b¼å¯«ï¼\8cæ\88\96è\80\85ç\94¨ä¸\8bé\9d¢ç\9a\84表格[[Special:UserLogin/signup|建ç«\8bä¸\80å\80\8bæ\96°è³¬號]]。",
-       "nosuchusershort": "æ²\92æ\9c\89ä¸\80å\80\8bå\90\8dç\82ºã\80\8c$1ã\80\8dç\9a\84ç\94¨æ\88¶ã\80\82請檢查您輸入的文字是否有錯誤。",
-       "nouserspecified": "{{GENDER:|你|妳|你}}需要指定一個用戶名。",
-       "login-userblocked": "這位用戶已被封鎖。不容許登入。",
+       "nosuchuser": "æ\9f¥ç\84¡ä½¿ç\94¨è\80\85 \"$1\"ã\80\82\n使ç\94¨è\80\85å\90\8d稱æ\9c\89大å°\8f寫å\8d\80å\88\86ï¼\8c\nè«\8b檢æ\9f¥æ\82¨è¼¸å\85¥ç\9a\84å­\97æ¯\8dï¼\8cæ\88\96è\80\85 [[Special:UserLogin/signup|建ç«\8bæ\96°å¸³號]]。",
+       "nosuchusershort": "æ\9f¥ç\84¡ä½¿ç\94¨è\80\85 \"$1\"ï¼\8c\n請檢查您輸入的文字是否有錯誤。",
+       "nouserspecified": "您必須指定一個使用者名稱。",
+       "login-userblocked": "這位使用者已被封鎖,不允許登入。",
        "wrongpassword": "您輸入的密碼錯誤,請再試一次。",
        "wrongpasswordempty": "沒有輸入密碼!請重試。",
        "passwordtooshort": "您的密碼不能少於$1個字元。",
-       "password-name-match": "您的密碼必須跟您的用戶名不相同。",
-       "password-login-forbidden": "這個用戶名稱及密碼的使用是被禁止的。",
+       "password-name-match": "您的密碼不可跟您的使用者相同。",
+       "password-login-forbidden": "已禁止使用此使用者名稱和密碼。",
        "mailmypassword": "重設密碼",
        "passwordremindertitle": "{{SITENAME}}的新臨時密碼",
-       "passwordremindertext": "有人(可能是您,來自IP位址$1)已請求{{SITENAME}}的新密碼 ($4)。\n用戶\"$2\"的一個新臨時密碼現在已被設定好為\"$3\"。\n如果這個動作是您所指示的,您便需要立即登入並選擇一個新的密碼。\n您的臨時密碼會於{{PLURAL:$5|一|$5}}天內過期。\n\n如果是其他人發出了該請求,或者您已經記起了您的密碼並不準備改變它,\n您可以忽略此消息並繼續使用您的舊密碼。",
-       "noemail": "用戶「$1」沒有登記電子郵件地址。",
+       "passwordremindertext": "不明人士 (可能是您自己,來自 IP 位址 $1) 要求重設在 {{SITENAME}} ($4) 的密碼。\n給使用者 \"$2\" 的臨時密碼設為 \"$3\"。\n如果這個動作是您做的,您需要立即登入並設定一個新的密碼,\n您的臨時密碼將於{{PLURAL:$5|一|$5}}天內過期。\n\n如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
+       "noemail": "使用者 \"$1\" 未登記電子郵件地址。",
        "noemailcreate": "您需要提供一個有效的電子郵件地址",
-       "passwordsent": "用戶「$1」的新密碼已經寄往所登記的電子郵件地址。\n請在收到後再登入。",
-       "blocked-mailpassword": "您的IP地址處於查封狀態而不允許編輯,為了安全起見,密碼恢復功能已被禁用。",
+       "passwordsent": "使用者 \"$1\" 的新密碼已寄出至當出登記的電子郵件地址,\n請稍後收到信件後再登入。",
+       "blocked-mailpassword": "您的 IP 位址已被封鎖不允編輯,密碼復原的功能也同樣被禁止使用以防止被濫用。",
        "eauthentsent": "一封確認信已遞送至您設定的電郵位址。\n在發送其它郵件到此賬戶前,您必須首先依照這封信中的指導確認這個電子郵件信箱真實有效。",
        "throttled-mailpassword": "密碼提醒已經在前$1小時內發送。\n為防止濫用,限定在$1小時內僅發送一次密碼提醒。",
        "mailerror": "發送郵件錯誤: $1",
        "acct_creation_throttle_hit": "在這個wiki上的訪客利用您的IP地址在昨天創建了$1個賬戶,是在這段時間中的上限。\n結果利用這個IP地址的訪客在這段時間中不能創建更多的賬戶。",
-       "emailauthenticated": "您的電子郵件位址已於$2在$3確認。",
+       "emailauthenticated": "您的電子郵件位址已確認於 $2 的 $3。",
        "emailnotauthenticated": "您的電郵位址尚未確認。\n將不會發送與以下功能相關的電郵。",
-       "noemailprefs": "å\9c¨æ\82¨ç\9a\84å\8f\83æ\95¸è¨­ç½®ä¸­æ\8c\87å®\9aä¸\80å\80\8bé\9b»å­\90é\83µä»¶å\9c°å\9d\80以使ç\94¨æ­¤功能。",
+       "noemailprefs": "å\9c¨æ\82¨ç\9a\84å\81\8f好設å®\9a中設å®\9aé\9b»å­\90é\83µä»¶å\9c°å\9d\80ï¼\8cè®\93æ\82¨å\8f¯ä»¥ä½¿ç\94¨é\80\99äº\9b功能。",
        "emailconfirmlink": "確認您的電子郵件位址",
        "invalidemailaddress": "郵箱地址格式不正確,請輸入正確的郵箱位址或清空該輸入框。",
-       "cannotchangeemail": "此圍記(Wiki)不允許對帳號的電子郵件位址進行變更。",
+       "cannotchangeemail": "此維基(Wiki)不允許對帳號的電子郵件位址進行變更。",
        "emaildisabled": "此網站不能發送電子郵件。",
        "accountcreated": "已建立帳號",
-       "accountcreatedtext": "[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|討論]])的賬戶已經被建立。",
+       "accountcreatedtext": "使用者帳號 [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|對話]]) 已建立。",
        "createaccount-title": "在{{SITENAME}}中建立新賬戶",
        "createaccount-text": "有人在{{SITENAME}}中利用您的電郵創建了一個名為 \"$2\" 的新賬戶($4),密碼是 \"$3\" 。您應該立即登入並更改密碼。\n\n如果該賬戶建立錯誤的話,您可以忽略此訊息。",
        "login-throttled": "您已經嘗試多次的登入動作。\n請稍等$1後再試。",
        "login-abort-generic": "登入錯誤 - 中止",
        "loginlanguagelabel": "語言:$1",
        "suspicious-userlogout": "您登出的要求已經被拒絕,因為它可能是由已損壞的瀏覽器或者快取代理傳送。",
-       "createacct-another-realname-tip": "真實姓名為選填。\n如果您選擇提供,它將用於貢獻署名。",
+       "createacct-another-realname-tip": "真實姓名為選填欄位。\n若您提供真實姓名,它會用於使用者貢獻署名。",
        "pt-login": "登入",
        "pt-login-button": "登入",
        "pt-createaccount": "建立帳戶",
        "passwordreset-text-one": "完成此表格以重新設定您的密碼。",
        "passwordreset-text-many": "{{PLURAL:$1|鍵入一個電郵位址以便遞送新密碼。}}",
        "passwordreset-legend": "重設密碼",
-       "passwordreset-disabled": "此圍記(Wiki)已禁用重設密碼。",
-       "passwordreset-emaildisabled": "此圍記(Wiki)已禁用電子郵件功能。",
+       "passwordreset-disabled": "此維基(Wiki)已禁用重設密碼。",
+       "passwordreset-emaildisabled": "此維基(Wiki)已禁用電子郵件功能。",
        "passwordreset-username": "使用者名稱:",
        "passwordreset-domain": "域名:",
-       "passwordreset-capture": "檢視產生的電子郵件嗎?",
-       "passwordreset-capture-help": "如果您選中此框,電子郵件(包括臨時密碼)將顯示,並發送給用戶。",
+       "passwordreset-capture": "檢視電子郵件內容?",
+       "passwordreset-capture-help": "如果您勾選此方塊,電子郵件(包含臨時密碼)將顯示,並發送給使用者。",
        "passwordreset-email": "電子郵件位址:",
        "passwordreset-emailtitle": "在{{SITENAME}}上的詳細訊息",
-       "passwordreset-emailtext-ip": "有人(可能是你,來自$1這個IP)要求重置{{SITENAME}}($4)的密碼。該用戶{{PLURAL:$3|是}}與以下電郵地址有關:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}會在{{PLURAL:$5|一天|$5天}}到期。\n你應該現在登入並選擇一個新的密碼。如果不是你作出這個請求,又或你已經記\n起你原來的密碼,你可以忽略本信息並使用你原來的密碼。",
-       "passwordreset-emailtext-user": "用戶$1要求重置在{{SITENAME}}($4)的密碼。該用戶{{PLURAL:$3|是}}與以下\n電郵地址有關:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}會在{{PLURAL:$5|一天|$5天}}到期。\n你應該現在登入並選擇一個新的密碼。如果不是你作出這個請求,又或你已經記\n起你原來的密碼,你可以忽略本信息並使用你原來的密碼。",
+       "passwordreset-emailtext-ip": "不明人士 (可能是您自己,來自 IP 位址 $1) 要求重設在 {{SITENAME}}($4)的密碼,下列是與此電子郵件地址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
+       "passwordreset-emailtext-user": "使用者 $1 要求重設在 {{SITENAME}}($4)的密碼,下列是與此電子郵件地址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailelement": "使用者名稱:$1\n臨時密碼:$2",
        "passwordreset-emailsent": "已發送重設密碼的電子郵件。",
        "passwordreset-emailsent-capture": "已發送重設密碼的電子郵件,並在下面顯示。",
        "hr_tip": "水平線 (小心使用)",
        "summary": "摘要:",
        "subject": "主題:",
-       "minoredit": "這是一個小修",
+       "minoredit": "這是一個小修",
        "watchthis": "監視本頁",
        "savearticle": "儲存本頁",
        "preview": "預覽",
        "missingcommentheader": "'''提示:''' 您沒有為此評論提供一個標題。如果您再次單擊「{{int:savearticle}}」,您的編輯將不帶標題儲存。",
        "summary-preview": "摘要預覽:",
        "subject-preview": "主題/標題預覽:",
-       "blockedtitle": "用戶被查封",
-       "blockedtext": "'''您的用戶名或IP地址已被封禁。'''\n\n此次封禁操作由$1完成,封禁原因爲''$2''。\n\n* 起始時間:$8\n* 終止時間:$6\n* 擬封禁對象:$7\n\n您可以聯繫$1或其他的[[{{MediaWiki:Grouppage-sysop}}|管理員]]討論此次封禁。若您已在[[Special:Preferences|帳號設置]]中配置了一個有效的電子郵件地址,且未被封禁電子郵件功能,則您可通過“發送電子郵件給這位用戶”功能來聯絡相關管理員。您當前的IP地址是$3,此次封禁的ID爲#$5。請在您的查詢中註明上述所有信息。",
-       "autoblockedtext": "{{GENDER:|你|妳|你}}的IP地址已經被自動查封,由於先前的另一位用戶被$1所查封。\n而查封的原因是:\n\n:''$2''\n\n* 這次查封的開始時間是:$8\n* 這次查封的到期時間是:$6\n* 對於被查封者:$7\n\n{{GENDER:|你|妳|你}}可以聯絡$1或者其他的[[{{MediaWiki:Grouppage-sysop}}|管理員]],討論這次查封。\n除非{{GENDER:|你|妳|你}}已經在{{GENDER:|你|妳|你}}的[[Special:Preferences|賬號參數設置]]中設定了一個有效的電子郵件地址,否則{{GENDER:|你|妳|你}}是不能使用「電郵這位用戶」的功能。當設定了一個有效的電子郵件地址後,這個功能是不會封鎖的。\n\n您現時正在使用的 IP 地址是 $3,查封ID是 #$5。 請在{{GENDER:|你|妳|你}}的查詢中註明以上所有的資料。",
+       "blockedtitle": "使用者已被封鎖",
+       "blockedtext": "<strong>您的使用者名稱或 IP 位址以被封鎖。</strong>\n\n您被 $1 封鎖,\n原因爲 <em>$2</em>。\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯繫 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"發送電子郵件給這位使用者\" 的功能來聯絡相關管理員。\n您目刖的 IP 位址是 $3,此次封鎖的 ID 爲 #$5。\n請您在詢問時附註以上詳細訊息。",
+       "autoblockedtext": "因先前的另一位使用者被 $1 封鎖,您的 IP 位址已被自動封鎖。\n原因是:\n\n:<em>$2</em>\n\n* 封鎖開始時間:$8\n* 封鎖結束時間:$6\n* 相關封鎖對象:$7\n\n您可以聯繫 $1 或其他的 [[{{MediaWiki:Grouppage-sysop}}|管理員]] 討論封鎖的相關問題。\n若您已在 [[Special:Preferences|偏好設定]] 中設定了一個有效的電子郵件地址,且尚未被封鎖郵件功能,則您可透過 \"發送電子郵件給這位使用者\" 的功能來聯絡相關管理員。\n您目刖的 IP 位址是 $3,此次封鎖的 ID 爲 #$5。\n請您在詢問時附註以上詳細訊息。",
        "blockednoreason": "無給出原因",
        "whitelistedittext": "您必須先$1才可編輯頁面。",
-       "confirmedittext": "å\9c¨ç·¨è¼¯æ­¤é \81ä¹\8bå\89\8dæ\82¨å¿\85é \88確èª\8dæ\82¨ç\9a\84é\83µç®±ä½\8då\9d\80ã\80\82è«\8bé\80\8fé\81\8e[[Special:Preferences|å\81\8f好設å®\9a]]設å®\9a並é©\97è­\89æ\82¨ç\9a\84é\83µç®±å\9c°址。",
+       "confirmedittext": "å\9c¨ç·¨è¼¯æ­¤é \81ä¹\8bå\89\8dæ\82¨å¿\85é \88確èª\8dæ\82¨ç\9a\84é\9b»å­\90é\83µä»¶ä½\8då\9d\80ã\80\82\nè«\8bé\80\8fé\81\8e [[Special:Preferences|å\81\8f好設å®\9a]] è¨­å®\9a並é©\97è­\89æ\82¨ç\9a\84é\9b»å­\90é\83µä»¶ä½\8d址。",
        "nosuchsectiontitle": "找不到段落",
        "nosuchsectiontext": "您嘗試編輯的章節並不存在。\n可能在您查看頁面時已經移動或刪除。",
        "loginreqtitle": "需要登入",
        "loginreqlink": "登入",
-       "loginreqpagetext": "您必須$1才能檢視其它頁面。",
+       "loginreqpagetext": "您必須 $1 才能檢視其它頁面。",
        "accmailtitle": "密碼已寄出",
-       "accmailtext": "[[User talk:$1|$1]]的隨機產生密碼已經寄到$2。其可於登入後予以'''[[Special:ChangePassword|更改]]'''。",
+       "accmailtext": "[[User talk:$1|$1]] 的隨機密碼已經寄送至 $2,可登入後至 <em>[[Special:ChangePassword|變更密碼]] 頁面更改</em>。",
        "newarticle": "(新)",
-       "newarticletext": "您進入了一個尚未建立的頁面。\n要建立該頁面,請在下面的編輯框中輸入內容(詳情參見[$1 幫助])。\n如果您是不小心來到此頁面,直接點擊您瀏覽器中的「返回」按鈕返回。",
-       "anontalkpagetext": "---- ''這是一個還未建立賬號的匿名用戶的對話頁。我們因此只能用IP地址來與他/她聯絡。該IP地址可能由幾名用戶共享。如果您是一名匿名用戶並認為本頁上的評語與您無關,請[[Special:UserLogin/signup|創建新賬號]]或[[Special:UserLogin|登入]]以避免在未來於其他匿名用戶混淆。''",
+       "newarticletext": "您正連結至一頁不存在頁面。\n要建立該頁面,請在下方的編輯框中輸入內容(詳情請參考 [$1 説明頁面])。\n如果您是不小心來到此頁面,請點選瀏覽器的 <strong>返回</strong> 按鈕。",
+       "anontalkpagetext": "----\n<em>此討論頁面是給尚未建立帳號的匿名使用者使用</em>\n因此我們必須使用 IP 位址來辨識身份,但相同的 IP 位置可能由許多不同的使用者所共用。\n如果您是匿名使用者並且覺得評論的內容與您無關,請 [[Special:UserLogin/signup|建立新帳號]] 或 [[Special:UserLogin|登入]] 避免與其他匿名使用者混淆。",
        "noarticletext": "此頁面目前沒有內容,您可以在其它頁面[[Special:Search/{{PAGENAME}}|搜尋此頁標題]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋有關日誌],\n或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編輯此頁]</span>。",
        "noarticletext-nopermission": "此頁目前沒有內容。\n您可以在其它頁[[Special:Search/{{PAGENAME}}|搜尋此頁標題]],或<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋有關日誌]</span>,但您沒有權限建立此頁。",
        "missing-revision": "「{{FULLPAGENAME}}」的#$1修訂版本不存在。\n\n這通常是因為過時的頁面歷史鏈接被刪除。\n詳情請閱[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
-       "userpage-userdoesnotexist": "用戶「$1」尚未註冊。\n請在建立/編輯這個頁面前先檢查一下。",
-       "userpage-userdoesnotexist-view": "未曾建立用戶名「$1」。",
-       "blocked-notice-logextract": "這位用戶現正被封鎖。\n下面有最近的封鎖紀錄以供參考:",
-       "clearyourcache": "'''注意:'''在保存以後,您必須繞過瀏覽器緩存才能看到所作出的改變。\n* '''火狐(Firefox)/Safari:'''按住“Shift”鍵再點擊“刷新”,或按下“Ctrl-F5”或“Ctrl-R”(Mac上為“⌘-R”)\n* '''谷歌瀏覽器(Google Chrome):'''按下“Ctrl-Shift-R”(Mac上為“⌘-Shift-R”)\n* '''Internet Explorer:'''按住“Ctrl”鍵再點擊“刷新”,或按下“Ctrl-F5”\n* '''Opera:'''在“工具→首選項”中清除緩存",
+       "userpage-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。\n若您要建立/編輯此頁面,請先檢查是否正確。",
+       "userpage-userdoesnotexist-view": "使用者帳號 \"$1\" 尚未註冊。",
+       "blocked-notice-logextract": "此使用者目前已被封鎖。\n以下為最近的封鎖紀錄以供參考:",
+       "clearyourcache": "<strong>注意:</strong> 在您儲存之後您必須清除瀏覽器快取才可看到最新的變動。\n* <strong>Firefox / Safari:</strong> 按住 <em>Shift</em> 時點選 <em>重新整理</em>,或按 <em>Ctrl-F5</em> 或 <em>Ctrl-R</em> (Mac 為 <em>⌘-R</em>)\n* <strong>Google Chrome:</strong> 按 <em>Ctrl-Shift-R</em> (Mac 為 <em>⌘-Shift-R</em>)\n* <strong>Internet Explorer:</strong> 按住 <em>Ctrl</em> 時點選 <em>重新整理</em>,或按 <em>Ctrl-F5</em>\n* <strong>Opera:</strong> 進入 <em>工具 → 偏好設定</em> 中清除快取。",
        "usercssyoucanpreview": "'''提示:''' 在保存前請用「{{int:showpreview}}」按鈕來測試您新的 CSS 。",
        "userjsyoucanpreview": "'''提示:''' 在保存前請用「{{int:showpreview}}」按鈕來測試您新的 JavaScript 。",
        "usercsspreview": "'''記住您只是在預覽您的個人 CSS。'''\n'''還沒有儲存﹗'''",
        "sitejspreview": "'''記住你現在只是預覽此 JavaScript 代碼。'''\n'''還沒有儲存!'''",
        "userinvalidcssjstitle": "'''警告:''' 不存在面板「$1」。\n注意自訂的 .css 和 .js 頁要使用小寫標題,例如,{{ns:user}}:Foo/vector.css 不同於 {{ns:user}}:Foo/Vector.css。",
        "updated": "(已更新)",
-       "note": "'''注意:'''",
+       "note": "</strong>注意:</strong>",
        "previewnote": "'''請記住這只是預覽。'''\n您的變更尚未儲存!",
        "continue-editing": "往編輯框",
        "previewconflict": "這個預覽顯示了上面文字編輯區中的內容。它將在{{GENDER:|你|妳|你}}選擇保存後出現。",
        "session_fail_preview": "'''很抱歉!由於部份資料遺失,我們無法處理您的編輯。'''\n請再試一次。\n如果仍然失敗,請[[Special:UserLogout|登出]]後重新登入。",
        "session_fail_preview_html": "'''抱歉!部份資料已遺失,我們無法處理您的編輯。'''\n\n''由於{{SITENAME}}已經開放原始 HTML 碼,預覽已經隱藏以預防 JavaScript 的攻擊。''\n\n'''如果這個編輯過程沒有問題,請再試一次。如果仍然有問題,請[[Special:UserLogout|登出]]後再重新登入一次。'''",
-       "token_suffix_mismatch": "'''由於您用戶端中的編輯信符毀損了一些標點符號字元,為防止編輯的文字損壞,您的編輯已經被拒絕。'''\n這種情況通常出現於使用含有很多臭蟲、以網絡為主的匿名代理服務的時候。",
+       "token_suffix_mismatch": "<strong>由於您使用的客戶端軟體損壞了編輯標記中的符號,您的編輯已被拒絕接受。</strong>\n為了避免破壞頁面文字,已拒絕此編輯,\n這通常是因為您使用了有問題的網頁匿名代理伺服器。",
        "edit_form_incomplete": "編輯表單的某些部分沒有到達伺服器 ;請檢查您的編輯內容是否完整並再試一次。",
        "editing": "編輯「$1」",
        "creating": "建立「$1」",
        "copyrightwarning2": "請注意您對{{SITENAME}}的所有貢獻\n都可能被其他貢獻者編輯,修改或刪除。\n如果您不希望您的文字被任意修改和再散佈,請不要提交。<br />\n您同時也要向我們保證您所提交的內容是您自己所作,或得自一個不受版權保護或相似自由的來源(參閱$1的細節)。\n'''不要在未獲授權的情況下發表!'''",
        "longpageerror": "'''錯誤:您所提交的文本長度有{{PLURAL:$1|1|$1}}KB,這大於{{PLURAL:$2|1|$2}}KB的最大值。 '''\n因此,該文本無法保存。",
        "readonlywarning": "'''警告: 資料庫被鎖定以進行維護,所以您目前將無法保存您的修改。'''\n您可先複製您的文字並保存到文字檔案,然後等一會兒再修改。\n\n鎖定資料庫的管理員有如下解釋:$1",
-       "protectedpagewarning": "'''警告:本頁已經被保護,只有擁有管理員許可權的用戶才可修改。'''\n最近的日誌在下面提供以便參考:",
-       "semiprotectedpagewarning": "'''注意:'''本頁面被保護,僅限註冊用戶編輯。\n最近的日誌在下面提供以便參考:",
-       "cascadeprotectedwarning": "'''警告:'''本頁已經被保護,只有擁有管理員權限的用戶才可修改,因為本頁已被以下連鎖保護的{{PLURAL:$1|一個|多個}}頁面所包含:",
+       "protectedpagewarning": "<strong>警告:本頁已經被保護,只有擁有管理員權限的使用者才可編輯。</strong>\n以下提供最近的日誌以便參考:",
+       "semiprotectedpagewarning": "<strong>注意:</strong>本頁已經被保護,只有已註冊的使用者才可編輯。\n以下提供最近的日誌以便參考:",
+       "cascadeprotectedwarning": "<strong>警告:</strong>本頁已經被保護,只有擁有管理員權限的使用者才可編輯,此頁面被下列頁面引用因此連鎖保護:",
        "titleprotectedwarning": "'''警告:本頁面已被保護,需要[[Special:ListGroupRights|指定權限]]方可創建。'''\n最近的日誌在下面提供以便參考:",
        "templatesused": "此頁面包含以下{{PLURAL:$1|模板}}:",
        "templatesusedpreview": "此次預覽中使用的{{PLURAL:$1|模板}}有:",
        "edittools": "<!-- 此處的文字將被顯示在編輯和上傳表單以下。 -->",
        "nocreatetext": "{{SITENAME}}限制了創建新頁面的功能。{{GENDER:|你|妳|你}}可以返回並編輯已有的頁面,或者[[Special:UserLogin|登錄或創建新賬戶]]。",
        "nocreate-loggedin": "您並無許可權去創建新頁面。",
-       "sectioneditnotsupported-title": "ä¸\8dæ\94¯æ\8c\81段è\90½ç·¨è¼¯",
+       "sectioneditnotsupported-title": "ä¸\8dæ\94¯æ\8f´ç·¨è¼¯ç« ç¯\80",
        "sectioneditnotsupported-text": "此頁面不支持段落編輯。",
        "permissionserrors": "權限錯誤",
        "permissionserrorstext": "根據以下的{{PLURAL:$1|原因}},您並無權限去做以下的動作:",
        "content-failed-to-parse": "未能轉換$2 內容成為$1:$3",
        "invalid-content-data": "內容資料無效",
        "content-not-allowed-here": "[[$2]]頁面上不允許「$1」內容",
-       "editwarning-warning": "離開這個頁面可能會令您失去之前作出的所有更改。若您已經登入,您可在偏好設定的「{{int:prefs-editing}}」部份裡關閉此警告。",
+       "editwarning-warning": "離開此頁面可能會令您遺失之前所作的所有更改。\n若您已經登入,您可在偏好設定的 \"{{int:prefs-editing}}\" 關閉此警告。",
        "editpage-notsupportedcontentformat-title": "內容格式尚無法支援",
        "editpage-notsupportedcontentformat-text": "內容模型$2尚無法支援內容格式$1。",
        "content-model-wikitext": "維基文字",
        "undo-failure": "由於中途的編輯不一致,此編輯不能撤銷。",
        "undo-norev": "由於其修訂版本不存在或已刪除,此編輯不能撤銷。",
        "undo-nochange": "是次編輯似乎已經被撤銷。",
-       "undo-summary": "取消由[[Special:Contributions/$2|$2]] ([[User talk:$2|對話]])所作出的修訂 $1",
-       "undo-summary-username-hidden": "é\9a±è\97\8fç\9a\84ç\94¨æ\88¶æ\92¤é\8a·$1ç\9a\84ä¿®è¨\82",
+       "undo-summary": "取消由 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 所作出的修訂 $1",
+       "undo-summary-username-hidden": "é\82\84å\8e\9fé\9a±è\97\8f使ç\94¨è\80\85ç\9a\84ä¿®è¨\82 $1",
        "cantcreateaccounttitle": "無法建立帳號",
-       "cantcreateaccount-text": "從這個 IP 位址 (<b>$1</b>) 建立帳號已經被 [[User:$3|$3]] 禁止。\n\n當中被 $3 封禁的原因是 ''$2''",
-       "cantcreateaccount-range-text": "於此IP位址段'''$1'''之賬戶註冊被[[User:$3|$3]]禁止,其亦包括您所使用之IP位址('''$4''')。\n$3所述禁止原因為“$2”。",
-       "viewpagelogs": "æ\9f¥è©¢é\80\99å\80\8b頁面的日誌",
+       "cantcreateaccount-text": "來自這個 IP 位址 (<strong>$1</strong>) 建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n $3 封鎖的原因是 <em>$2</em>",
+       "cantcreateaccount-range-text": "來自 IP 位址範圍 '''$1''',包含您的 IP 位置 ('''$4''') 所建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n $3 封鎖的原因是 ''$2''",
+       "viewpagelogs": "檢è¦\96æ­¤頁面的日誌",
        "nohistory": "沒有本頁的修訂記錄。",
        "currentrev": "最新修訂版本",
        "currentrev-asof": "$1的最新修訂版本",
        "last": "先前",
        "page_first": "最前",
        "page_last": "最後",
-       "histlegend": "差異選擇:標記要比較修訂版本的單選按鈕並點擊底部的按鈕進行比較。<br />\n說明:'''({{int:cur}})''' 指與最新修訂版本比較,'''({{int:last}})''' 指與前一個修訂修訂版本比較,'''{{int:minoreditletter}}''' = 小修。",
+       "histlegend": "差異選擇:標記要比較修訂版本的單選按鈕並點擊底部的按鈕進行比較。<br />\n說明:'''({{int:cur}})''' 指與最新修訂版本比較,'''({{int:last}})''' 指與前一個修訂修訂版本比較,'''{{int:minoreditletter}}''' = 小修。",
        "history-fieldset-title": "瀏覽歷史",
        "history-show-deleted": "僅限已刪除",
        "histfirst": "最早版本",
        "history-feed-item-nocomment": "$1 在 $2",
        "history-feed-empty": "所請求的頁面不存在。它可能已被刪除或重新命名。\n嘗試[[Special:Search|搜索本站]]獲得相關的新建頁面。",
        "rev-deleted-comment": "(編輯摘要已除)",
-       "rev-deleted-user": "(用戶名已移除)",
+       "rev-deleted-user": "(已移除使用者名稱)",
        "rev-deleted-event": "(日誌已除)",
-       "rev-deleted-user-contribs": "[用戶名或IP地址已移除 - 從貢獻中隱藏編輯]",
+       "rev-deleted-user-contribs": "[使用者名稱或 IP 位址已移除 - 已隱藏貢獻清單中的編輯]",
        "rev-deleted-text-permission": "該頁面修訂已被'''刪除'''。在[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]中可以找到詳細的訊息。",
        "rev-deleted-text-unhide": "本頁面版本已被'''刪除'''。詳情請見[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。如果你想繼續操作,你仍然可以[$1 查看本版本]。",
        "rev-suppressed-text-unhide": "該頁面修訂已經被'''監督隱藏'''。在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 監督日誌]中可以找到詳細的信息。如果您想繼續的話,您可以仍然[$1 去查看這次修訂]。",
        "revdelete-hide-image": "隱藏檔案內容",
        "revdelete-hide-name": "隱藏動作和目標",
        "revdelete-hide-comment": "編輯摘要",
-       "revdelete-hide-user": "編輯者的用戶名/IP位址",
-       "revdelete-hide-restricted": "å\90\8cæ\99\82廢止ç\94±æ\93\8dä½\9cå\93¡ä»¥å\8f\8aå\85¶ä»\96ç\94¨æ\88¶ç\9a\84資料",
+       "revdelete-hide-user": "編輯者的使用者名稱/IP 位址",
+       "revdelete-hide-restricted": "å°\8d管ç\90\86è\80\85å\8f\8aå\85¶ä»\96使ç\94¨è\80\85é\9a±è\97\8f資料",
        "revdelete-radio-same": "(不更改)",
        "revdelete-radio-set": "隱藏",
        "revdelete-radio-unset": "可見",
-       "revdelete-suppress": "å\90\8cæ\99\82廢止ç\94±æ\93\8dä½\9cå\93¡ä»¥å\8f\8aå\85¶ä»\96ç\94¨æ\88¶ç\9a\84資料",
+       "revdelete-suppress": "å°\8d管ç\90\86è\80\85å\8f\8aå\85¶ä»\96使ç\94¨è\80\85é\9a±è\97\8f資料",
        "revdelete-unsuppress": "在已恢復的修訂中移除限制",
        "revdelete-log": "理由:",
        "revdelete-submit": "應用於選取的{{PLURAL:$1|修訂}}",
        "revdelete-no-change": "警告:於$1 $2之項目已經請求了可見性的設定。",
        "revdelete-concurrent-change": "正在更改於$1 $2之項目錯誤:當我們嘗試更改它的設定時,已經被另一些人更改過。請檢查紀錄。",
        "revdelete-only-restricted": "在隱藏$1 $2的項目時發生錯誤:您不能在選擇了另一可見性選項後廢止管理員查看該項目。",
-       "revdelete-reason-dropdown": "*常用刪除理由\n** 侵犯版權\n** 不合適的評論或個人資料\n** 不當的用戶名\n** 潛在誹謗的資料",
+       "revdelete-reason-dropdown": "*常見的刪除原因\n** 侵犯版權\n** 不合適的評論或個人資訊\n** 不當的使用者名稱\n** 隱含誹謗的資訊",
        "revdelete-otherreason": "其它/附加的理由:",
        "revdelete-reasonotherlist": "其它理由",
        "revdelete-edit-reasonlist": "編輯刪除埋由",
        "revdelete-offender": "修訂版本編輯者:",
        "suppressionlog": "監督日誌",
-       "suppressionlogtext": "該列表列出對管理員隱藏的刪除與封禁。另參見[[Special:BlockList|封鎖名單]]以查詢當前的封禁列表。",
+       "suppressionlogtext": "以下清單為管理員透過刪除或封鎖所隱藏的內容。\n請至 [[Special:BlockList|封鎖清單]] 取得目前已封鎖的清單。",
        "mergehistory": "合併頁面歷史",
        "mergehistory-header": "這一頁可以講您合併一個來源頁面的歷史到另一個新頁面中。\n請確認這次更改會繼續保留該頁面先前的歷史版本。",
        "mergehistory-box": "合併兩個頁面的修訂:",
        "showhideselectedversions": "顯示/隱藏選定的修訂版本",
        "editundo": "復原",
        "diff-empty": "(沒有差異)",
-       "diff-multi-sameuser": "(未顯示同用戶所作出之$1次版本)",
-       "diff-multi-otherusers": "(未顯示$2位用戶所作出之$1次版本)",
-       "diff-multi-manyusers": "(由多於$2名用戶作出的{{PLURAL:$1|一個中途修訂版本|$1個中途修訂版本}} 未被顯示)",
+       "diff-multi-sameuser": "(未顯示相同使用者於中間所作的 $1 次修訂)",
+       "diff-multi-otherusers": "(未顯示由 $2 位使用者於中間所作的 $1 次修訂)",
+       "diff-multi-manyusers": "(未顯示由超過 $2 位使用者於中間所作的 $1 次修訂)",
        "difference-missing-revision": "{{PLURAL:$2|1次修訂|$2 次修訂}}差異($1)不存在。\n\n這通常是因為過時的頁面修訂差異鏈接被刪除。\n詳情請閱[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 刪除日誌]。",
        "searchresults": "搜尋結果",
        "searchresults-title": "對「$1」的搜尋結果",
        "searchmenu-exists": "'''在這個 wiki 上已有一頁面叫做「[[:$1]]」。'''",
        "searchmenu-new": "<strong>於此wiki建立這個頁面「[[:$1]]」!</strong>請參見已發現之$2條搜尋結果。",
        "searchprofile-articles": "內容頁面",
-       "searchprofile-project": "幫助和計劃頁面",
+       "searchprofile-project": "說明與專案頁面",
        "searchprofile-images": "多媒體",
        "searchprofile-everything": "全部",
        "searchprofile-advanced": "進階",
-       "searchprofile-articles-tooltip": "在$1中搜尋",
-       "searchprofile-project-tooltip": "在$1中搜尋",
+       "searchprofile-articles-tooltip": "在 $1 中搜尋",
+       "searchprofile-project-tooltip": "在 $1 中搜尋",
        "searchprofile-images-tooltip": "搜尋檔案",
-       "searchprofile-everything-tooltip": "搜尋全部(包括討論頁面)",
-       "searchprofile-advanced-tooltip": "在自訂名字空間中搜尋",
+       "searchprofile-everything-tooltip": "搜尋所有內容 (包含對話頁面)",
+       "searchprofile-advanced-tooltip": "搜尋自訂命名空間",
        "search-result-size": "$1 ($2個字)",
        "search-result-category-size": "$1個成員($2個子分類,$3個檔案)",
        "search-result-score": "相關度: $1%",
-       "search-redirect": "(重向 $1)",
+       "search-redirect": "(重新導向 $1)",
        "search-section": "(段落 $1)",
        "search-file-match": "(匹配檔案內容)",
        "search-suggest": "{{GENDER:|你|妳|你}}是不是要找:$1",
-       "search-interwiki-caption": "姊妹計劃",
+       "search-interwiki-caption": "姊妹專案",
        "search-interwiki-default": "來自$1之結果:",
        "search-interwiki-more": "(更多)",
        "search-relatedarticle": "相關",
-       "searcheverything-enable": "在所有名字空間中搜尋",
+       "searcheverything-enable": "搜尋所有命名空間",
        "searchrelated": "相關",
        "searchall": "所有",
        "showingresults": "下面顯示從第 <b>$2</b> 條開始的 <b>$1</b> 條結果:",
        "showingresultsheader": "對'''$4'''的{{PLURAL:$5|第 '''$1''' 至第 '''$3''' 項結果|第 '''$1 - $2''' 項,共 '''$3''' 項結果}}",
        "search-nonefound": "在查詢中無結果相符。",
        "powersearch-legend": "進階搜尋",
-       "powersearch-ns": "在以下的名字空間中搜尋:",
+       "powersearch-ns": "搜尋以下命名空間:",
        "powersearch-togglelabel": "核取:",
        "powersearch-toggleall": "所有",
        "powersearch-togglenone": "無",
        "preferences": "偏好設定",
        "mypreferences": "偏好設定",
        "prefs-edits": "編輯次數:",
-       "prefsnologintext2": "請$1以進入用戶設定。",
+       "prefsnologintext2": "請 $1 以更改您的偏好設定。",
        "prefs-skin": "外觀",
        "skin-preview": "預覽",
        "datedefault": "預設值",
        "prefs-labs": "實驗中的功能",
        "prefs-user-pages": "使用者頁面",
-       "prefs-personal": "使用者概況表",
-       "prefs-rc": "近期變更",
+       "prefs-personal": "使用者基本資料",
+       "prefs-rc": "最近變更",
        "prefs-watchlist": "監視列表",
        "prefs-watchlist-days": "監視列表中顯示的天數:",
        "prefs-watchlist-days-max": "最多$1{{PLURAL:$1|天}}",
        "prefs-email": "電子郵件選項",
        "prefs-rendering": "外觀",
        "saveprefs": "儲存",
-       "restoreprefs": "還原所有預設設定(所有部分)",
+       "restoreprefs": "還原所有預設設定 (所有部分)",
        "prefs-editing": "編輯",
        "rows": "行數:",
        "columns": "列數:",
        "searchresultshead": "搜尋",
        "stub-threshold": "<a href=\"#\" class=\"stub\">短頁面連結</a>格式門檻值 (位元組):",
        "stub-threshold-disabled": "已停用",
-       "recentchangesdays": "近期變更的顯示日數:",
+       "recentchangesdays": "最近變更的顯示日數:",
        "recentchangesdays-max": "最多$1{{PLURAL:$1|天}}",
        "recentchangescount": "預設顯示的編輯數:",
-       "prefs-help-recentchangescount": "é\80\99å\80\8bå\8c\85æ\8b¬æ\9c\80è¿\91æ\9b´æ\94¹、頁面歷史以及日誌。",
+       "prefs-help-recentchangescount": "é\80\99å\8c\85å\90«æ\9c\80è¿\91è®\8aæ\9b´、頁面歷史以及日誌。",
        "prefs-help-watchlist-token2": "這是一個秘密的密鑰,用於訂源您的監視列表。\n知道它的人將能夠讀取您的監視列表,所以您不應該分享它。[[Special:ResetTokens|如有需要重設此密鑰,請點擊這裡]]。",
        "savedprefs": "您的偏好設定已儲存。",
        "timezonelegend": "時區:",
        "localtime": "當地時間:",
        "timezoneuseserverdefault": "使用預設($1)",
-       "timezoneuseoffset": "其他 (指定偏移)",
+       "timezoneuseoffset": "其他 (指定時差)",
        "servertime": "伺服器時間:",
-       "guesstimezone": "從瀏覽器填寫",
+       "guesstimezone": "使用瀏覽器設定值",
        "timezoneregion-africa": "非洲",
        "timezoneregion-america": "美洲",
        "timezoneregion-antarctica": "南極洲",
        "timezoneregion-europe": "歐洲",
        "timezoneregion-indian": "印度洋",
        "timezoneregion-pacific": "太平洋",
-       "allowemail": "接受來自其他使用者的信件",
+       "allowemail": "啟用來自其他使用者的郵件通知功能",
        "prefs-searchoptions": "搜尋",
-       "prefs-namespaces": "頁面名稱空間",
-       "defaultns": "否則在這些名字空間搜尋:",
+       "prefs-namespaces": "命名空間",
+       "defaultns": "或搜尋命名空間:",
        "default": "預設",
        "prefs-files": "檔案",
-       "prefs-custom-css": "自CSS",
-       "prefs-custom-js": "自JavaScript",
-       "prefs-common-css-js": "共用 CSS/JavaScript 於所有的外觀中:",
-       "prefs-reset-intro": "您可以利用這個頁面去重設您的參數設置到網站預設值。這個動作無法復原。",
+       "prefs-custom-css": "自訂 CSS",
+       "prefs-custom-js": "自訂 JavaScript",
+       "prefs-common-css-js": "所有外觀共用的 CSS/JavaScript:",
+       "prefs-reset-intro": "您可以使用此頁面重設您的偏好設定為網站預設值。\n這個動作將無法復原。",
        "prefs-emailconfirm-label": "電子郵件確認:",
        "youremail": "電子郵件:",
        "username": "{{GENDER:$1|使用者名稱}}:",
        "uid": "{{GENDER:$1|使用者 ID}}:",
-       "prefs-memberingroups": "{{PLURAL:$1|群組}}{{GENDER:$2|成員}}:",
+       "prefs-memberingroups": "{{GENDER:$2|所屬}}{{PLURAL:$1|群組}}:",
        "prefs-registration": "註冊時間:",
        "yourrealname": "真實姓名:",
        "yourlanguage": "語言:",
        "yourvariant": "內容語言變體:",
        "prefs-help-variant": "您希望用於顯示本站內容的語種或拼寫語系。",
-       "yournick": "新簽名:",
-       "prefs-help-signature": "在討論頁面上的評論應該要用「<nowiki>~~~~</nowiki>」簽名,這樣便會轉換成{{GENDER:|你|妳|你}}的簽名以及一個時間截記。",
+       "yournick": "æ\96°ç\9a\84ç°½å\90\8dï¼\9a",
+       "prefs-help-signature": "在對話頁面上評論時應使用 \"<nowiki>~~~~</nowiki>\" 簽名,\n該符號會轉換成您的簽名與時間。",
        "badsig": "錯誤的原始簽名。請檢查HTML標籤。",
        "badsiglength": "您的簽名過長。\n它的長度不可超過$1個字元。",
-       "yourgender": "您希望如何顯示性别?",
-       "gender-unknown": "我不想指定",
-       "gender-male": "",
-       "gender-female": "女",
-       "prefs-help-gender": "此設定為可選。\n軟件將使用此設定顯示正確的稱呼。\n此項資料將會被公開。",
+       "yourgender": "您希望如何被描述?",
+       "gender-unknown": "我不想說明",
+       "gender-male": "他編輯了 Wiki 頁面",
+       "gender-female": "她編輯äº\86 Wiki é \81é\9d¢",
+       "prefs-help-gender": "此偏好設定為選填欄位。\n系統會使用您選擇的方式稱呼您,對他人提及您時也會使用適當語法稱呼。\n此項資訊會被公開。",
        "email": "電子郵件",
-       "prefs-help-realname": "真實姓名是可選的。\n如果您選擇提供它,它會用於貢獻署名。",
-       "prefs-help-email": "电子邮件是可选项,但是在您忘记密码时很有用。",
-       "prefs-help-email-others": "您亦可以在您沒有公開自己的用戶身分時透過您的用戶頁或用戶討論頁與您聯繫。",
+       "prefs-help-realname": "真實姓名為選填欄位。\n若您提供真實姓名,它會用於使用者貢獻署名。",
+       "prefs-help-email": "電子郵件地址為選填欄位。\n但在重設密碼時會使用,而您很有可能會忘記密。",
+       "prefs-help-email-others": "您亦可以選擇讓其他使用者用電子郵件與您聯繫,透過您的使用者或對話頁面上方的連結。\n您的電子郵件位址不會實際告知給其他要聯絡您的使用者。",
        "prefs-help-email-required": "電子郵件地址是必填項目。",
-       "prefs-info": "基本資",
+       "prefs-info": "基本資",
        "prefs-i18n": "國際化",
        "prefs-signature": "簽名",
        "prefs-dateformat": "日期格式",
-       "prefs-timeoffset": "時間偏移",
+       "prefs-timeoffset": "時",
        "prefs-advancedediting": "一般選項",
        "prefs-editor": "編輯器",
        "prefs-preview": "預覽",
        "prefs-displaywatchlist": "顯示選項",
        "prefs-tokenwatchlist": "密鑰",
        "prefs-diffs": "差異",
-       "prefs-help-prefershttps": "此選項將於您下次登入時生效。",
+       "prefs-help-prefershttps": "此偏好設定將於您下次登入時生效。",
        "prefs-tabs-navigation-hint": "提示:您可通過左、右鍵於選項卡之間切換。",
        "email-address-validity-valid": "電子郵件位址有效",
        "email-address-validity-invalid": "請提供一個有效的電子郵件位址",
        "userrights": "使用者權限管理",
        "userrights-lookup-user": "管理使用者群組",
        "userrights-user-editname": "輸入使用者名稱:",
-       "editusergroup": "編輯用戶群組",
+       "editusergroup": "編輯使用者群組",
        "editinguser": "變更使用者 '''[[User:$1|$1]]''' 的使用者權限 $2",
        "userrights-editusergroup": "編輯使用者群組",
        "saveusergroups": "儲存使用者群組",
        "userrights-groupsmember": "屬於:",
        "userrights-groupsmember-auto": "固有屬於:",
-       "userrights-groups-help": "æ\82¨å\8f¯ä»¥æ\94¹å\8b\95é\80\99ä½\8dç\94¨æ\88¶æ\89\80屬ç\9a\84群çµ\84ï¼\9a\n* å·²å\89\94é\81¸ç\9a\84æ ¸å\8f\96æ\96¹å¡\8a代表該ç\94¨æ\88¶å±¬æ\96¼è©²ç¾¤çµ\84ã\80\82\n* æ\9cªå\89\94é\81¸ç\9a\84æ ¸å\8f\96æ\96¹å¡\8a代表該ç\94¨æ\88¶ä¸\8dæ\98¯å±¬æ\96¼è©²ç¾¤çµ\84ã\80\82\n* æ\9c\89 * é \85ç\9b®è¡¨ç¤ºä¸\80æ\97¦æ\82¨å\8a å\85¥è©²ç¾¤çµ\84ä¹\8bå¾\8c便ä¸\8dè\83½ç§»é\99¤å®\83,反之亦然。",
+       "userrights-groups-help": "æ\82¨å\8f¯ä»¥æ\9b´æ\94¹æ­¤ä½¿ç\94¨è\80\85æ\89\80屬ç\9a\84群çµ\84ï¼\9a\n* å·²å\8b¾é\81¸ç\9a\84æ ¸é\81¸æ\96¹å¡\8a代表該使ç\94¨è\80\85屬æ\96¼è©²ç¾¤çµ\84ã\80\82\n* å·²å\8b¾é\81¸ç\9a\84æ ¸é\81¸æ\96¹å¡\8a代表該使ç\94¨è\80\85ä¸\8d屬æ\96¼è©²ç¾¤çµ\84ã\80\82\n* æ\9c\89 * è\99\9fæ¨\99示代表ä¸\80æ\97¦å\8a å\85¥è©²ç¾¤çµ\84å¾\8c便ä¸\8dè\83½ç§»é\99¤,反之亦然。",
        "userrights-reason": "原因:",
-       "userrights-no-interwiki": "您並沒有權限去編輯在其它wiki上的用戶權限。",
+       "userrights-no-interwiki": "您沒有權限去編輯其它使用者在 Wiki 上的權限。",
        "userrights-nodatabase": "資料庫$1不存在或並非為本地的。",
-       "userrights-nologin": "您必須要以操作員賬戶[[Special:UserLogin|登入]]之後才可以指定用戶權限。",
+       "userrights-nologin": "您必須 [[Special:UserLogin|登入]] 管理員帳號以指定使用者權限。",
        "userrights-notallowed": "你無權加入或刪除使用者權限。",
        "userrights-changeable-col": "您可以更改的群組",
        "userrights-unchangeable-col": "您不可以更改的群組",
-       "userrights-conflict": "使用者權限更改發生衝突!請檢視並確認你的更改。",
+       "userrights-conflict": "使用者權限更改發生衝突!請重新檢視並確認你的更改。",
        "userrights-removed-self": "您已成功移除自己的權限,故此您沒法再次訪問此頁。",
        "group": "群組:",
        "group-user": "使用者",
        "right-createpage": "建立頁面(不含討論頁面)",
        "right-createtalk": "建立討論頁面",
        "right-createaccount": "建立新的使用者帳號",
-       "right-minoredit": "æ¨\99示æ\88\90å°\8f編輯",
+       "right-minoredit": "æ¨\99示此編輯ç\82ºå°\8fä¿®è¨\82",
        "right-move": "移動頁面",
        "right-move-subpages": "移動頁面與其子頁面",
        "right-move-rootuserpages": "移動根使用者頁面",
        "right-movefile": "移動檔案",
-       "right-suppressredirect": "ç\95¶ç§»å\8b\95é \81é\9d¢æ\99\82ä¸\8d建ç«\8bä¾\86æº\90é \81é\9d¢ä¹\8bé\87\8då®\9aå\90\91",
+       "right-suppressredirect": "移å\8b\95é \81é\9d¢æ\99\82ä¸\8d建ç«\8bä¾\86æº\90ç\9a\84é\87\8dæ\96°å°\8eå\90\91é \81é\9d¢",
        "right-upload": "上傳檔案",
        "right-reupload": "覆蓋現有的檔案",
        "right-reupload-own": "覆蓋由同一位上載的檔案",
        "right-purge": "不需要確認之下清除網站快取",
        "right-autoconfirmed": "不受基於IP的頻率限制",
        "right-bot": "視為一個自動程序",
-       "right-nominornewtalk": "小編輯不引發新訊息提示",
+       "right-nominornewtalk": "若討論頁面為小修訂,則不顯示新訊息提示",
        "right-apihighlimits": "在API查詢中使用更高的上限",
        "right-writeapi": "使用API編寫",
        "right-delete": "刪除頁面",
        "right-undelete": "反刪除頁面",
        "right-suppressrevision": "檢視及恢復由操作員隱藏之修訂",
        "right-suppressionlog": "檢視非公開的日誌",
-       "right-block": "封鎖其他用戶防止編輯",
-       "right-blockemail": "封鎖用戶不可發電郵",
-       "right-hideuser": "封鎖用戶名,對公眾隱藏",
-       "right-ipblock-exempt": "ç¹\9eé\81\8eIP封鎖、自動封鎖以及範圍封鎖",
-       "right-proxyunbannable": "ç¹\9eé\81\8eProxyç\9a\84自動封鎖",
+       "right-block": "封鎖其他使用者的編輯權限",
+       "right-blockemail": "封鎖使用者發送電子郵件的權限",
+       "right-hideuser": "封鎖使用者名稱,避免公開顯示",
+       "right-ipblock-exempt": "ç\95¥é\81\8e IP 封鎖、自動封鎖以及範圍封鎖",
+       "right-proxyunbannable": "ç\95¥é\81\8e Proxy 自動封鎖",
        "right-unblockself": "解除封鎖自己",
        "right-protect": "更改保護等級以及編輯被連鎖保護的頁面",
        "right-editprotected": "編輯保護層級為「{{int:protect-level-sysop}}」的頁面",
        "right-editsemiprotected": "編輯保護層級為「{{int:protect-level-autoconfirmed}}」的頁面",
-       "right-editinterface": "編輯用戶界面",
-       "right-editusercssjs": "編輯其他用戶的CSS和JavaScript檔案",
-       "right-editusercss": "編輯其他用戶的CSS檔案",
-       "right-edituserjs": "編輯其他用戶的JavaScript檔案",
-       "right-editmyusercss": "編輯你自己的用戶CSS檔",
-       "right-editmyuserjs": "編輯你自己的用戶JavaScript檔",
+       "right-editinterface": "編輯使用者界面",
+       "right-editusercssjs": "編輯其他使用者的 CSS 和 JavaScript 檔案",
+       "right-editusercss": "編輯其他使用者的 CSS 檔案",
+       "right-edituserjs": "編輯其他使用者的 JavaScript 檔案",
+       "right-editmyusercss": "編輯您自己的使用者 CSS 檔",
+       "right-editmyuserjs": "編輯您自己的使用者 JavaScript 檔",
        "right-viewmywatchlist": "檢視您的監視列表",
        "right-editmywatchlist": "編輯您的監視列表。請注意即使沒有這種權利,某些操作仍將添加頁面。",
        "right-viewmyprivateinfo": "檢視自己的私隱資料(如電郵地址及真實姓名)",
        "right-editmyprivateinfo": "編輯自己的私隱資料(如電郵地址及真實姓名)",
-       "right-editmyoptions": "編輯您的設定",
-       "right-rollback": "快速復原上位用戶對某一頁面之編輯",
+       "right-editmyoptions": "編輯您的偏好設定",
+       "right-rollback": "快速還原最後一位使用者對某一頁面的編輯",
        "right-markbotedits": "標示復原編輯作機械人編輯",
        "right-noratelimit": "沒有使用頻率限制",
        "right-import": "由其它wiki中匯入頁面",
        "right-importupload": "由檔案上載中匯入頁面",
        "right-patrol": "標示他人的編輯爲已巡查",
        "right-autopatrol": "將自己的編輯自動標示為已巡查的",
-       "right-patrolmarks": "檢視最近巡查標記更改",
+       "right-patrolmarks": "檢視最近變更的巡查標記",
        "right-unwatchedpages": "檢視未監視之頁面",
        "right-mergehistory": "合併頁面歷史",
-       "right-userrights": "編輯所有用戶的權限",
-       "right-userrights-interwiki": "編輯在其它wiki上的用戶權限",
+       "right-userrights": "編輯所有使用者的權限",
+       "right-userrights-interwiki": "編輯在其它 Wiki 上的使用者權限",
        "right-siteadmin": "鎖定和解除鎖定資料庫",
        "right-override-export-depth": "匯出含有五層深度連結頁面之頁面",
-       "right-sendemail": "ç\99¼é\9b»å­\90é\83µä»¶çµ¦å\85¶ä»\96ç\94¨æ\88",
+       "right-sendemail": "ç\99¼é\80\81é\9b»å­\90é\83µä»¶çµ¦å\85¶ä»\96使ç\94¨è\80\85",
        "right-passwordreset": "查看重置密碼郵件",
-       "newuserlogpage": "使用者建立日誌",
-       "newuserlogpagetext": "這是一個最近被創建用戶的新日誌",
+       "newuserlogpage": "建立使用者日誌",
+       "newuserlogpagetext": "此為建立使用者的日誌。",
        "rightslog": "使用者權限日誌",
-       "rightslogtext": "以下記錄了用戶權限的更改記錄。",
+       "rightslogtext": "此為更改使用者權限的日誌。",
        "action-read": "閱讀這個頁面",
        "action-edit": "編輯這個頁面",
        "action-createpage": "建立這個頁面",
        "action-createtalk": "建立討論頁面",
-       "action-createaccount": "建立這個用戶賬戶",
-       "action-minoredit": "標示這個編輯為小的",
+       "action-createaccount": "建立這個使用者帳號",
+       "action-minoredit": "標示此編輯為小修訂",
        "action-move": "移動這個頁面",
        "action-move-subpages": "移動這個頁面跟它的子頁面",
-       "action-move-rootuserpages": "移動根用戶頁面",
+       "action-move-rootuserpages": "移動使用者根頁面",
        "action-movefile": "移動這個檔案",
        "action-upload": "上載這個檔案",
        "action-reupload": "覆蓋這個現有的檔案",
        "action-undelete": "反刪除這個頁面",
        "action-suppressrevision": "翻查和恢復這次隱藏修訂",
        "action-suppressionlog": "檢視這個私有日誌",
-       "action-block": "封鎖這位用戶的編輯",
+       "action-block": "封鎖此使用者的編輯權限",
        "action-protect": "更改這個頁面的保護等級",
-       "action-rollback": "快速回退最後對特定頁面作出的編輯的用戶的所有編輯",
+       "action-rollback": "快速還原最後一位使用者對某一頁面的編輯",
        "action-import": "由其他 Wiki 匯入頁面",
        "action-importupload": "由檔案上傳匯入頁面",
        "action-patrol": "標示其它的編輯為已巡查的",
        "action-autopatrol": "將您的編輯標示為已巡查的",
        "action-unwatchedpages": "檢視未被監視的頁面",
        "action-mergehistory": "合併這個頁面的歷史",
-       "action-userrights": "編輯所有的權限",
-       "action-userrights-interwiki": "編輯在其它wiki上用戶的權限",
+       "action-userrights": "編輯所有使用者的權限",
+       "action-userrights-interwiki": "編輯在其它 Wiki 上的使用者權限",
        "action-siteadmin": "鎖定和解除鎖定資料庫",
-       "action-sendemail": "發送電",
+       "action-sendemail": "發送電子郵件",
        "action-editmywatchlist": "編輯您的監視列表�",
        "action-viewmywatchlist": "查看您的監視列表",
        "action-viewmyprivateinfo": "查看您的個人資料",
        "enhancedrc-since-last-visit": "自上次訪問已有$1",
        "enhancedrc-history": "歷史",
        "recentchanges": "最近變更",
-       "recentchanges-legend": "近期變更選項",
-       "recentchanges-summary": "追蹤該圍記(Wiki)的近期變更。",
+       "recentchanges-legend": "最近變更選項",
+       "recentchanges-summary": "追蹤該 Wiki 在此頁面的最近變更。",
        "recentchanges-noresult": "在所選擇的時間裡沒有任何更改與所給條件吻合。",
-       "recentchanges-feed-description": "è¨\82é\96±è©²å\9c\8dè¨\98ï¼\88Wikiï¼\89ç\9a\84è¿\91æ\9c\9f變更。",
+       "recentchanges-feed-description": "追蹤該 Wiki å\9c¨æ­¤é \81é\9d¢ç\9a\84æ\9c\80è¿\91變更。",
        "recentchanges-label-newpage": "這次編輯建立了一個新頁面",
-       "recentchanges-label-minor": "這是一個小編輯",
+       "recentchanges-label-minor": "這是一個小修訂",
        "recentchanges-label-bot": "這次編輯是由機器人進行",
        "recentchanges-label-unpatrolled": "這次編輯尚未巡查過",
        "recentchanges-label-plusminus": "更改前後頁面位元組大小的變化",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcnotefrom": "下面是自<strong>$2</strong>起之更改(至多顯示<strong>$1</strong>個)。",
        "rclistfrom": "顯示自 $3 $2 以來的新變更",
-       "rcshowhideminor": "$1小編輯",
+       "rcshowhideminor": "$1 次小修訂",
        "rcshowhideminor-show": "顯示",
        "rcshowhideminor-hide": "隱藏",
        "rcshowhidebots": "$1機器人的編輯",
        "rcshowhidebots-show": "顯示",
        "rcshowhidebots-hide": "隱藏",
-       "rcshowhideliu": "$1已註冊用戶",
+       "rcshowhideliu": "$1 位已註冊的使用者",
        "rcshowhideliu-show": "顯示",
        "rcshowhideliu-hide": "隱藏",
-       "rcshowhideanons": "$1匿名用戶的編輯",
+       "rcshowhideanons": "$1 位匿名的使用者",
        "rcshowhideanons-show": "顯示",
        "rcshowhideanons-hide": "隱藏",
        "rcshowhidepatr": "$1巡查過的編輯",
        "minoreditletter": "小",
        "newpageletter": "新",
        "boteditletter": "機",
-       "number_of_watching_users_pageview": "[$1 位使用者在監視]",
+       "number_of_watching_users_pageview": "[$1 位在監視的使用者]",
        "rc_categories": "分類界限(以\"|\"分割)",
        "rc_categories_any": "任意",
        "rc-change-size-new": "更改後$1字節",
        "fileexists-shared-forbidden": "在共享檔案庫中已存在此名稱的檔案。\n如果{{GENDER:|你|妳|你}}仍然想去上載它的話,請返回並用一個新的名稱來上傳此檔案。[[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "這個檔案是跟以下的{{PLURAL:$1|一|多}}個檔案重覆:",
        "file-deleted-duplicate": "一個相同名稱的檔案 ([[:$1]]) 在先前刪除過。您應該在重新上傳之前檢查一下該檔案之刪除紀錄。",
-       "file-deleted-duplicate-notitle": "此前同內容檔案已刪除並將之取消標題。您應詢問與既有檔案之相關用戶以複查再度上載之相關問題。",
+       "file-deleted-duplicate-notitle": "在此之前已有與此相同的檔案已被刪除,並且隱藏標題。\n您在重新上傳前,應請求有權力檢視隱藏檔案的使用者重新審查。",
        "uploadwarning": "上載警告",
        "uploadwarning-text": "請修改以下的檔案描述並重試。",
        "savefile": "儲存檔案",
        "uploaddisabledtext": "檔案上傳不可用。",
        "php-uploaddisabledtext": "PHP 檔案上載已經停用。請檢查 file_uploads 設定。",
        "uploadscripted": "該檔案包含可能被網路瀏覽器錯誤解釋的 HTML 或腳本代碼。",
-       "uploadscriptednamespace": "此SVG檔案中包含非法命名空間「$1」",
+       "uploadscriptednamespace": "此 SVG 檔案使用了非法的命名空間 \"$1\"",
        "uploadinvalidxml": "上載檔案中的XML無法解析。",
        "uploadvirus": "該檔案包含有病毒!\n詳情:$1",
        "uploadjava": "該檔案是 ZIP 檔案,其中包含 Java 的.class 檔案。\n不允許上傳 Java 檔案,是因為他們可能會跳過安全限制。",
        "upload-file-error-text": "當試圖在伺服器上創建臨時檔案時發生內部錯誤。請與[[Special:ListUsers/sysop|管理員]]聯繫。",
        "upload-misc-error": "未知的上傳錯誤",
        "upload-misc-error-text": "在上傳時發生未知的錯誤。請驗証使用了正確並可訪問的 URL,然後進行重試。如果問題仍然存在,請與[[Special:ListUsers/sysop|管理員]]聯繫。",
-       "upload-too-many-redirects": "在網址中有太多重新定向",
+       "upload-too-many-redirects": "URL 中包含太多重新導向資訊",
        "upload-http-error": "已發生一個HTTP錯誤:$1",
        "upload-copy-upload-invalid-domain": "不能從該域名上載檔案副本。",
        "backend-fail-stream": "無法流傳送文件「$1」。",
        "backend-fail-notsame": "「$1」已存在不同的檔案。",
        "backend-fail-invalidpath": "「$1」不是有效的存儲路徑。",
        "backend-fail-delete": "無法刪除「$1」檔案。",
-       "backend-fail-describe": "無法修改檔案「$1」的元數據。",
+       "backend-fail-describe": "無法修改檔案 \"$1\" 的 metadata。",
        "backend-fail-alreadyexists": "檔案「$1」已存在。",
        "backend-fail-store": "無法在$2存儲文件$1。",
        "backend-fail-copy": "無法複製文件$1到$2。",
        "zip-bad": "該檔案是已損壞或以其它方式無法讀取的 ZIP 檔案。\n不能正確檢查安全。",
        "zip-unsupported": "該檔案是 ZIP 檔案,其中使用 MediaWiki 不支持的ZIP功能。\n不能正確檢查安全。",
        "uploadstash": "上傳貯藏",
-       "uploadstash-summary": "é\80\99å\80\8bé \81é\9d¢æ\8f\90ä¾\9bå·²ç¶\93ä¸\8aå\82³ï¼\88æ\88\96è\80\85ä¸\8aå\82³ä¸­ï¼\89ä½\86æ\9cªç\99¼ä½\88å\88°wikiä¹\8bæª\94æ¡\88å­\98å\8f\96ã\80\82é\80\99äº\9bæª\94æ¡\88é\99¤äº\86ä¸\8aå\82³ç\9a\84ç\94¨æ\88¶ä¹\8bå¤\96ä¸\8dæ\9c\83被å\85¶ä»\96人å\8f¯è¦\8bã\80\82",
+       "uploadstash-summary": "æ­¤é \81é\9d¢å\8f¯å­\98å\8f\96å·²ä¸\8aå\82³æ\88\96é\82\84å\9c¨ä¸\8aå\82³ç¨\8båº\8fä½\86å°\9aæ\9cªå\9c¨ Wiki å\85¬é\96\8bç\9a\84æª\94æ¡\88ï¼\8cé\80\99äº\9bæª\94æ¡\88é\99¤äº\86ä¸\8aå\82³ç\9a\84使ç\94¨è\80\85æ\9c¬èº«å¤\96ï¼\8cå\85¶ä»\96人ç\84¡æ³\95æ\9f¥ç\9c\8bã\80\82",
        "uploadstash-clear": "清除貯藏檔案",
        "uploadstash-nofiles": "{{GENDER:|你|妳|你}}沒有已貯藏的檔案。",
        "uploadstash-badtoken": "進行這個動作不成功,或者{{GENDER:|你|妳|你}}的編輯資訊已經過期。請再試。",
        "img-auth-isdir": "您嘗試過存取一個目錄「$1」。\n只是可以存取檔案。",
        "img-auth-streaming": "串流「$1」中。",
        "img-auth-public": "img_auth.php的功能是由一個公共wiki中輸出檔案。\n這個wiki是已經設定做一個公共wiki。\n基於保安最佳化,img_auth.php已經停用。",
-       "img-auth-noread": "用戶無權讀取「$1」。",
+       "img-auth-noread": "使用者沒有權限讀取 \"$1\"。",
        "http-invalid-url": "無效的URL:$1",
        "http-invalid-scheme": "不支援含有「$1」的URL。",
        "http-request-error": "未知的錯誤令到HTTP請求失敗。",
        "linkstoimage-more": "超過$1個頁面連接到這個檔案。\n此處只列出首$1個連接到此檔案的頁面。\n您也可以查看[[Special:WhatLinksHere/$2|完整的清單]]。",
        "nolinkstoimage": "沒有頁面連接到本檔案。",
        "morelinkstoimage": "檢視連接到這個檔案的[[Special:WhatLinksHere/$1|更多連結]]。",
-       "linkstoimage-redirect": "$1 (檔案重向) $2",
+       "linkstoimage-redirect": "$1 (檔案重新導向) $2",
        "duplicatesoffile": "以下的$1個檔案跟這個檔案重覆([[Special:FileDuplicateSearch/$2|更多細節]]):",
-       "sharedupload": "該檔案來自於$1,它可能在其它計劃項目中被應用。",
+       "sharedupload": "此檔案來自 $1 且可能被其他專案所使用。",
        "sharedupload-desc-there": "該檔案來自於$1,它可能在其它計劃項目中被應用。\n請參閱在[$2 檔案描述頁面]以了解其相關資訊。",
-       "sharedupload-desc-here": "該檔案來自於$1,它可能在其它計劃項目中被應用。\n它在[$2 檔案描述頁面]那邊上的描述於下面顯示。",
+       "sharedupload-desc-here": "此檔案來自 $1 且可能被其他專案所使用。\n以下為該檔案於 [$2 檔案描述頁面] 的內容描述。",
        "sharedupload-desc-edit": "該檔案來自$1,它可能在其它計劃項目中被使用。\n或許您可以在其[$2 檔案描述頁面]上編輯說明。",
-       "sharedupload-desc-create": "該檔案來自$1,它可能在其它計劃項目中被使用。\n或許您可以在那邊的[$2 檔案描述頁面]上編輯其說明。",
+       "sharedupload-desc-create": "此檔案來自 $1 且可能被其他專案所使用。\n若您想要編輯內容描述可至 [$2 檔案描述頁面]。",
        "filepage-nofile": "不存在此名稱的檔案。",
        "filepage-nofile-link": "不存在此名稱的檔案,但您可以[$1 上傳它]。",
        "uploadnewversion-linktext": "上傳該檔案的新版本",
        "filedelete-nofile-old": "在已指定屬性的情況下,這裡沒有'''$1'''的保存版本。",
        "filedelete-otherreason": "其它/附加的理由:",
        "filedelete-reason-otherlist": "其它理由",
-       "filedelete-reason-dropdown": "\n*常用刪除理由\n** 侵犯版權\n** 重覆檔案",
+       "filedelete-reason-dropdown": "*常見的刪除原因\n** 侵犯版權\n** 重覆的檔案",
        "filedelete-edit-reasonlist": "編輯刪除埋由",
        "filedelete-maintenance": "當在維護時已經暫時停用檔案刪除和恢復。",
        "filedelete-maintenance-title": "無法刪除文件",
        "mimetype": "MIME 類型:",
        "download": "下載",
        "unwatchedpages": "未被監視的頁面",
-       "listredirects": "重向清單",
+       "listredirects": "重新導向清單",
        "listduplicatedfiles": "重複檔案列表",
        "listduplicatedfiles-summary": "以下列表中某檔案之最新版本與其他檔案之最新版本重複。進包含本地檔案",
        "listduplicatedfiles-entry": "檔案[[:File:$1|$1]]與[[$3|其他$2個重複]]。",
        "unusedtemplates": "未使用的模板",
-       "unusedtemplatestext": "æ\9c¬é \81é\9d¢å\88\97å\87º{{ns:template}}å\90\8då­\97空é\96\93ä¸\8bæ\89\80æ\9c\89æ\9cªè¢«å\85¶ä»\96é \81é\9d¢ä½¿ç\94¨ç\9a\84é \81é\9d¢ã\80\82è«\8bå\9c¨å\88ªé\99¤é\80\99äº\9b模æ\9d¿å\89\8d檢æ\9f¥å\85¶ä»\96é\80£å\85¥該模板的頁面。",
+       "unusedtemplatestext": "æ­¤é \81å\88\97å\87ºæ\89\80æ\9c\89æ\96¼ {{ns:template}} å\91½å\90\8d空é\96\93ä¸\8bæ\9cªè¢«å\85¶ä»\96é \81é\9d¢å¼\95ç\94¨ç\9a\84é \81é\9d¢ã\80\82\nè«\8bå\9c¨å\88ªé\99¤é\80\99äº\9b模æ\9d¿å\89\8d檢æ\9f¥å\85¶ä»\96使ç\94¨該模板的頁面。",
        "unusedtemplateswlh": "其他連結",
        "randompage": "隨機頁面",
-       "randompage-nopages": "在以下的{{PLURAL:$2|名字空間}}中沒有頁面:$1",
+       "randompage-nopages": "在{{PLURAL:$2|命名空間}}中沒有任何頁面:$1。",
        "randomincategory": "分類中的隨機頁面",
        "randomincategory-invalidcategory": "\"$1\" 不是一個有效的分類名稱。",
        "randomincategory-nopages": "[[:Category:$1]]中沒有頁面。",
        "randomincategory-selectcategory": "從分類中獲取隨機頁面:$1 $2",
        "randomincategory-selectcategory-submit": "顯示",
-       "randomredirect": "隨機重向",
-       "randomredirect-nopages": "在「$1」名字空間中沒有重定向頁面。",
+       "randomredirect": "隨機重新導向",
+       "randomredirect-nopages": "在命名空間 \"$1\" 中沒有重新導向頁面。",
        "statistics": "統計",
        "statistics-header-pages": "頁面統計",
        "statistics-header-edits": "編輯統計",
        "statistics-header-views": "檢視統計",
-       "statistics-header-users": "使用者統計",
+       "statistics-header-users": "使用者統計資訊",
        "statistics-header-hooks": "其它統計",
        "statistics-articles": "內容頁面",
        "statistics-pages": "頁面",
-       "statistics-pages-desc": "在圍記(Wiki)上的所有頁面,包括討論頁、重新導向等。",
+       "statistics-pages-desc": "在 Wiki 上所有的頁面,包含對話頁面、重新導向頁面...等。",
        "statistics-files": "已經上傳的檔案",
        "statistics-edits": "自從{{SITENAME}}設定的頁面編輯數",
        "statistics-edits-average": "每一頁面的平均編輯數",
        "statistics-views-total": "檢視總數",
        "statistics-views-total-desc": "不存在頁面和特殊頁面的查看數未計入",
        "statistics-views-peredit": "每次編輯檢視數",
-       "statistics-users": "已註冊[[Special:ListUsers|使用者]]",
+       "statistics-users": "已註冊的 [[Special:ListUsers|使用者]]",
        "statistics-users-active": "活躍使用者",
-       "statistics-users-active-desc": "在前$1天中操作過的用戶",
+       "statistics-users-active-desc": "在最近 $1 天操作過的使用者",
        "statistics-mostpopular": "被查閱次數最多的頁面",
        "pageswithprop": "有頁面屬性的頁面",
        "pageswithprop-legend": "有頁面屬性的頁面",
        "pageswithprop-submit": "進入",
        "pageswithprop-prophidden-long": "長文本屬性值已被隱藏($1)",
        "pageswithprop-prophidden-binary": "已隱藏二進位屬性值($1)",
-       "doubleredirects": "雙重的重新導向",
+       "doubleredirects": "雙重的重新導向頁面",
        "doubleredirectstext": "這一頁列出所有重定向頁面重定向到另一個重定向頁的頁面。每一行都包含到第一和第二個重定向頁面的連結,以及第二個重定向頁面的目標,通常顯示的都會是\"真正\"的目標頁面,也就是第一個重定向頁面應該指向的頁面。\n<del>已劃去</del>的為已經解決之項目。",
-       "double-redirect-fixed-move": "[[$1]]已經完成移動。它已自動更新,並已重定向至[[$2]]。",
+       "double-redirect-fixed-move": "[[$1]] 已完成移動。\n此頁面已自動更新並重新導向至 [[$2]]。",
        "double-redirect-fixed-maintenance": "作為維護工作自動修復於[[$1]]至[[$2]]之雙重重定向。",
        "double-redirect-fixer": "重新導向修正器",
-       "brokenredirects": "中斷的重新導向",
+       "brokenredirects": "中斷的重新導向頁面",
        "brokenredirectstext": "以下的重新導向頁面連結到不存在的頁面:",
        "brokenredirects-edit": "編輯",
        "brokenredirects-delete": "刪除",
        "mostinterwikis": "最多跨維基頁面",
        "mostrevisions": "最多修訂頁面",
        "prefixindex": "所有有前綴的頁面",
-       "prefixindex-namespace": "帶有前綴的頁面(屬於$1名字空間)",
+       "prefixindex-namespace": "所有含字首的頁面 ($1 命名空間)",
        "prefixindex-strip": "於列表中省略前綴",
        "shortpages": "短頁面",
        "longpages": "長頁面",
        "protectedpages-indef": "只有無期之保護頁面",
        "protectedpages-summary": "此頁面列出當前受保護之頁面。欲訪問受白紙保護之標題列表,請參見[[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]。",
        "protectedpages-cascade": "只有連鎖之保護頁面",
-       "protectedpages-noredirect": "隱藏重定向",
+       "protectedpages-noredirect": "隱藏重新導向頁面",
        "protectedpagesempty": "在這些參數下沒有頁面正在保護。",
        "protectedpages-timestamp": "時間戳",
        "protectedpages-page": "頁面",
-       "protectedpages-expiry": "過期",
-       "protectedpages-performer": "保護用戶",
+       "protectedpages-expiry": "期限",
+       "protectedpages-performer": "保護使用者",
        "protectedpages-params": "保護參數",
        "protectedpages-reason": "原因",
        "protectedpages-unknown-timestamp": "未知",
-       "protectedpages-unknown-performer": "未知用戶",
+       "protectedpages-unknown-performer": "不明的使用者",
        "protectedtitles": "受保護標題",
        "protectedtitles-summary": "此頁面列出當前受白紙保護之標題。欲訪問受保護頁面之列表,請參見[[{{#special:ProtectedPages}}|{{int:protectedpages}}]]。",
        "protectedtitlesempty": "在這些參數之下並無標題正在保護。",
-       "listusers": "用戶列表",
-       "listusers-editsonly": "只顯示有編輯的用戶",
+       "listusers": "使用者清單",
+       "listusers-editsonly": "只顯示有編輯的使用者",
        "listusers-creationsort": "按建立日期排序",
        "listusers-desc": "使用降冪排序",
        "usereditcount": "$1 次{{PLURAL:$1|編輯}}",
        "unusedimagestext": "下列檔案未有嵌入任何頁面但它仍然存在。\n請注意其它網站可能直接透過 URL 連結此檔案,所以這裡列出的圖片有可能依然被使用。",
        "unusedcategoriestext": "雖然沒有被其它頁面或者分類所採用,但列表中的分類頁依然存在。",
        "notargettitle": "無目標",
-       "notargettext": "您還沒有指定一個目標頁面或用戶以進行此項操作。",
+       "notargettext": "您尚未指定目標頁面或使用者以進行此項操作。",
        "nopagetitle": "無目標頁面",
        "nopagetext": "您所指定的目標頁面並不存在。",
        "pager-newer-n": "新$1次",
        "booksources-text": "以下是一份銷售新書或二手書的列表,並可能有{{GENDER:|你|妳|你}}正尋找的書的進一步訊息:",
        "booksources-invalid-isbn": "提供的ISBN號碼並不正確,請檢查原始複製來源號碼是否有誤。",
        "specialloguserlabel": "操作者:",
-       "speciallogtitlelabel": "目標(標題或用戶):",
+       "speciallogtitlelabel": "目標 (標題或使用者):",
        "log": "日誌",
        "all-logs-page": "所有公開日誌",
        "alllogstext": "綜合顯示 {{SITENAME}} 的上傳、刪除、保護、查封以及站務日誌。",
        "allpagesfrom": "顯示從此處開始的頁面:",
        "allpagesto": "顯示從此處結束的頁面:",
        "allarticles": "所有頁面",
-       "allinnamespace": "所有頁面(屬於$1名字空間)",
+       "allinnamespace": "所有頁面 ($1 命名空間)",
        "allpagessubmit": "提交",
        "allpagesprefix": "顯示有此前綴的頁面:",
        "allpagesbadtitle": "給定的頁面標題是非法的,或者具有一個內部語言或內部 wiki 的前綴。它可能包含一個或更多的不能用於標題的字元。",
-       "allpages-bad-ns": "在{{SITENAME}}中沒有一個叫做「$1」的名字空間。",
-       "allpages-hide-redirects": "隱藏重定向頁",
+       "allpages-bad-ns": "{{SITENAME}} 沒有 \"$1\" 命名空間。",
+       "allpages-hide-redirects": "隱藏重新導向頁面",
        "cachedspecial-viewing-cached-ttl": "你正在瀏覽本頁的緩存版本,至多可能存在$1的延遲。",
        "cachedspecial-viewing-cached-ts": "您正在閱讀此頁的緩存版本,這可能不是完整的版本。",
        "cachedspecial-refresh-now": "查看最新。",
        "categoriesfrom": "顯示由此項起之分類:",
        "special-categories-sort-count": "按數量排列",
        "special-categories-sort-abc": "按字母排列",
-       "deletedcontributions": "已刪除的用戶貢獻",
-       "deletedcontributions-title": "已刪除的用戶貢獻",
+       "deletedcontributions": "已刪除的使用者貢獻",
+       "deletedcontributions-title": "已刪除的使用者貢獻",
        "sp-deletedcontributions-contribs": "貢獻",
        "linksearch": "外部鏈接搜索",
        "linksearch-pat": "搜尋網址:",
-       "linksearch-ns": "å\90\8då­\97空間:",
+       "linksearch-ns": "å\91½å\90\8d空間:",
        "linksearch-ok": "搜尋",
        "linksearch-text": "可使用通配符,如“*.wikipedia.org”。至少需要一個頂級域名,例如“*.org”。<br />\n支持的{{PLURAL:$2|協議}}:<code>$1</code>(若沒有指定協議,預設為http://)。",
        "linksearch-line": "$1 連自 $2",
        "linksearch-error": "萬用字元僅可在主機名稱的開頭使用。",
-       "listusersfrom": "給定顯示用戶條件:",
+       "listusersfrom": "顯示使用者開始自:",
        "listusers-submit": "顯示",
-       "listusers-noresult": "æ\89¾ä¸\8då\88°ç\94¨æ\88。",
-       "listusers-blocked": "(已封禁)",
-       "activeusers": "æ´»èº\8dç\94¨æ\88¶å\88\97表",
-       "activeusers-intro": "這個是在最近$1天之內有一些動作的用戶列表。",
+       "listusers-noresult": "æ\9f¥ç\84¡ä½¿ç\94¨è\80\85。",
+       "listusers-blocked": "(已封鎖)",
+       "activeusers": "æ\9c\89æ´»å\8b\95ç\9a\84使ç\94¨è\80\85æ¸\85å\96®",
+       "activeusers-intro": "此清單為最近 $1 天有活動的使用者。",
        "activeusers-count": "最近$3天內有$1次編輯",
-       "activeusers-from": "顯示用戶開始於:",
+       "activeusers-from": "顯示使用者開始自:",
        "activeusers-hidebots": "隱藏機器人",
        "activeusers-hidesysops": "隱藏管理員",
-       "activeusers-noresult": "æ\89¾ä¸\8då\88°ç\94¨æ\88。",
-       "listgrouprights": "用戶群組權限",
-       "listgrouprights-summary": "以下面是一個在這個wiki中定義出來的用戶權限清單,以及它們的存取權。\n更多有關個別權限的細節可以在[[{{MediaWiki:Listgrouprights-helppage}}|這裏]]找到。",
+       "activeusers-noresult": "æ\9f¥ç\84¡ä½¿ç\94¨è\80\85。",
+       "listgrouprights": "使用者群組權限",
+       "listgrouprights-summary": "以下為此 Wiki 的使用者群組清單,以及相關的存取權限。\n您可以在 [[{{MediaWiki:Listgrouprights-helppage}}|詳細資訊]] 找到有關個別權限的資訊。",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">已授予的權限</span>\n* <span class=\"listgrouprights-revoked\">被吊銷的權限</span>",
        "listgrouprights-group": "群組",
        "listgrouprights-rights": "權限",
        "listgrouprights-removegroup-self-all": "在自己的賬戶中移除所有群組",
        "listgrouprights-namespaceprotection-header": "命名空間限制",
        "listgrouprights-namespaceprotection-namespace": "命名空間",
-       "listgrouprights-namespaceprotection-restrictedto": "允許用戶編輯權限",
+       "listgrouprights-namespaceprotection-restrictedto": "允許使用者編輯的權限",
        "trackingcategories": "跟蹤分類",
-       "trackingcategories-summary": "當前頁面收錄由MediaWiki軟體自動加入的跟蹤分類。名稱可經由{{ns:8}}名字空間對於系統資訊修改之。",
+       "trackingcategories-summary": "此頁面列出由 MediaWiki 系統自動產生用來追蹤頁面的分類,這些分類的名稱可由命名空間 {{ns:8}} 中的相關系統訊息中修改。",
        "trackingcategories-msg": "跟蹤分類",
        "trackingcategories-name": "資訊名",
        "trackingcategories-desc": "分類收錄準則",
-       "noindex-category-desc": "頁面中存在<code><nowiki>__NOINDEX__</nowiki></code>魔術字(並且於標記允許名字空間)並藉此未被機械人索引。",
-       "index-category-desc": "頁面中存在<code><nowiki>__INDEX__</nowiki></code>魔術字(並且於標記允許名字空間)並藉此被機械人錯誤索引。",
+       "noindex-category-desc": "命名空間允許,且含有魔術字 <code><nowiki>__NOINDEX__</nowiki></code> 未被機器人列入索引的頁面。",
+       "index-category-desc": "命名空間允許,且含有魔術字 <code><nowiki>__INDEX__</nowiki></code> 被機器人列入索引的頁面。",
        "post-expand-template-inclusion-category-desc": "展開所有模板后,頁面大小大於<code>$wgMaxArticleSize</code>,藉此某些模板未展開。",
        "post-expand-template-argument-category-desc": "展開模板參數(三隊花括弧內,例如<code>{{{Foo}}}</code>)後,頁面大於<code>$wgMaxArticleSize</code>。",
        "expensive-parserfunction-category-desc": "頁面包含太多高開銷函數解析器(例如<code>#ifexist</code>)。參見[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]。",
        "hidden-category-category-desc": "此分類帶有<code><nowiki>__HIDDENCAT__</nowiki></code>,它預設防止於頁面分類連接盒中顯示。",
        "trackingcategories-nodesc": "並無說明。",
        "trackingcategories-disabled": "分類被禁用",
-       "mailnologin": "無電郵地址",
-       "mailnologintext": "您必須先[[Special:UserLogin|登入]]\n並在[[Special:Preferences|偏好設定]]\n中有一個有效的 e-mail 地址才可以電郵其他用戶。",
-       "emailuser": "E-mail該用戶",
-       "emailuser-title-target": "電郵這位{{GENDER:$1|用戶}}",
-       "emailuser-title-notarget": "E-mail用戶",
-       "emailpage": "E-mail用戶",
-       "emailpagetext": "您可以ç\94¨ä¸\8bé\9d¢ç\9a\84表格å\8e»å¯\84ä¸\80å°\81é\9b»é\83µçµ¦é\80\99ä½\8d{{Gender:$1|ç\94¨æ\88¶}}ã\80\82\næ\82¨å\9c¨[[Special:Preferences|æ\82¨ç\9a\84å\8f\83æ\95¸è¨­ç½®]]中æ\89\80輸å\85¥ç\9a\84é\9b»å­\90é\83µä»¶å\9c°å\9d\80å°\87å\87ºç\8f¾å\9c¨é\83µä»¶ã\80\8cç\99¼ä»¶äººã\80\8dä¸\80æ¬\84中ï¼\8cé\80\99樣該ç\94¨æ\88¶å°±å\8f¯ä»¥å\9b\9eè¦\86æ\82¨ã\80\82",
-       "defemailsubject": "{{SITENAME}}來自用戶「$1」的電子郵件",
-       "usermaildisabled": "用戶電郵已停用",
-       "usermaildisabledtext": "您不可以發送電郵到這個wiki上的其他用戶",
-       "noemailtitle": "無e-mail地址",
-       "noemailtext": "該用戶還沒有指定一個有效的e-mail地址。",
-       "nowikiemailtext": "這位用戶選擇不接收其他用戶的電子郵件。",
-       "emailnotarget": "收件人不存在或無效的用戶名。",
-       "emailtarget": "輸入收件人用戶名",
-       "emailusername": "用戶名:",
+       "mailnologin": "沒有發送位址",
+       "mailnologintext": "您必須先 [[Special:UserLogin|登入]]\n並在 [[Special:Preferences|偏好設定]]\n中設定一個有效的電子郵件地址才可以發送信件給其他使用者。",
+       "emailuser": "寄信給此使用者",
+       "emailuser-title-target": "寄信給此{{GENDER:$1|使用者}}",
+       "emailuser-title-notarget": "寄信給使用者",
+       "emailpage": "E-mail 給使用者",
+       "emailpagetext": "您可以使ç\94¨ä»¥ä¸\8b表格ç\99¼é\80\81é\9b»å­\90é\83µä»¶çµ¦é\80\99ä½\8d {{Gender:$1|使ç\94¨è\80\85}}ã\80\82\næ\82¨å\9c¨ [[Special:Preferences|å\81\8f好設å®\9a]] ä¸­æ\89\80輸å\85¥ç\9a\84é\9b»å­\90é\83µä»¶å\9c°å\9d\80å°\87æ\9c\83ä½\9cç\82ºé\83µä»¶ç\9a\84 \"å¯\84件人\"ï¼\8cå\9b æ­¤è©²ä½¿ç\94¨è\80\85å\8f¯ç\9b´æ\8e¥å\9b\9eè¦\86æ\82¨ã\80\82",
+       "defemailsubject": "來自使用者 \"$1\" 於 {{SITENAME}} 發送的電子郵件",
+       "usermaildisabled": "使用者電子郵件已停用",
+       "usermaildisabledtext": "您不可發送信件到這個 Wiki 上的其他使用者",
+       "noemailtitle": "沒有電子郵件地址",
+       "noemailtext": "此使用者尚未指定一個有效的電子郵件地址。",
+       "nowikiemailtext": "此使用者選擇不接收其他使用者的信件。",
+       "emailnotarget": "收件人不存在或無效的使用者名稱。",
+       "emailtarget": "輸入收件人使用者名稱",
+       "emailusername": "使用者名稱:",
        "emailusernamesubmit": "提交",
-       "email-legend": "發一封電子郵件至另一位{{SITENAME}}用戶",
-       "emailfrom": "件人:",
+       "email-legend": "發送電子郵件給另一位 {{SITENAME}} 使用者",
+       "emailfrom": "件人:",
        "emailto": "收件人:",
        "emailsubject": "主題:",
        "emailmessage": "訊息:",
        "emailsend": "發送",
-       "emailccme": "將我的消息的副本發送一份到我的電郵信箱。",
-       "emailccsubject": "您發送給$1的訊息的副本:$2",
+       "emailccme": "發送一份副本到我的電子郵件信箱。",
+       "emailccsubject": "您發送給 $1 的訊息副本:$2",
        "emailsent": "電子郵件已發送",
-       "emailsenttext": "您的電子郵件已經發出。",
-       "emailuserfooter": "這封電郵是由$1寄給$2經{{SITENAME}}的「電郵用戶」功能發出的。",
+       "emailsenttext": "您的電子郵件訊息已經送出。",
+       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"發送信件給使用者\" 功能寄給 $2。",
        "usermessage-summary": "給系統消息。",
        "usermessage-editor": "系統界面",
        "watchlist": "監視列表",
        "watchlistanontext": "請$1以檢視或編輯您的監視列表。",
        "watchnologin": "未登入",
        "addwatch": "加至監視列表",
-       "addedwatchtext": "已將頁面「[[:$1]]」加入您的[[Special:Watchlist|監視列表]]。將來此頁面及其討論頁如有更動都會在那裡列出。",
+       "addedwatchtext": "已將頁面 \"[[:$1]]\" 加入您的 [[Special:Watchlist|監視列表]]。若此頁面及其對話頁面有任何更動都會在監視列表中列出。",
        "removewatch": "停止監視",
        "removedwatchtext": "[[:$1]]已經從[[Special:Watchlist|您的監視頁面]]中移除。",
        "watch": "監視",
        "unwatch": "取消監視",
        "unwatchthispage": "停止監視",
        "notanarticle": "不是頁面",
-       "notvisiblerev": "上次由不同用戶所作的修訂版本已經刪除",
-       "watchlist-details": "不包含討論頁,您的監視列表上有$1個頁面。",
+       "notvisiblerev": "最後一次由其他使用者所作的修訂已經被刪除",
+       "watchlist-details": "您的監視列表上共有 $1 個頁面 (不包含對話頁面)。",
        "wlheader-enotif": "已經啟動電子郵件通知功能。",
        "wlheader-showupdated": "在{{GENDER:|你|妳|你}}上次檢視後有被修改過的頁面會顯示為'''粗體'''。",
        "wlnote2": "以下是新近<strong>$1</strong>小時的更改,截至$2 $3。",
        "unwatching": "正在停止監視...",
        "watcherrortext": "更改「$1」的監視列表設定時發生錯誤。",
        "enotif_reset": "將所有頁面標為已閱讀",
-       "enotif_impersonal_salutation": "{{SITENAME}}用戶",
+       "enotif_impersonal_salutation": "{{SITENAME}} 使用者",
        "enotif_subject_deleted": "{{SITENAME}}的「$1」頁面被$2刪除",
        "enotif_subject_created": "{{SITENAME}}的「$1」頁面被$2建立",
        "enotif_subject_moved": "{{SITENAME}}的「$1」頁面被$2移動",
        "enotif_body_intro_changed": "{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2修改,請見 $3 瀏覽當前版本。",
        "enotif_lastvisited": "請參閱 $1 檢視你上次訪問後的所有更改。",
        "enotif_lastdiff": "請參閱 $1 檢視該更改。",
-       "enotif_anon_editor": "匿名用戶$1",
-       "enotif_body": "$WATCHINGUSERNAME閣下,\n\n$PAGEINTRO $NEWPAGE\n\n編輯摘要:$PAGESUMMARY $PAGEMINOREDIT\n\n聯絡此編輯者:\n\n郵件:$PAGEEDITOR_EMAIL\n本站:$PAGEEDITOR_WIKI\n\n在您訪問此頁之前,將來的更改將不會向您發出通知。您也可以在監視列表中重設您所有監視頁面的通知標記。\n\n{{SITENAME}}通知系統啟\n\n--\n更改電郵通知設定:\n{{canonicalurl:{{#special:Preferences}}}}\n\n更改監視列表設定:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n從監視列表中刪除此頁面:\n$UNWATCHURL\n\n回饋和其他幫助:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
+       "enotif_anon_editor": "匿名使用者 $1",
+       "enotif_body": "$WATCHINGUSERNAME 您好,\n\n$PAGEINTRO $NEWPAGE\n\n編輯摘要:$PAGESUMMARY $PAGEMINOREDIT\n\n聯絡此編輯者:\n\n信箱:$PAGEEDITOR_EMAIL\n本站:$PAGEEDITOR_WIKI\n\n在您檢視該頁面之前,接下來的變更系統不會再向您發出通知。您也可以在監視列表中重設您所有監視頁面的通知狀態。\n\n{{SITENAME}} 通知系統啟\n\n--\n更改您的電子郵件通知設定,請至:\n{{canonicalurl:{{#special:Preferences}}}}\n\n更改您的監視列表設定,請至:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n從監視列表中刪除此頁面,請至:\n$UNWATCHURL\n\n回函並取得更多協助:\n{{canonicalurl:{{MediaWiki:Helppage}}}}",
        "created": "建立了",
        "changed": "更改",
        "deletepage": "刪除頁面",
        "deletecomment": "理由:",
        "deleteotherreason": "其它/附加的理由:",
        "deletereasonotherlist": "其它理由",
-       "deletereason-dropdown": "* 常見刪除理由\n** 濫發電郵\n** 破壞\n** 侵犯版權\n** 作者請求\n** 損壞重定向頁",
+       "deletereason-dropdown": "*常見的刪除原因\n** 濫發廣告訊息\n** 破壞資料\n** 侵犯版權\n** 作者請求\n** 損壞的重新導向頁面",
        "delete-edit-reasonlist": "編輯刪除理由",
        "delete-toobig": "這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除此類頁面的動作已經被限制,以防止在{{SITENAME}}上的意外擾亂。",
        "delete-warning-toobig": "這個頁面有一個十分大量的編輯歷史,超過$1次修訂。刪除它可能會擾亂{{SITENAME}}的資料庫操作;在繼續此動作前請小心。",
        "rollbacklinkcount-morethan": "回退多過 $1 次{{PLURAL:$1|編輯}}",
        "rollbackfailed": "無法回退",
        "cantrollback": "無法恢復編輯;最後的貢獻者是本篇的唯一作者。",
-       "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最後一次編輯該頁面的使用者是 [[User:$3|$3]] ([[User talk:$3|對話]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
        "editcomment": "編輯摘要: \"''$1''\"。",
-       "revertpage": "已恢復由[[Special:Contributions/$2|$2]]([[User talk:$2|對話]])的編輯至[[User:$1|$1]]的最後一個修訂版本",
-       "revertpage-nouser": "已由隱藏的使用者恢復編輯到上個{{GENDER:$1|[[User:$1|$1]]}}的修訂版本",
-       "rollback-success": "已恢復 $1 的編輯;\n更變更回 $2 的最後修訂版本。",
+       "revertpage": "已還原 [[Special:Contributions/$2|$2]] ([[User talk:$2|對話]]) 的編輯為最後由 [[User:$1|$1]] 所修訂的版本",
+       "revertpage-nouser": "已還隱藏使用者的編輯為最後 {{GENDER:$1|[[User:$1|$1]]}} 修訂的版本",
+       "rollback-success": "已還原 $1 做的編輯;\n更變回最後由 $2 修訂的版本。",
        "sessionfailure-title": "登入資訊失敗",
        "sessionfailure": "似乎您的登錄會話有問題;\n為了防止會話劫持,這個操作已經被取消。\n請返回先前的頁面,重新載入該頁面,然後重試。",
        "protectlogpage": "保護日誌",
        "protect-title": "變更「$1」的保護等級",
        "protect-title-notallowed": "檢視「$1」的保護等級",
        "prot_1movedto2": "[[$1]]移動到[[$2]]",
-       "protect-badnamespace-title": "不可被保護的名字空間",
-       "protect-badnamespace-text": "é\80\99å\80\8bå\90\8då­\97空é\96\93å\85§ç\9a\84é \81é\9d¢ç\84¡æ³\95被保護。",
+       "protect-badnamespace-title": "不可保護的命名空間",
+       "protect-badnamespace-text": "é\80\99å\80\8bå\91½å\90\8d空é\96\93å\85§ç\9a\84é \81é\9d¢ç\84¡æ³\95設ç\82º保護。",
        "protect-norestrictiontypes-text": "此頁不可被保護因沒有任何限制可用。",
        "protect-norestrictiontypes-title": "不可保護的頁面",
        "protect-legend": "確認保護",
        "protect_expiry_old": "終止時間已過去。",
        "protect-unchain-permissions": "解除鎖定更多的保護選項",
        "protect-text": "{{GENDER:|你|妳|你}}可以在這裡瀏覽和修改對頁面'''$1'''的保護級別。",
-       "protect-locked-blocked": "您不能在被查封時更改保護級別。\n以下是'''$1'''現時的保護級別:",
+       "protect-locked-blocked": "您不能在被封鎖期間更改保護級別。\n以下為 <strong>$1</strong> 頁面目前的設定:",
        "protect-locked-dblock": "在資料庫鎖定時無法更改保護級別。\n以下是'''$1'''現時的保護級別:",
        "protect-locked-access": "您的賬戶權限不能修改保護級別。\n以下是'''$1'''現時的保護級別:",
        "protect-cascadeon": "以下$1個頁面包含着本頁面的同時,啟動了連鎖保護,因此本頁面目前也被保護。您可以設定本頁面的保護級別,但這並不會對連鎖保護有所影響。",
-       "protect-default": "容許æ\89\80æ\9c\89ç\94¨æ\88",
-       "protect-fallback": "僅允許有「$1」權限的用戶",
-       "protect-level-autoconfirmed": "僅允許自動確認使用者",
+       "protect-default": "å\85\81許æ\89\80æ\9c\89使ç\94¨è\80\85",
+       "protect-fallback": "僅允許有 \"$1\" 權限的使用者",
+       "protect-level-autoconfirmed": "僅允許已自動確認的使用者",
        "protect-level-sysop": "僅允許管理員",
        "protect-summary-desc": "[$1=$2]($3)",
        "protect-summary-cascade": "連鎖",
        "restriction-level-sysop": "全保護",
        "restriction-level-autoconfirmed": "半保護",
        "restriction-level-all": "任何級別",
-       "undelete": "æ\81¢å¾©è¢«å\88ª頁面",
+       "undelete": "檢è¦\96å·²å\88ªé\99¤ç\9a\84頁面",
        "undeletepage": "檢視與還原已刪除的頁面",
        "undeletepagetitle": "'''以下包含[[:$1]]的已刪除之修訂版本'''。",
        "viewdeletedpage": "檢視已刪除的頁面",
        "undeleterevisions": "$1版本存檔",
        "undeletehistory": "如果您恢復了該頁面,所有版本都會被恢復到修訂歷史中。\n如果本頁刪除後有一個同名的新頁面建立,被恢復的版本將會出現在先前的歷史中。",
        "undeleterevdel": "如果把最新修訂部份刪除,反刪除便無法進行。如果遇到這種情況,您必須反選或反隱藏最新已刪除的修訂。",
-       "undeletehistorynoadmin": "這個頁面已經被刪除,刪除原因顯示在下方編輯摘要中。被刪除前的所有修訂版本,連同刪除前貢獻用戶等等細節只有管理員可以看見。",
+       "undeletehistorynoadmin": "此頁面已經被刪除。\n以下為刪除原因的摘要並包含刪除之前有那些使用者曾編輯此頁面。\n只有管理者可以檢視實際被刪除的修訂內容。",
        "undelete-revision": "$1由$3(在$4 $5)所編寫的已刪除修訂版本:",
        "undeleterevision-missing": "此版本的內容不正確或已經遺失。可能連結錯誤、被移除或已經被恢復。",
        "undelete-nodiff": "找不到先前的修訂版本。",
        "undelete-error-long": "當進行反刪除檔案時遇到錯誤:\n\n$1",
        "undelete-show-file-confirm": "確定要檢視在 $2 $3 ,\"<nowiki>$1</nowiki>\"的已刪除修訂版本嗎?",
        "undelete-show-file-submit": "是",
-       "namespace": "å\90\8då­\97空間:",
+       "namespace": "å\91½å\90\8d空間:",
        "invert": "反向選擇",
-       "tooltip-invert": "選中此複選框以隱藏選定命名空間內頁面更改(以及相關的命名空間,如果選中)",
-       "namespace_association": "關聯名字空間",
-       "tooltip-namespace_association": "選中此框可包括與選定名字空間相關的討論或主題命名空間",
-       "blanknamespace": "(主)",
-       "contributions": "{{GENDER:$1|用戶}}貢獻",
+       "tooltip-invert": "勾選此核選方塊以隱藏在已選擇命名空間中的頁面變更 (若有勾擇相關命名空間)",
+       "namespace_association": "相關命名空間",
+       "tooltip-namespace_association": "勾選此核選方塊以包含已選擇命名空間相關的對話或主題命名空間",
+       "blanknamespace": "(主要)",
+       "contributions": "{{GENDER:$1|使用者}}貢獻",
        "contributions-title": "$1 的使用者貢獻",
        "mycontris": "我的貢獻",
        "contribsub2": "{{GENDER:$3|$1}} 的貢獻 ($2)",
-       "contributions-userdoesnotexist": "用戶賬戶「$1」未曾註冊。",
+       "contributions-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。",
        "nocontribs": "沒有找到符合特徵的更改。",
        "uctop": "(最新修改)",
        "month": "截止月份:",
        "year": "截止年份:",
-       "sp-contributions-newbies": "å\8fªé¡¯ç¤ºæ\96°å»ºç«\8bä¹\8bç\94¨æ\88的貢獻",
+       "sp-contributions-newbies": "å\8fªé¡¯ç¤ºæ\96°å¸³è\99\9f的貢獻",
        "sp-contributions-newbies-sub": "新手",
-       "sp-contributions-newbies-title": "新手的用戶貢獻",
-       "sp-contributions-blocklog": "封記錄",
-       "sp-contributions-suppresslog": "已隱藏的用戶貢獻",
-       "sp-contributions-deleted": "已刪除的用戶貢獻",
+       "sp-contributions-newbies-title": "新帳號的使用者貢獻",
+       "sp-contributions-blocklog": "封記錄",
+       "sp-contributions-suppresslog": "已隱藏的使用者貢獻",
+       "sp-contributions-deleted": "已刪除的使用者貢獻",
        "sp-contributions-uploads": "上傳",
        "sp-contributions-logs": "日誌",
        "sp-contributions-talk": "對話",
-       "sp-contributions-userrights": "用戶權限管理",
-       "sp-contributions-blocked-notice": "這位用戶現時正在被封鎖中。\n最近的封鎖日誌項目在下面提供以便參考:",
-       "sp-contributions-blocked-notice-anon": "這個IP地址現時正在被封鎖中。\n最近的封鎖日誌項目在下面提供以便參考:",
+       "sp-contributions-userrights": "使用者權限管理",
+       "sp-contributions-blocked-notice": "此使用者目前已被封鎖。\n以下為最近的封鎖紀錄以供參考:",
+       "sp-contributions-blocked-notice-anon": "此 IP 位址目前已被封鎖。\n以下為最近的封鎖紀錄以供參考:",
        "sp-contributions-search": "搜尋貢獻記錄",
-       "sp-contributions-username": "IP位址或用戶名稱:",
+       "sp-contributions-username": "IP 位址或使用者名稱:",
        "sp-contributions-toponly": "只顯示最新修訂版本的編輯",
        "sp-contributions-newonly": "僅顯示建立頁面之編輯",
        "sp-contributions-submit": "搜尋",
        "whatlinkshere-page": "頁面:",
        "linkshere": "以下頁面連結到[[:$1]]:",
        "nolinkshere": "沒有頁面連結到[[:$1]]。",
-       "nolinkshere-ns": "å\9c¨æ\89\80é\81¸ç\9a\84å\90\8då­\97空é\96\93å\85§æ²\92æ\9c\89é \81é\9d¢é\80£çµ\90å\88°[[:$1]]。",
+       "nolinkshere-ns": "å·²é\81¸æ\93\87ç\9a\84å\91½å\90\8d空é\96\93中æ²\92æ\9c\89é \81é\9d¢é\80£çµ\90å\88° [[:$1]]。",
        "isredirect": "重新導向頁面",
        "istemplate": "包含",
        "isimage": "檔案連結",
        "whatlinkshere-prev": "前$1個",
        "whatlinkshere-next": "後$1個",
        "whatlinkshere-links": "← 連入",
-       "whatlinkshere-hideredirs": "$1重定向",
+       "whatlinkshere-hideredirs": "重新導向 $1 次",
        "whatlinkshere-hidetrans": "$1嵌入",
        "whatlinkshere-hidelinks": "$1連結",
        "whatlinkshere-hideimages": "$1檔案連結",
        "whatlinkshere-filters": "搜尋",
        "autoblockid": "自動查封 #$1",
-       "block": "封使用者",
-       "unblock": "解使用者",
-       "blockip": "封使用者",
-       "blockip-legend": "封使用者",
-       "blockiptext": "用下面的表單來禁止來自某一特定IP地址的修改許可權。\n只有在為防止破壞,及符合[[{{MediaWiki:Policy-url}}|守則]]的情況下才可採取此行動。\n請在下面輸入一個具體的理由(例如引述一個被破壞的頁面)。",
-       "ipadressorusername": "IP地址或用戶名:",
+       "block": "封使用者",
+       "unblock": "解除封鎖使用者",
+       "blockip": "封使用者",
+       "blockip-legend": "封使用者",
+       "blockiptext": "填寫以下單據可封鎖特定 IP 位置或使用者名稱的存取權限。\n這個動作應用來避免破壞行為,可根據 [[{{MediaWiki:Policy-url}}|管理政策]]。\n請在下方填寫一個具體的原因 (例如:引述一段破壞頁面的事實)。",
+       "ipadressorusername": "IP 位址或使用者名稱:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
-       "ipbreason-dropdown": "*一般的封禁理由\n** 屢次增加不實資料\n** 刪除頁面內容\n** 外部連結廣告\n** 在頁面中增加無意義文字\n** 無禮的行為、攻擊/騷擾別人\n** 濫用多個賬號\n** 不能接受的用戶名",
-       "ipb-hardblock": "é\98²æ­¢å·²ç\99»å\85¥ç\94¨æ\88¶å¾\9e該IPå\9c°å\9d\80編輯",
+       "ipbreason-dropdown": "*常見的封鎖原因\n** 填寫不實資訊\n** 刪除頁面內容\n** 散佈外部廣告連結\n** 在頁面填寫無意義文字\n** 無禮的行為、攻擊/騷擾別人\n** 濫用多個帳號\n** 使用不受歡迎的使用者名稱",
+       "ipb-hardblock": "é\81¿å\85\8d使ç\94¨æ­¤ IP ä½\8då\9d\80ç\99»å\85¥ç\9a\84使ç\94¨è\80\85編輯",
        "ipbcreateaccount": "阻止創建新賬號",
-       "ipbemailban": "é\98»æ­¢ç\94¨æ\88¶å\82³é\80\81é\9b»é\83µ",
-       "ipbenableautoblock": "自動查封此用戶最後所用的IP位址,以及後來試圖編輯所用的所有位址",
+       "ipbemailban": "é\81¿å\85\8d使ç\94¨è\80\85ç\99¼é\80\81é\9b»å­\90é\83µä»¶",
+       "ipbenableautoblock": "自動封鎖此使用者最後使用的 IP 位置,以及所有之後嘗試編輯使用的 IP 位址",
        "ipbsubmit": "查封該地址",
        "ipbother": "其它時間:",
        "ipboptions": "2小時:2 hours,1天:1 day,3天:3 days,1周:1 week,2周:2 weeks,1個月:1 month,3個月:3 months,6個月:6 months,1年:1 year,無限期:infinite",
-       "ipbhidename": "在編輯及列表中隱藏用戶名",
-       "ipbwatchuser": "監視這位用戶的用戶頁面以及其對話頁面",
-       "ipb-disableusertalk": "禁止被封禁用戶編輯自己的討論頁",
-       "ipb-change-block": "利用這些設定重新封鎖用戶",
-       "ipb-confirm": "確認封",
+       "ipbhidename": "在編輯及清單中隱藏使用者名稱",
+       "ipbwatchuser": "監視這位使用者的使用者頁面以及其對話頁面",
+       "ipb-disableusertalk": "避免在封鎖此使用者的期間編輯自己的對話頁面",
+       "ipb-change-block": "使用現有設定重新封鎖使用者",
+       "ipb-confirm": "確認封",
        "badipaddress": "無效IP地址",
-       "blockipsuccesssub": "查封成功",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]]已經被查封。<br />\n參看[[Special:BlockList|被封IP地址列表]]以覆審查封。",
-       "ipb-blockingself": "你要封禁自己!確認要這樣做嗎?",
-       "ipb-confirmhideuser": "你要封禁用戶並隱藏其用戶名,這會隱藏在所有列表及日誌中涉及此用戶之用戶名。你確定要這樣做嗎?",
+       "blockipsuccesssub": "封鎖成功",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] 已經被封鎖。<br />\n請參考 [[Special:BlockList|封鎖清單]] 以檢查目前的封鎖。",
+       "ipb-blockingself": "您要封鎖自己!您確定要這樣做嗎?",
+       "ipb-confirmhideuser": "您要封鎖一位使用者並且 \"隱藏\" 該使用者,這會隱藏所有出現在清單及記錄中的使用者名稱。\n你確定要這樣做?",
        "ipb-confirmaction": "如果您確信這樣做,請檢查底部的「{{int:ipb-confirm}}」部分。",
-       "ipb-edit-dropdown": "編輯查封原因",
-       "ipb-unblock-addr": "解$1",
-       "ipb-unblock": "解除禁封用戶名或IP地址",
-       "ipb-blocklist": "檢è¦\96ç\8f¾æ\9c\89ç\9a\84å°\81ç¦\81",
+       "ipb-edit-dropdown": "編輯封鎖原因",
+       "ipb-unblock-addr": "解除封鎖 $1",
+       "ipb-unblock": "解除封鎖使用者名稱或 IP 位址",
+       "ipb-blocklist": "檢è¦\96ç\9b®å\89\8dç\9a\84å°\81é\8e\96",
        "ipb-blocklist-contribs": "$1的貢獻",
-       "unblockip": "解封用戶",
-       "unblockiptext": "用下面的表單來恢復先前被查封的IP位址或用戶的寫權限。",
+       "unblockip": "解除封鎖使用者",
+       "unblockiptext": "填寫以下單據以取消先前封鎖的 IP 位址或使用者名稱。",
        "ipusubmit": "移除這個封鎖",
-       "unblocked": "[[User:$1|$1]] 的封已經解除。",
+       "unblocked": "[[User:$1|$1]] 的封已經解除。",
        "unblocked-range": "$1已被解封",
-       "unblocked-id": "å°\81ç¦\81 $1 å·²ç¶\93被移é\99¤",
-       "blocklist": "å°\81ç¦\81ç\94¨æ\88",
-       "ipblocklist": "被封用戶列表",
-       "ipblocklist-legend": "搜尋一位已經被查封的用戶",
-       "blocklist-userblocks": "隱藏用戶封禁",
-       "blocklist-tempblocks": "隱藏臨時封禁",
-       "blocklist-addressblocks": "隱藏單一IP封禁",
-       "blocklist-rangeblocks": "隱藏IP段封禁",
+       "unblocked-id": "å·²ç¶\93移é\99¤ $1 ç\9a\84å°\81é\8e\96ã\80\82",
+       "blocklist": "å·²å°\81é\8e\96ç\9a\84使ç\94¨è\80\85",
+       "ipblocklist": "已封鎖的使用者",
+       "ipblocklist-legend": "搜尋已封鎖的使用者",
+       "blocklist-userblocks": "隱藏帳號封鎖",
+       "blocklist-tempblocks": "隱藏暫時封鎖",
+       "blocklist-addressblocks": "隱藏單一 IP 封鎖",
+       "blocklist-rangeblocks": "隱藏 IP 範圍封鎖",
        "blocklist-timestamp": "時間",
        "blocklist-target": "目標",
-       "blocklist-expiry": "過期",
-       "blocklist-by": "封管理員",
-       "blocklist-params": "封參數",
+       "blocklist-expiry": "期限",
+       "blocklist-by": "封鎖的管理員",
+       "blocklist-params": "封參數",
        "blocklist-reason": "原因",
        "ipblocklist-submit": "搜尋",
        "ipblocklist-localblock": "本地封鎖",
        "ipblocklist-otherblocks": "其他{{PLURAL:$1|封鎖}}",
        "infiniteblock": "無限期",
        "expiringblock": "$1 $2 到期",
-       "anononlyblock": "僅限匿名用戶",
-       "noautoblockblock": "禁用自動查封",
-       "createaccountblock": "禁止建立帳號",
-       "emailblock": "禁止電子郵件",
-       "blocklist-nousertalk": "ç¦\81止編輯è\87ªå·±ç\9a\84ç\94¨æ\88¶è¨\8eè«\96é \81",
-       "ipblocklist-empty": "查封列表為空。",
-       "ipblocklist-no-results": "æ\89\80è¦\81æ±\82ç\9a\84IPå\9c°å\9d\80\94¨æ\88¶å\90\8dæ²\92æ\9c\89被æ\9f¥å°\81。",
+       "anononlyblock": "限匿名使用者",
+       "noautoblockblock": "停用自動封鎖",
+       "createaccountblock": "停用帳號建立",
+       "emailblock": "停用電子郵件",
+       "blocklist-nousertalk": "ç\84¡æ³\95編輯è\87ªå·±ç\9a\84å°\8d話é \81é\9d¢",
+       "ipblocklist-empty": "封鎖清單無任何資訊。",
+       "ipblocklist-no-results": "æ\8c\87å®\9aç\9a\84 IP ä½\8då\9d\80æ\88\96使ç\94¨è\80\85å\90\8d稱å°\9aæ\9cªè¢«å°\81é\8e\96。",
        "blocklink": "查封",
-       "unblocklink": "解除封",
-       "change-blocklink": "變更封",
+       "unblocklink": "解除封",
+       "change-blocklink": "變更封",
        "contribslink": "貢獻",
        "emaillink": "傳送電郵",
-       "autoblocker": "因為您與「[[User:$1|$1]]」共享同一IP位址而被自動封禁。\n$1被封禁的理由是「$2」",
+       "autoblocker": "您的 IP 位址因最近被 [[User:$1|$1]] 使用過而被自動封鎖。\n封鎖 $1 的原因為 \"$2\"",
        "blocklogpage": "查封日誌",
-       "blocklog-showlog": "這位用戶曾經被封鎖過。在下列提供封鎖記錄以便參考:",
-       "blocklog-showsuppresslog": "這位用戶曾經被封鎖和隱藏過。在下列提供廢止記錄以便參考:",
-       "blocklogentry": "å°\81ç¦\81[[$1]]ï¼\8cå\88°æ\9c\9fæ\99\82é\96\93ç\88²$2$3",
-       "reblock-logentry": "更改[[$1]]的封禁設置,到期時間爲$2$3",
-       "blocklogtext": "這是關於用戶封禁和解除封禁操作的記錄。被自動封禁的IP地址沒有被列出。請參閱[[Special:BlockList|被查封的IP地址和用戶列表]]。",
+       "blocklog-showlog": "此使用者先前被封鎖過。\n以下為封鎖紀錄以供參考:",
+       "blocklog-showsuppresslog": "此使用者先前被封鎖並且隱藏過。\n以下為隱藏紀錄以供參考:",
+       "blocklogentry": "å·²å°\81é\8e\96 [[$1]] ç\9a\84æ\9c\9fé\99\90è\87³ $2 $3",
+       "reblock-logentry": "更改 [[$1]] 的封鎖期限至 $2 $3",
+       "blocklogtext": "此為使用者的封鎖及取消封鎖記錄。\n不包自動封鎖的 IP 位址。\n請參考 [[Special:BlockList|封鎖清單]] 以查看目前的封鎖。",
        "unblocklogentry": "已解封 $1",
-       "block-log-flags-anononly": "僅限匿名用戶",
-       "block-log-flags-nocreate": "建ç«\8b帳è\99\9få·²ç¦\81ç\94¨",
-       "block-log-flags-noautoblock": "停用自動封",
-       "block-log-flags-noemail": "禁止電子郵件",
-       "block-log-flags-nousertalk": "ç¦\81止編輯è\87ªå·±ç\9a\84ç\94¨æ\88¶è¨\8eè«\96é \81",
+       "block-log-flags-anononly": "僅限匿名使用者",
+       "block-log-flags-nocreate": "å\81\9cç\94¨å¸³è\99\9f建ç«\8b",
+       "block-log-flags-noautoblock": "停用自動封",
+       "block-log-flags-noemail": "停用電子郵件",
+       "block-log-flags-nousertalk": "ç\84¡æ³\95編輯è\87ªå·±ç\9a\84å°\8d話é \81é\9d¢",
        "block-log-flags-angry-autoblock": "加強自動封鎖已啟用",
-       "block-log-flags-hiddenname": "隱藏用戶名稱",
-       "range_block_disabled": "只有管理員才能創建禁止查封的範圍。",
+       "block-log-flags-hiddenname": "隱藏使用者名稱",
+       "range_block_disabled": "管理員可建立範圍封鎖的權限以被關閉。",
        "ipb_expiry_invalid": "無效的終止時間。",
-       "ipb_expiry_temp": "隱藏用戶名封鎖必須是永久性的。",
+       "ipb_expiry_temp": "隱藏使用者名稱的封鎖不可設定期限。",
        "ipb_hide_invalid": "不能抑制此賬戶;它擁有多於$1次編輯。",
-       "ipb_already_blocked": "已經封鎖「$1」",
+       "ipb_already_blocked": "已經封鎖 \"$1\"。",
        "ipb-needreblock": "$1已經被封鎖。您是否想更改這個設定?",
        "ipb-otherblocks-header": "其他{{PLURAL:$1|封鎖}}",
-       "unblock-hideuser": "由於其用戶名已隱藏,你無法解封這個用戶。",
-       "ipb_cant_unblock": "錯誤: 找不到查封ID$1。可能已經解除封禁。",
-       "ipb_blocked_as_range": "錯誤: 該IP $1 無直接查封,不可以解除封禁。但是它是在 $2 的查封範圍之內,該段範圍是可以解除封禁的。",
+       "unblock-hideuser": "由於此使用者名稱已被設為隱藏,您無法解除封鎖這個使用者。",
+       "ipb_cant_unblock": "錯誤:查無封鎖 ID $1,可能已被解除封鎖。",
+       "ipb_blocked_as_range": "錯誤:IP 位址 $1 並不是直接被封鎖,因此無法直接解除封鎖。\n此 IP 位址在 $2 的封鎖範圍之中,您可以解決此範圍的封鎖。",
        "ip_range_invalid": "無效的IP範圍。",
-       "ip_range_toolarge": "大於 /$1 的封鎖範圍是不容許的。",
+       "ip_range_toolarge": "不允許封鎖範圍大於 /$1。",
        "proxyblocker": "代理封鎖器",
-       "proxyblockreason": "您的IP位址是一個開放的代理,它已經被封鎖。請聯繫您的網際網路服務提供商或技術支援者並告知告知他們該嚴重的安全問題。",
+       "proxyblockreason": "因您的 IP 位址是開放代理伺服器,已被封鎖。\n請聯繫您的網路服務供應商或您所在組織的技術支援,告知他們此嚴重的安全性問題。",
        "sorbsreason": "您的IP位址在{{SITENAME}}中被 DNSBL列為屬於開放代理服務器。",
        "sorbs_create_account_reason": "由於您的IP位址在{{SITENAME}}中被 DNSBL列為屬於開放代理服務器,所以您無法建立賬號。",
-       "xffblockreason": "您或您使用的代理伺服器X-Forwarded-For字段所包含的一個IP地址已被封禁。原始封禁理由:$1",
-       "cant-see-hidden-user": "您現正嘗試封鎖的用戶已經被封鎖或隱藏。\n您現在沒有隱藏用戶的權限,您不可以檢視或者編輯這位用戶的封鎖。",
-       "ipbblocked": "您無法封禁或解封其他用戶,因為您自己已被封禁",
-       "ipbnounblockself": "您不容許自我解除封禁",
+       "xffblockreason": "您的 IP 位址使用 X-Forwarded-For 標頭,您或您使用的代理伺服器已被封鎖。\n封鎖的原因為:$1",
+       "cant-see-hidden-user": "您欲封鎖的使用者已經被封鎖並且隱藏。\n您沒有隱藏使用者的權限,您無法檢視或編輯該使用者的封鎖狀態。",
+       "ipbblocked": "因您已被封鎖,故無法封鎖或解除封鎖其他使用者。",
+       "ipbnounblockself": "不允許解除封鎖自己。",
        "lockdb": "禁止更改資料庫",
        "unlockdb": "開放更改資料庫",
-       "lockdbtext": "鎖住資料庫將禁止所有用戶進行編輯頁面、更改參數、編輯監視列表以及其他需要更改資料庫的操作。\n請確認您的決定,並且保證您在維護工作結束後會重新開放資料庫。",
-       "unlockdbtext": "é\96\8bæ\94¾è³\87æ\96\99庫å°\87æ\9c\83æ\81¢å¾©æ\89\80æ\9c\89ç\94¨æ\88¶é\80²è¡\8c編輯é \81é\9d¢ã\80\81ä¿®æ\94¹å\8f\83æ\95¸ã\80\81編輯ç\9b£è¦\96å\88\97表以å\8f\8aå\85¶ä»\96é\9c\80è¦\81æ\9b´æ\94¹è³\87æ\96\99庫ç\9a\84æ\93\8dä½\9cã\80\82\nè«\8b確èª\8dæ\82¨ç\9a\84決å®\9aã\80\82",
+       "lockdbtext": "鎖定資料庫將會中止所有使用者編輯頁面、更改偏好設定、編輯監視清單與其他需要更動到資料庫的操作。\n請確認您是否要這樣做,並在維護作業結束時解除資料庫的鎖定。",
+       "unlockdbtext": "å\8f\96æ¶\88é\8e\96å®\9aè³\87æ\96\99庫æ\9c\83æ\81¢å¾©æ\89\80æ\9c\89使ç\94¨è\80\85編輯é \81é\9d¢ã\80\81æ\9b´æ\94¹å\81\8f好設å®\9aã\80\81編輯ç\9b£è¦\96æ¸\85å\96®è\88\87å\85¶ä»\96é\9c\80è¦\81æ\9b´å\8b\95å\88°è³\87æ\96\99庫ç\9a\84æ\93\8dä½\9cã\80\82\nè«\8b確èª\8dæ\82¨æ\98¯å\90¦è¦\81é\80\99樣å\81\9aã\80\82",
        "lockconfirm": "是的,我確實想要封鎖資料庫。",
        "unlockconfirm": "是的,我確實想要開放資料庫。",
        "lockbtn": "資料庫上鎖",
        "lockedbyandtime": "在$2的$3由$1",
        "move-page": "移動$1",
        "move-page-legend": "移動頁面",
-       "movepagetext": "用下面的表單來重新命名一個頁面,並將其修訂歷史同時移動到新頁面。\n老的頁面將成為新頁面的重定向頁。\n您可以自動地更新指到原標題的重定向。\n如果您選擇不去做的話,請檢查[[Special:DoubleRedirects|雙重]]或[[Special:BrokenRedirects|損壞重定向]]連結。\n您應當負責確定所有連結依然會連到指定的頁面。\n\n注意如果新頁面已經有內容的話,頁面將'''不會'''被移動,除非新頁面是重定向頁,而且沒有修訂歷史。\n這意味著您再必要時可以在移動到新頁面後再移回老的頁面,同時您也無法覆蓋現有頁面。\n\n'''警告!'''\n對一個經常被訪問的頁面而言這可能是一個重大與唐突的更改;\n請在行動前先了解其所可能帶來的後果。",
-       "movepagetext-noredirectfixer": "用下面的表單來重命名一個頁面,並將其修訂歷史同時移動到新頁面。\n老的頁面將成為新頁面的重定向頁。\n請檢查[[Special:DoubleRedirects|雙重重定向]]或[[Special:BrokenRedirects|損壞重定向]]連結。\n您應當負責確定所有連結依然會連到指定的頁面。\n\n注意如果新頁面已經有內容的話,頁面將'''不會'''被移動,\n除非新頁面無內容或是重定向頁,而且沒有修訂歷史。\n這意味著您再必要時可以在移動到新頁面後再移回老的頁面,\n同時您也無法覆蓋現有頁面。\n\n'''警告!'''\n對一個經常被訪問的頁面而言這可能是一個重大與唐突的更改;\n請在行動前先確定您了解其所可能帶來的後果。",
-       "movepagetalktext": "有關的對話頁(如果有的話)將被自動與該頁面一起移動,'''除非''':\n*您將頁面移動到不同的名字空間;\n*新頁面已經有一個包含內容的對話頁,或者\n*您不勾選下面的覆選框。\n\n在這些情況下,您在必要時必須手工移動或合併頁面。",
+       "movepagetext": "使用以下表單來重新命名一個頁面的名稱,並將所有頁面的歷史記錄一併移至新的頁面,\n舊標題的頁面將會變成重新導向頁面,導向至使用新標題的頁面。\n您可以選擇自動更新將所有導向至舊頁面的重新導向頁面改導向到新的頁面,\n若您選擇不使用自動更新,請記得檢查 [[Special:DoubleRedirects|雙重導向頁面]] 或 [[Special:BrokenRedirects|中斷的導向頁面]],\n您有責任讓連結維持有效並且能夠繼續連結到正確的新頁面。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>被移動,除非新名稱存在的是重新導向頁面且沒有任何的編修記錄。\n這個意思指的是,您可將因失誤而移動至其他名稱的頁面復原為舊的名稱,並且您不可以覆蓋任何已存在的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面可能是一個重大與唐突的更改;\n請在行動前確認您已了解可能帶來後果。",
+       "movepagetext-noredirectfixer": "使用以下表單來重新命名一個頁面的名稱,並將所有頁面的歷史記錄一併移至新的頁面,\n舊標題的頁面將會變成重新導向頁面,導向至使用新標題的頁面。\n請記得檢查 [[Special:DoubleRedirects|雙重導向頁面]] 或 [[Special:BrokenRedirects|中斷的導向頁面]],\n您有責任讓連結維持有效並且能夠繼續連結到正確的新頁面。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>被移動,除非新名稱存在的是重新導向頁面且沒有任何的編修記錄。\n這個意思指的是,您可將因失誤而移動至其他名稱的頁面復原為舊的名稱,並且您不可以覆蓋任何已存在的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面可能是一個重大與唐突的更改;\n請在行動前確認您已了解可能帶來後果。",
+       "movepagetalktext": "相關的的對話頁面 (如果有的話) 會自動與該頁面一起移動,<strong>除非:</strong>\n*新的名稱已有一個存在的對話頁面,或\n*您未勾選此核選方塊。\n\n在上述情況下,若有必要您必須手動移動或合併已存在的頁面。",
        "movearticle": "移動頁面:",
-       "moveuserpage-warning": "'''警告:'''您將會移動一個用戶頁面。請留意該頁面在移動後該用戶的名字是''不會''變更的。",
-       "movenologintext": "您必須是一名登記用戶並且[[Special:UserLogin|登入]]\n後才可移動一個頁面。",
+       "moveuserpage-warning": "<strong>警告:</strong> 您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<em>不會</em>重新命名使用者。",
+       "movenologintext": "您必須是已註冊的使用者並且 [[Special:UserLogin|登入]] 才可移動頁面。",
        "movenotallowed": "您並沒有許可權去移動頁面。",
        "movenotallowedfile": "您並沒有許可權去移動檔案。",
-       "cant-move-user-page": "您並沒有許可權去移動用戶頁面(它的子頁面除外)。",
-       "cant-move-to-user-page": "您並沒有許可權去移動到用戶頁面(它的子頁面除外)。",
+       "cant-move-user-page": "您沒有權限去移動使用者頁面 (除了它的子頁面)。",
+       "cant-move-to-user-page": "您沒有權限去移動頁面至使用者頁面 (除了使用者子頁面)。",
        "newtitle": "新標題:",
        "move-watch": "監視來源以及目標頁",
        "movepagebtn": "移動頁面",
        "movepage-moved-noredirect": "已經壓制創建重新定向。",
        "articleexists": "該名字的頁面已經存在,或者您選擇的名字無效。請再選一個名字。",
        "cantmove-titleprotected": "您不可以移動這個頁面到這個位置,因為該新標題已經被保護以防止建立。",
-       "movetalk": "移動關聯的對話頁",
+       "movetalk": "移動相關的對話頁面",
        "move-subpages": "移動子頁面(上至$1頁)",
-       "move-talk-subpages": "移å\8b\95å­\90å°\8d話é \81é\9d¢ï¼\88ä¸\8aè\87³$1é \81ï¼\89",
+       "move-talk-subpages": "移å\8b\95å°\8d話é \81é\9d¢ç\9a\84å­\90é \81é\9d¢ (å\85± $1 é \81)",
        "movepage-page-exists": "頁面 $1 已經存在,不可以自動地覆寫。",
        "movepage-page-moved": "頁面 $1 已經移動到 $2。",
        "movepage-page-unmoved": "頁面 $1 不可以移動到 $2。",
        "delete_and_move_confirm": "是的,刪除此頁面",
        "delete_and_move_reason": "刪除以便移動[[$1]]",
        "selfmove": "原始標題與目標標題相同,您不能移動一頁覆蓋本身。",
-       "immobile-source-namespace": "不可以在空間名「$1」上移動頁面",
+       "immobile-source-namespace": "無法移動在命名空間 \"$1\" 中的頁面",
        "immobile-target-namespace": "不可以將頁面移動到「$1」空間名中",
        "immobile-target-namespace-iw": "垮維基連結在移動頁面中是無效的目標。",
        "immobile-source-page": "這個頁面不能移動。",
        "immobile-target-page": "無法移動至目標標題中。",
        "bad-target-model": "所需的目的地使用不同的內容模式。不可以從$1轉換到 $2 。",
-       "imagenocrossnamespace": "ä¸\8då\8f¯ä»¥ç§»å\8b\95æª\94æ¡\88å\88°é\9d\9eæª\94æ¡\88å\90\8då­\97空間",
-       "nonfile-cannot-move-to-file": "ä¸\8då\8f¯ä»¥ç§»å\8b\95é\9d\9eæª\94æ¡\88å\88°æª\94æ¡\88å\90\8då­\97空間",
+       "imagenocrossnamespace": "ä¸\8då\8f¯ä»¥ç§»å\8b\95æª\94æ¡\88å\88°é\9d\9eæª\94æ¡\88å\91½å\90\8d空間",
+       "nonfile-cannot-move-to-file": "ä¸\8då\8f¯ä»¥ç§»å\8b\95é\9d\9eæª\94æ¡\88å\88°æª\94æ¡\88å\91½å\90\8d空間",
        "imagetypemismatch": "該新副檔名不匹配它的類型",
        "imageinvalidfilename": "目標檔案名稱是無效的",
-       "fix-double-redirects": "更新指到原先標題的任何重新定向",
+       "fix-double-redirects": "更新導向到原標題的任何重新導向頁面",
        "move-leave-redirect": "留下重新定向",
-       "protectedpagemovewarning": "'''警告:'''這個頁面已經被保護,只有擁有管理員權限的用戶才可以移動它。\n最近的日誌在下面提供以便參考:",
-       "semiprotectedpagemovewarning": "'''注意:'''這個頁面已經被保護,只有已經註冊的用戶才可以移動它。\n最近的日誌在下面提供以便參考:",
+       "protectedpagemovewarning": "<strong>警告:</strong>本頁已經被保護,只有擁有管理員權限的使用者才可移動。\n以下提供最近的日誌以便參考:",
+       "semiprotectedpagemovewarning": "<strong>注意:</strong>本頁已經被保護,只有已註冊的使用者才可移動。\n以下提供最近的日誌以便參考:",
        "move-over-sharedrepo": "== 檔案已存在 ==\n[[:$1]]已於共享資源存在,將檔案移動到此標題會覆蓋共享資源中的檔案。",
        "file-exists-sharedrepo": "同名檔案已於共享資源存在。\n請選擇另一個檔案名。",
        "export": "匯出頁面",
        "export-submit": "匯出",
        "export-addcattext": "由分類中加入頁面:",
        "export-addcat": "新增",
-       "export-addnstext": "ç\94±å\90\8då­\97空é\96\93中加入頁面:",
+       "export-addnstext": "ç\94±å\91½å\90\8d空é\96\93加入頁面:",
        "export-addns": "新增",
        "export-download": "另存為檔案",
        "export-templates": "包含模板",
        "allmessagesname": "名稱",
        "allmessagesdefault": "預設的訊息文字",
        "allmessagescurrent": "現時的訊息文字",
-       "allmessagestext": "這裡列出所有可定製的系統界面。\n如果想貢獻正宗的MediaWiki本地化的話,請參閱[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki本地化]以及[//translatewiki.net translatewiki.net]。",
+       "allmessagestext": "此處列出所有在 MediaWiki 命名空間中系統訊息。\n若您想參與官方的 MediaWiki 在地化,請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki 在地化] 與 [//translatewiki.net translatewiki.net]。",
        "allmessagesnotsupportedDB": "這個頁面無法使用,因為'''$wgUseDatabaseMessages'''已被設定關閉。",
        "allmessages-filter-legend": "搜尋",
        "allmessages-filter": "以自定狀況過濾:",
        "allmessages-filter-translate": "翻譯",
        "thumbnail-more": "放大",
        "filemissing": "無法找到檔案",
-       "thumbnail_error": "å\89µå»º縮圖錯誤: $1",
+       "thumbnail_error": "建ç«\8b縮圖錯誤: $1",
        "thumbnail_error_remote": "$1發出的電子郵件:\n$2",
        "djvu_page_error": "DjVu頁面超出範圍",
        "djvu_no_xml": "無法在DjVu檔案中擷取XML",
        "import-interwiki-history": "複製此頁的所有歷史修訂版本",
        "import-interwiki-templates": "包含所有模板",
        "import-interwiki-submit": "匯入",
-       "import-interwiki-namespace": "目的名字空間:",
+       "import-interwiki-namespace": "目標命名空間:",
        "import-interwiki-rootpage": "目標根頁(可選):",
        "import-upload-filename": "檔案名稱:",
        "import-comment": "註解:",
        "import-error-edit": "「$1」無法導入,因為您不准編輯它。",
        "import-error-create": "「$1」無法導入,因為您不准創造它。",
        "import-error-interwiki": "頁面\"$1\"未能導入,這是因為他的頁面名稱預留了供跨維基連結使用。",
-       "import-error-special": "「$1」未能導入因為該頁面使用一個不能創建頁面的特殊名字空間。",
+       "import-error-special": "無法匯入頁面 \"$1\",匯入的頁面屬於不允許頁面的特殊命名空間。",
        "import-error-invalid": "「$1」不能導入,因為名字無效。",
        "import-error-unserialize": "頁面「$1」的修訂版本「$2」不能反序列。該修訂版本是以$3內容模式序列為$4。",
        "import-error-bad-location": "於此wiki使用的內容模式$3的修訂版本$2並無可能存儲為「$1」,這是因為此種模式於該頁面無法支援。",
        "import-options-wrong": "{{PLURAL:$2|選項}}出錯:<nowiki>$1</nowiki>",
        "import-rootpage-invalid": "指定的根頁標題無效。",
-       "import-rootpage-nosubpage": "å\90\8då­\97空é\96\93ã\80\8c$1ã\80\8d的根頁面不允許子頁面。",
+       "import-rootpage-nosubpage": "å\91½å\90\8d空é\96\93 \"$1\" 的根頁面不允許子頁面。",
        "importlogpage": "匯入日誌",
        "importlogpagetext": "來自其它 wiki 的行政性的帶編輯歷史匯入頁面。",
        "import-logentry-upload": "透過檔案上傳匯入的$1",
        "javascripttest-qunit-intro": "請看mediawiki.org的[$1 測試說明]",
        "javascripttest-qunit-heading": "MediaWiki JavaScript QUnit 測試套件",
        "tooltip-pt-userpage": "您的使用者頁面",
-       "tooltip-pt-anonuserpage": "您編輯本站所用IP的對應用戶頁",
-       "tooltip-pt-mytalk": "您的對話頁",
+       "tooltip-pt-anonuserpage": "您編輯使用的 IP 位址所對應的使用者頁面",
+       "tooltip-pt-mytalk": "您的對話頁",
        "tooltip-pt-anontalk": "對於來自此IP地址編輯的對話",
        "tooltip-pt-preferences": "您的偏好設定",
        "tooltip-pt-watchlist": "您所監視頁面的變更列表",
        "tooltip-p-logo": "訪問首頁",
        "tooltip-n-mainpage": "訪問首頁",
        "tooltip-n-mainpage-description": "訪問首頁",
-       "tooltip-n-portal": "關於本計劃、您可以做什麼、在哪裡可以找到",
+       "tooltip-n-portal": "關於本專案、您可以做什麼、哪裡可以找到事情",
        "tooltip-n-currentevents": "提供目前新聞事件的背景資料",
-       "tooltip-n-recentchanges": "列出此維基中的最近修改",
+       "tooltip-n-recentchanges": "列出此 Wiki 中的最近變更清單",
        "tooltip-n-randompage": "隨機載入一個頁面",
-       "tooltip-n-help": "å°\8bæ±\82幫助",
+       "tooltip-n-help": "å°\8bæ±\82å\8d\94助",
        "tooltip-t-whatlinkshere": "列出所有與本頁相連的頁面",
-       "tooltip-t-recentchangeslinked": "頁面連出所有頁面的變更",
+       "tooltip-t-recentchangeslinked": "此頁面連結到其他頁面的最近變更",
        "tooltip-feed-rss": "訂閱本頁面歷史的RSS資訊",
        "tooltip-feed-atom": "訂閱本頁面歷史的 Atom Feed",
-       "tooltip-t-contributions": "檢視該用戶的貢獻列表",
-       "tooltip-t-emailuser": "向該用戶發送電子郵件",
+       "tooltip-t-contributions": "檢視該使用者的貢獻列表",
+       "tooltip-t-emailuser": "發送電子郵件給這個使用者",
        "tooltip-t-upload": "上傳檔案",
        "tooltip-t-specialpages": "全部特殊頁面的列表",
        "tooltip-t-print": "該頁面的可列印版本",
        "tooltip-t-permalink": "這個頁面修訂版本的永久連結",
        "tooltip-ca-nstab-main": "檢視頁面內容",
        "tooltip-ca-nstab-user": "檢視使用者頁面",
-       "tooltip-ca-nstab-media": "檢è¦\96å¤\9aåª\92é«\94æª\94æ¡\88è³\87è¨\8a頁面",
+       "tooltip-ca-nstab-media": "檢è¦\96åª\92é«\94頁面",
        "tooltip-ca-nstab-special": "本頁面會隨著資料庫的數據即時更新,任何人均不能直接編輯",
-       "tooltip-ca-nstab-project": "檢視計劃頁面",
+       "tooltip-ca-nstab-project": "檢視專案頁面",
        "tooltip-ca-nstab-image": "檢視檔案頁面",
        "tooltip-ca-nstab-mediawiki": "檢視系統資訊",
        "tooltip-ca-nstab-template": "檢視模板",
-       "tooltip-ca-nstab-help": "檢視幫助頁面",
+       "tooltip-ca-nstab-help": "檢視說明頁面",
        "tooltip-ca-nstab-category": "檢視分類頁面",
-       "tooltip-minoredit": "標記為小修",
+       "tooltip-minoredit": "標記為小修",
        "tooltip-save": "保存您的修改",
        "tooltip-preview": "預覽您的編輯,請先使用本功能再保存!",
        "tooltip-diff": "顯示您對頁面的貢獻",
        "tooltip-upload": "開始上傳",
        "tooltip-rollback": "按「復原」恢復上一位貢獻者對本頁面的編輯",
        "tooltip-undo": "「復原」可以在編輯模式上開啟編輯表格以便恢復。它容許在摘要中加入原因。",
-       "tooltip-preferences-save": "儲存使用偏好",
+       "tooltip-preferences-save": "儲存偏好設定",
        "tooltip-summary": "輸入一個簡短的摘要",
        "interlanguage-link-title": "$1 – $2",
-       "common.css": "/* 此處的 CSS 將應用於所有的面板 */",
-       "cologneblue.css": "/* 此處的 CSS 將影響使用科隆香水藍面板的用戶 */",
-       "monobook.css": "/* 此處的 CSS 將影響使用 Monobook 面板的用戶 */",
-       "modern.css": "/* 此處的 CSS 將影響使用 Modern 面板的用戶 */",
-       "vector.css": "/* 此處的 CSS 將影響使用 Vector 面板的用戶 */",
-       "print.css": "/* 此處的 CSS 將影響打印輸出 */",
-       "noscript.css": "/* 此處的 CSS 將影響沒有啓用 JavaScript 的用戶 */",
-       "group-autoconfirmed.css": "/* 此處的 CSS 將只會影響自動確認用戶 */",
-       "group-bot.css": "/* 此處的 CSS 將只會影響機器人 */",
-       "group-sysop.css": "/* 此處的 CSS 將只會影響管理員 */",
-       "group-bureaucrat.css": "/* 此處的 CSS 將只會影響行政員 */",
-       "common.js": "/* 此處的JavaScript將載入於所有用戶每一個頁面。 */",
-       "cologneblue.js": "/* 此處的JavaScript將載入於使用科隆香水藍面板的用戶 */",
-       "monobook.js": "/* 此處的JavaScript將載入於使用Monobook面板的用戶 */",
-       "modern.js": "/* 此處的JavaScript將載入於使用Modern面板的用戶 */",
-       "vector.js": "/* 此處的JavaScript將載入於使用Vector面板的用戶 */",
-       "anonymous": "{{SITENAME}}的匿名{{PLURAL:$1|用戶}}",
-       "siteuser": "{{SITENAME}}用戶$1",
-       "anonuser": "{{SITENAME}}匿名用戶$1",
+       "common.css": "/* 此 CSS 會套用至所有的介面外觀 */",
+       "cologneblue.css": "/* 此 CSS 會影響使用 Cologne Blue 介面外觀的使用者 */",
+       "monobook.css": "/* 此 CSS 會影響使用 Monobook 介面外觀的使用者 */",
+       "modern.css": "/* 此 CSS 會影響使用 Modern 介面外觀的使用者 */",
+       "vector.css": "/* 此 CSS 會影響使用 Vector 介面外觀的使用者 */",
+       "print.css": "/* 此 CSS 會影響列印版輸出 */",
+       "noscript.css": "/* 此 CSS 會影響沒有啓用 JavaScript 的使用者 */",
+       "group-autoconfirmed.css": "/* 此 CSS 會影響自動確認的使用者 */",
+       "group-bot.css": "/* 此 CSS 會影響機器人 */",
+       "group-sysop.css": "/* 此 CSS 會影響管理員 */",
+       "group-bureaucrat.css": "/* 此 CSS 會影響行政員 */",
+       "common.js": "/* 此 JavaScript 會用於使用者載入的每一個頁面。 */",
+       "cologneblue.js": "/* 此 JavaScript 會用於使用 Cologne Blue 介面外觀使用者 */",
+       "monobook.js": "/* 此 JavaScript 會用於使用 Monobook 介面外觀使用者 */",
+       "modern.js": "/* 此 JavaScript 會用於使用 Modern 介面外觀使用者 */",
+       "vector.js": "/* 此 JavaScript 會用於使用 Vector 介面外觀使用者 */",
+       "anonymous": "{{SITENAME}} 的匿名{{PLURAL:$1|使用者}}",
+       "siteuser": "{{SITENAME}} 使用者 $1",
+       "anonuser": "{{SITENAME}}匿名使用者 $1",
        "lastmodifiedatby": "此頁由 $3 於 $1 $2 的最後更改。",
        "othercontribs": "在$1的工作基礎上。",
        "others": "其他",
-       "siteusers": "{{SITENAME}}{{PLURAL:$2|用戶}}$1",
-       "anonusers": "{{SITENAME}}匿名{{PLURAL:$2|用戶}}$1",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|使用者}}$1",
+       "anonusers": "{{SITENAME}} 匿名{{PLURAL:$2|使用者}}$1",
        "creditspage": "頁面致謝",
        "nocredits": "該頁沒有致謝名單訊息。",
        "spamprotectiontitle": "垃圾過濾器",
-       "spamprotectiontext": "您要保存的文字被垃圾過濾器阻止。\n這可能是由於一個連往匹配黑名單的外部站點的連結引起的。",
+       "spamprotectiontext": "您欲儲存的文字內容已被垃圾過濾器封鎖,\n可能因您的內容包含了已封鎖的外部連結。",
        "spamprotectionmatch": "觸發了我們的垃圾過濾器的文本如下:$1",
        "spambot_username": "MediaWiki 廣告清除",
        "spam_reverting": "恢復到不包含連結至$1的最近修訂版本",
        "simpleantispam-label": "反濫發電郵檢查。\n'''不要'''加入這個!",
        "pageinfo-title": "「$1」的信息",
        "pageinfo-not-current": "抱歉,無法提供之前修訂版本的資訊。",
-       "pageinfo-header-basic": "基本資",
+       "pageinfo-header-basic": "基本資",
        "pageinfo-header-edits": "編輯歷史",
        "pageinfo-header-restrictions": "保護頁面",
        "pageinfo-header-properties": "頁面屬性",
        "pageinfo-views": "觀看次數",
        "pageinfo-watchers": "頁面監視者數目",
        "pageinfo-few-watchers": "少於$1名監視者",
-       "pageinfo-redirects-name": "重定向到此頁的數字",
+       "pageinfo-redirects-name": "重新導向至此頁面的數量",
        "pageinfo-subpages-name": "此頁面的子頁面",
-       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|重定向}}; $3 {{PLURAL:$3|非重定向}})",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|筆重新導向頁面}}; $3 {{PLURAL:$3|筆非重新導向頁面}})",
        "pageinfo-firstuser": "頁面的建立者",
        "pageinfo-firsttime": "頁面創建日期",
        "pageinfo-lastuser": "最近編輯者",
        "pageinfo-templates": "使用的模板($1)",
        "pageinfo-transclusions": "使用的頁面($1)",
        "pageinfo-toolboxlink": "頁面資訊",
-       "pageinfo-redirectsto": "重向至",
+       "pageinfo-redirectsto": "重新導向至",
        "pageinfo-redirectsto-info": "資訊",
        "pageinfo-contentpage": "計算為內容頁",
        "pageinfo-contentpage-yes": "是",
        "markaspatrolledtext": "標記此頁面為已巡查",
        "markedaspatrolled": "標記為已檢查",
        "markedaspatrolledtext": "[[:$1]]的已選定修訂版本已被標識為已巡查。",
-       "rcpatroldisabled": "最新更改檢查被關閉",
+       "rcpatroldisabled": "已停用最近變更檢查",
        "rcpatroldisabledtext": "最新更改檢查的功能目前已關閉。",
        "markedaspatrollederror": "不能標誌為已檢查",
        "markedaspatrollederrortext": "{{GENDER:|你|妳|你}}需要指定某個版本才能標誌為已檢查。",
        "exif-compressedbitsperpixel": "圖片壓縮模式",
        "exif-pixelydimension": "圖片寬度",
        "exif-pixelxdimension": "圖片高度",
-       "exif-usercomment": "用戶註釋",
+       "exif-usercomment": "使用者評論",
        "exif-relatedsoundfile": "相關的音頻檔案",
        "exif-datetimeoriginal": "數據產生時間",
        "exif-datetimedigitized": "數字化處理時間",
        "exif-urgency-normal": "正常( $1 )",
        "exif-urgency-low": "低( $1 )",
        "exif-urgency-high": "高( $1 )",
-       "exif-urgency-other": "用戶定義( $1 )",
+       "exif-urgency-other": "使用者自訂優先權 ($1)",
        "watchlistall2": "全部",
        "namespacesall": "全部",
        "monthsall": "全部",
        "confirmemail": "確認郵箱位址",
-       "confirmemail_noemail": "您沒有在您的[[Special:Preferences|用戶設定]]裡面輸入一個有效的 email 位址。",
+       "confirmemail_noemail": "您尚未於 [[Special:Preferences|偏好設定]] 輸入一個有效的電子郵件地址。",
        "confirmemail_text": "{{SITENAME}}要求您在使用郵件功能之前驗證您的郵箱位址。\n點擊以下按鈕可向您的郵箱發送一封確認郵件。該郵件包含有一行代碼連結;\n請在您的瀏覽器中加載此連結以確認您的郵箱位址是有效的。",
        "confirmemail_pending": "一個確認碼已經被發送到您的郵箱,您可能需要等幾分鐘才能收到。如果無法收到,請再申請一個新的確認碼。",
        "confirmemail_send": "郵發確認代碼",
        "confirmemail_success": "您的郵箱已經被確認。您現在可以[[Special:UserLogin|登錄]]並使用此網站了。",
        "confirmemail_loggedin": "您的郵箱位址現下已被確認。",
        "confirmemail_subject": "{{SITENAME}}郵箱位址確認",
-       "confirmemail_body": "擁有IP位址$1的用戶(可能是您)在{{SITENAME}}創建了賬戶\"$2\",並提交了您的電子郵箱位址。\n\n請確認這個賬戶是屬於您的,並同時啟用在{{SITENAME}}上的\n電子郵件功能。請在瀏覽器中打開下面的連結:\n\n$3\n\n如果您*未*註冊賬戶,\n請打開下面的連結去取消電子郵件確認:\n\n$5\n\n確認碼會在$4過期。",
-       "confirmemail_body_changed": "擁有IP位址$1的用戶(可能是您)在{{SITENAME}}更改了賬戶\"$2\"的電子郵箱位址。\n\n請確認這個賬戶是屬於您的,並同時重新啟用在{{SITENAME}}上的\n電子郵件功能。請在瀏覽器中打開下面的連結:\n\n$3\n\n如果這個賬戶*不是*屬於您的,\n請打開下面的連結去取消電子郵件確認:\n\n$5\n\n確認碼會在$4過期。",
-       "confirmemail_body_set": "ä¾\86è\87ªIPå\9c°å\9d\80 $1 ç\9a\84人 (å\8f¯è\83½æ\98¯ä½ ) å·²å°\87帳æ\88¶ \"$2\" ç\9a\84é\9b»é\83µå\9c°å\9d\80設å®\9aç\82º {{SITENAME}}ã\80\82\n\nè«\8bç\94¨ç\80\8f覽å\99¨æ\89\93é\96\8b以ä¸\8bç\9a\84é\80£æ\8e¥ï¼\8c以確èª\8dä½ å°\8dé\80\99å\80\8b帳æ\88¶ç\9a\84æ\93\81æ\9c\89æ¬\8aï¼\8c並å°\87ä¸\8aè¿°é\9b»é\83µå\9c°å\9d\80è·\9f帳æ\88¶å»ºç«\8bé\97\9cè\81¯ã\80\82\n\n$3\n\nå¦\82æ\9e\9cé\80\99帳æ\88¶*ä¸\8d\98¯ä½ ç\9a\84ï¼\8cè«\8bé»\9eæ­¤é\8f\88æ\8e¥å\8f\96æ¶\88é\9b»å­\90é\83µä»¶å\9c°å\9d\80確èª\8dï¼\9a\n\n$5\n\n確èª\8d碼æ\9c\83å\9c¨é\80\99å\80\8bæ\99\82é\96\93é\81\8eæ\9c\9fï¼\9a$4",
+       "confirmemail_body": "不明人士 (可能是您自己,來自 IP 位址 $1)  已在 {{SITENAME}} 註冊了一個帳號 \"$2\" 並使用了此電子郵件地址。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
+       "confirmemail_body_changed": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件地址更改至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
+       "confirmemail_body_set": "ä¸\8dæ\98\8e人士 (å\8f¯è\83½æ\98¯æ\82¨è\87ªå·±ï¼\8cä¾\86è\87ª IP ä½\8då\9d\80 $1)  å·²å°\87å\9c¨ {{SITENAME}} å¸³è\99\9f \"$2\" ç\9a\84é\9b»å­\90é\83µä»¶å\9c°å\9d\80設å®\9aè\87³æ­¤ã\80\82\n\nè«\8b確èª\8dé\80\99å\80\8b帳è\99\9fæ\98¯å±¬æ\96¼æ\82¨ç\9a\84ï¼\8c並使ç\94¨ç\80\8f覽å\99¨é\96\8bå\95\9fä¸\8bæ\96¹é\80£çµ\90以å\95\9fç\94¨å\9c¨ {{SITENAME}} ä¸\8aç\9a\84é\9b»å­\90é\83µä»¶å\8a\9fè\83½ï¼\9a\n\n$3\n\nè\8b¥æ\82¨ *æ\9cª* è¨»å\86\8a此帳è\99\9fï¼\8c\nè«\8bé\96\8bå\95\9fä¸\8bæ\96¹é\80£çµ\90å\8f\96æ¶\88é\9b»å­\90é\83µä»¶ç¢ºèª\8dï¼\9a\n\n$5\n\n此確èª\8d代碼æ\9c\83æ\96¼ $4 é\81\8eæ\9c\9fã\80\82",
        "confirmemail_invalidated": "電郵地址確認已取消",
        "invalidateemail": "取消電郵確認",
        "scarytranscludedisabled": "[跨wiki轉換代碼不可用]",
        "scarytranscludefailed-httpstatus": "[模板$1讀取失敗:HTTP$2]",
        "scarytranscludetoolong": "[URL 地址太長]",
        "deletedwhileediting": "'''警告:'''此頁在您開始編輯之後已經被刪除﹗",
-       "confirmrecreate": "在您開始編輯這個頁面後,用戶[[User:$1|$1]] ([[User talk:$1|對話]])以下列原因刪除了這個頁面:\n: ''$2''\n請確認在您重新創建頁面前三思。",
-       "confirmrecreate-noreason": "在您開始編輯後,用戶[[User:$1|$1]] ([[User talk:$1|對話]])刪除了這個頁面。請在重新創建頁面前三思。",
+       "confirmrecreate": "在您編輯的同時,使用者 [[User:$1|$1]] ([[User talk:$1|對話]]) 刪除了此頁面,原因為:\n: <em>$2</em>\n請確認您是否真的要重新建立此頁面。",
+       "confirmrecreate-noreason": "在您編輯的同時,使用者 [[User:$1|$1]] ([[User talk:$1|對話]]) 刪除了此頁面,請確認您是否真的要重新建立此頁面。",
        "recreate": "重建",
        "confirm_purge_button": "確定",
        "confirm-purge-top": "要清除此頁面的快取嗎?",
        "table_pager_empty": "沒有結果",
        "autosumm-blank": "清空頁面",
        "autosumm-replace": "以「$1」替換內容",
-       "autoredircomment": "重定向頁面到[[$1]]",
+       "autoredircomment": "重新導向頁面至 [[$1]]",
        "autosumm-new": "以內容「$1」創建新頁面",
        "size-bytes": "$1 位元組",
        "lag-warn-normal": "過去$1秒內的更改未必會在這個清單中顯示。",
        "watchlistedit-raw-done": "您的監視列表已經更新。",
        "watchlistedit-raw-added": "已經加入了$1個標題:",
        "watchlistedit-raw-removed": "已經移除了$1個標題:",
-       "watchlisttools-view": "檢視關更改",
+       "watchlisttools-view": "檢視關更改",
        "watchlisttools-edit": "檢視並編輯監視列表",
        "watchlisttools-raw": "編輯原始監視列表",
-       "signature": "[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|討論]])",
+       "signature": "[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|對話]])",
        "unknown_extension_tag": "不明的擴展標籤「$1」",
        "duplicate-defaultsort": "警告: 預設的排序鍵「$2」覆蓋先前的預設排序鍵「$1」。",
        "version": "版本",
        "version-entrypoints-header-entrypoint": "入口點",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath 條目路徑]",
-       "redirect": "重定向檔案、用戶、頁面或修訂ID",
-       "redirect-legend": "重定向到檔案或頁面",
-       "redirect-summary": "此特殊頁面重定向到檔案(請指定檔案名)、頁面(請指定修訂ID或頁面ID)或用戶頁(請指定用戶ID數值)。用法:[[{{#Special:Redirect}}/file/Example.jpg]]、[[{{#Special:Redirect}}/page/64308]]、[[{{#Special:Redirect}}/revision/328429]]或[[{{#Special:Redirect}}/user/101]]。",
+       "redirect": "依檔案、使用者、頁面或修訂 ID 重新導向",
+       "redirect-legend": "重新導向至檔案或頁面",
+       "redirect-summary": "此特殊頁面可用來重新導向至檔案 (指定檔案名稱)、頁面 (指定修訂 ID 或頁面 ID) 或使用者頁面 (指定使用者 ID)。用法:[[{{#Special:Redirect}}/file/Example.jpg]]、[[{{#Special:Redirect}}/page/64308]]、[[{{#Special:Redirect}}/revision/328429]] 或 [[{{#Special:Redirect}}/user/101]]。",
        "redirect-submit": "提交",
        "redirect-lookup": "尋找:",
        "redirect-value": "值:",
-       "redirect-user": "用戶ID:",
+       "redirect-user": "使用者 ID",
        "redirect-page": "頁面ID",
        "redirect-revision": "頁面修訂ID",
        "redirect-file": "檔案名稱",
        "specialpages-group-maintenance": "維護報告",
        "specialpages-group-other": "其它特殊頁面",
        "specialpages-group-login": "登入/建立新帳號",
-       "specialpages-group-changes": "最近更改和日誌",
+       "specialpages-group-changes": "最近變更與日誌",
        "specialpages-group-media": "媒體報告和上傳",
-       "specialpages-group-users": "用戶和權限",
+       "specialpages-group-users": "使用者與權限",
        "specialpages-group-highuse": "高度使用頁面",
        "specialpages-group-pages": "頁面清單",
        "specialpages-group-pagetools": "頁面工具",
        "specialpages-group-wiki": "資料和工具",
-       "specialpages-group-redirects": "é\87\8dæ\96°å®\9aå\90\91特殊頁面",
+       "specialpages-group-redirects": "é\87\8dæ\96°å°\8eå\90\91è\87³特殊頁面",
        "specialpages-group-spam": "反垃圾工具",
        "blankpage": "空白頁面",
        "intentionallyblankpage": "這個頁面是為空白",
        "logentry-suppress-revision-legacy": "$1已不可見地{{GENDER:$2|更改}}$3中歷史版本的可見性",
        "revdelete-content-hid": "隱藏內容",
        "revdelete-summary-hid": "隱藏編輯摘要",
-       "revdelete-uname-hid": "隱藏用戶名",
+       "revdelete-uname-hid": "隱藏使用者名稱",
        "revdelete-content-unhid": "恢復內容",
        "revdelete-summary-unhid": "恢復編輯摘要",
-       "revdelete-uname-unhid": "恢復用戶名",
+       "revdelete-uname-unhid": "取消隱藏使用者名稱",
        "revdelete-restricted": "已應用限制至操作員",
        "revdelete-unrestricted": "已移除對於操作員的限制",
        "logentry-move-move": "$1移動$3頁面至$4",
-       "logentry-move-move-noredirect": "$1移動$3頁面至$4,不留重定向",
+       "logentry-move-move-noredirect": "$1 移動 $3 頁面至 $4,未留重新導向頁面",
        "logentry-move-move_redir": "$1通過重定向移動$3頁面至$4",
-       "logentry-move-move_redir-noredirect": "$1通過重定向移動$3頁面至$4,不留重定向",
+       "logentry-move-move_redir-noredirect": "$1 透過重新導向移動 $3 頁面至 $4,未留重新導向頁面",
        "logentry-patrol-patrol": "$1{{GENDER:$2|標記}}頁面$3的版本$4為已巡查",
        "logentry-patrol-patrol-auto": "$1自動{{GENDER:$2|標記}}頁面$3的版本$4為已巡查",
-       "logentry-newusers-newusers": "已{{GENDER:$2|建立}}用戶「$1」",
-       "logentry-newusers-create": "已{{GENDER:$2|建立}}用戶「$1」",
-       "logentry-newusers-create2": "用戶「$1」建立用戶「$3」",
-       "logentry-newusers-byemail": "$1建立用戶$3並電郵密碼給他",
-       "logentry-newusers-autocreate": "ç\94¨æ\88¶$1被è\87ªå\8b\95{{GENDER:$2|建ç«\8b}}",
+       "logentry-newusers-newusers": "已{{GENDER:$2|建立}}使用者帳號 \"$1\"",
+       "logentry-newusers-create": "已{{GENDER:$2|建立}}使用者帳號 $1",
+       "logentry-newusers-create2": "$1 建立使用者帳號 \"$3\"",
+       "logentry-newusers-byemail": "$1 已建立使用者帳號 $3 並且以電子郵件通知密碼",
+       "logentry-newusers-autocreate": "系統è\87ªå\8b\95{{GENDER:$2|建ç«\8b}}使ç\94¨è\80\85帳è\99\9f $1",
        "logentry-rights-rights": "$1將$3的權限從$4改為$5",
        "logentry-rights-rights-legacy": "$1更改$3的權限",
        "logentry-rights-autopromote": "$1的權限自動從$4改為$5",
        "rightsnone": "無",
-       "feedback-bugornote": "如果您準備好了詳細描述一個技術問題,請[$1 報告一個bug]。或者,您可以使用下面的簡易表單。您的評論將被添加到頁面“[$3 $2]”,並帶有您的用戶名和使用的瀏覽器。",
+       "feedback-bugornote": "如果您準備要詳細描述一個技術問題,請至 [$1 回報問題]。\n或您可以使用以下的簡易表單回報問題,您的使用者名稱與評論將被新增到頁面 \"[$3 $2]\"。",
        "feedback-subject": "主旨:",
        "feedback-message": "訊息:",
        "feedback-cancel": "取消",
index 02156c7..751a131 100644 (file)
@@ -36,6 +36,7 @@ class SevenZipStream {
 
        private function stripPath( $path ) {
                $prefix = 'mediawiki.compress.7z://';
+
                return substr( $path, strlen( $prefix ) );
        }
 
@@ -91,4 +92,5 @@ class SevenZipStream {
                return fseek( $this->stream, $offset, $whence );
        }
 }
+
 stream_wrapper_register( 'mediawiki.compress.7z', 'SevenZipStream' );
index 48d8a15..479030f 100644 (file)
@@ -150,6 +150,7 @@ abstract class Maintenance {
                                return false; // previous calls should all be "requires"
                        }
                }
+
                return true;
        }
 
@@ -204,6 +205,7 @@ abstract class Maintenance {
                } else {
                        // Set it so we don't have to provide the default again
                        $this->mOptions[$name] = $default;
+
                        return $this->mOptions[$name];
                }
        }
@@ -303,6 +305,7 @@ abstract class Maintenance {
                }
                $input = fgets( $f, $len );
                fclose( $f );
+
                return rtrim( $input );
        }
 
@@ -375,6 +378,7 @@ abstract class Maintenance {
        public function outputChanneled( $msg, $channel = null ) {
                if ( $msg === false ) {
                        $this->cleanupChanneled();
+
                        return;
                }
 
@@ -426,8 +430,8 @@ abstract class Maintenance {
                                . '"max" for no limit or "default" to avoid changing it'
                );
                $this->addOption( 'server', "The protocol and server name to use in URLs, e.g. " .
-                               "http://en.wikipedia.org. This is sometimes necessary because " .
-                               "server name detection may fail in command line scripts.", false, true );
+                       "http://en.wikipedia.org. This is sometimes necessary because " .
+                       "server name detection may fail in command line scripts.", false, true );
                $this->addOption( 'profiler', 'Set to "text" or "trace" to show profiling output', false, true );
 
                # Save generic options to display them separately in help
@@ -472,6 +476,7 @@ abstract class Maintenance {
                if ( !is_null( $this->mDb ) ) {
                        $child->setDB( $this->mDb );
                }
+
                return $child;
        }
 
@@ -596,6 +601,7 @@ abstract class Maintenance {
                # it's run again and again
                if ( $this->mInputLoaded ) {
                        $this->loadSpecialVars();
+
                        return;
                }
 
@@ -643,7 +649,7 @@ abstract class Maintenance {
                                # Short options
                                $argLength = strlen( $arg );
                                for ( $p = 1; $p < $argLength; $p++ ) {
-                                       $option = $arg { $p };
+                                       $option = $arg[$p];
                                        if ( !isset( $this->mParams[$option] ) && isset( $this->mShortParamsMap[$option] ) ) {
                                                $option = $this->mShortParamsMap[$option];
                                        }
@@ -769,7 +775,7 @@ abstract class Maintenance {
                        }
                        $this->output(
                                wordwrap( "$tab--$par: " . $info['desc'], $descWidth,
-                                               "\n$tab$tab" ) . "\n"
+                                       "\n$tab$tab" ) . "\n"
                        );
                }
                $this->output( "\n" );
@@ -784,7 +790,7 @@ abstract class Maintenance {
                                }
                                $this->output(
                                        wordwrap( "$tab--$par: " . $info['desc'], $descWidth,
-                                                       "\n$tab$tab" ) . "\n"
+                                               "\n$tab$tab" ) . "\n"
                                );
                        }
                        $this->output( "\n" );
@@ -808,7 +814,7 @@ abstract class Maintenance {
                                }
                                $this->output(
                                        wordwrap( "$tab--$par: " . $info['desc'], $descWidth,
-                                                       "\n$tab$tab" ) . "\n"
+                                               "\n$tab$tab" ) . "\n"
                                );
                        }
                        $this->output( "\n" );
@@ -946,10 +952,11 @@ abstract class Maintenance {
 
                if ( !is_readable( $settingsFile ) ) {
                        $this->error( "A copy of your installation's LocalSettings.php\n" .
-                                               "must exist and be readable in the source directory.\n" .
-                                               "Use --conf to specify it.", true );
+                               "must exist and be readable in the source directory.\n" .
+                               "Use --conf to specify it.", true );
                }
                $wgCommandLineMode = true;
+
                return $settingsFile;
        }
 
@@ -1103,7 +1110,6 @@ abstract class Maintenance {
                        $this->unlockSearchindex( $dbw );
                        $this->output( "\n" );
                }
-
        }
 
        /**
@@ -1125,6 +1131,7 @@ abstract class Maintenance {
                        $u->doUpdate();
                        $this->output( "\n" );
                }
+
                return $title;
        }
 
@@ -1171,6 +1178,7 @@ abstract class Maintenance {
                                return false;
                        }
                        $resp = trim( $st );
+
                        return $resp;
                }
        }
@@ -1206,6 +1214,7 @@ abstract class Maintenance {
                        return false;
                }
                print $prompt;
+
                return fgets( STDIN, 1024 );
        }
 }
@@ -1215,6 +1224,7 @@ abstract class Maintenance {
  */
 class FakeMaintenance extends Maintenance {
        protected $mSelf = "FakeMaintenanceScript";
+
        public function execute() {
                return;
        }
@@ -1239,6 +1249,7 @@ abstract class LoggedUpdateMaintenance extends Maintenance {
                        && $db->selectRow( 'updatelog', '1', array( 'ul_key' => $key ), __METHOD__ )
                ) {
                        $this->output( "..." . $this->updateSkippedMessage() . "\n" );
+
                        return true;
                }
 
@@ -1250,6 +1261,7 @@ abstract class LoggedUpdateMaintenance extends Maintenance {
                        return true;
                } else {
                        $this->output( $this->updatelogFailedMessage() . "\n" );
+
                        return false;
                }
        }
@@ -1260,6 +1272,7 @@ abstract class LoggedUpdateMaintenance extends Maintenance {
         */
        protected function updateSkippedMessage() {
                $key = $this->getUpdateKey();
+
                return "Update '{$key}' already logged as completed.";
        }
 
@@ -1269,6 +1282,7 @@ abstract class LoggedUpdateMaintenance extends Maintenance {
         */
        protected function updatelogFailedMessage() {
                $key = $this->getUpdateKey();
+
                return "Unable to log update '{$key}' as completed.";
        }
 
diff --git a/maintenance/archives/patch-pp_sortkey.sql b/maintenance/archives/patch-pp_sortkey.sql
new file mode 100644 (file)
index 0000000..b13b605
--- /dev/null
@@ -0,0 +1,8 @@
+-- Add a 'sortkey' field to page_props so pages can be efficiently
+-- queried by the numeric value of a property.
+
+ALTER TABLE /*_*/page_props
+        ADD pp_sortkey float DEFAULT NULL;
+
+CREATE UNIQUE INDEX /*i*/pp_propname_sortkey_page
+        ON /*_*/page_props ( pp_propname, pp_sortkey, pp_page );
index 0749bbf..9ac204d 100644 (file)
@@ -52,6 +52,7 @@ class UpdateLogging {
 
                if ( $this->dbw->tableExists( 'logging_pre_1_10' ) ) {
                        echo "This script has already been run to completion\n";
+
                        return;
                }
 
@@ -158,7 +159,7 @@ EOT;
                        $srcRes = $this->dbw->select( $srcTable, '*', $conds, __METHOD__,
                                array( 'LIMIT' => $batchSize, 'ORDER BY' => 'log_timestamp' ) );
 
-                       if ( ! $srcRes->numRows() ) {
+                       if ( !$srcRes->numRows() ) {
                                # All done
                                break;
                        }
@@ -205,6 +206,7 @@ EOT;
                                }
                        }
                }
+
                return $numRowsCopied;
        }
 }
index 24f32c7..222c538 100644 (file)
@@ -136,52 +136,52 @@ class BackupDumper {
                        $matches = array();
                        if ( preg_match( '/^--(.+?)(?:=(.+?)(?::(.+?))?)?$/', $arg, $matches ) ) {
                                wfSuppressWarnings();
-                               list( /* $full */ , $opt, $val, $param ) = $matches;
+                               list( /* $full */, $opt, $val, $param ) = $matches;
                                wfRestoreWarnings();
 
                                switch ( $opt ) {
-                               case "plugin":
-                                       $this->loadPlugin( $val, $param );
-                                       break;
-                               case "output":
-                                       if ( !is_null( $sink ) ) {
-                                               $sinks[] = $sink;
-                                       }
-                                       if ( !isset( $this->outputTypes[$val] ) ) {
-                                               $this->fatalError( "Unrecognized output sink type '$val'" );
-                                       }
-                                       $type = $this->outputTypes[$val];
-                                       $sink = new $type( $param );
-                                       break;
-                               case "filter":
-                                       if ( is_null( $sink ) ) {
-                                               $sink = new DumpOutput();
-                                       }
-                                       if ( !isset( $this->filterTypes[$val] ) ) {
-                                               $this->fatalError( "Unrecognized filter type '$val'" );
-                                       }
-                                       $type = $this->filterTypes[$val];
-                                       $filter = new $type( $sink, $param );
-
-                                       // references are lame in php...
-                                       unset( $sink );
-                                       $sink = $filter;
-
-                                       break;
-                               case "report":
-                                       $this->reportingInterval = intval( $val );
-                                       break;
-                               case "server":
-                                       $this->server = $val;
-                                       break;
-                               case "force-normal":
-                                       if ( !function_exists( 'utf8_normalize' ) ) {
-                                               $this->fatalError( "UTF-8 normalization extension not loaded. " .
-                                                       "Install or remove --force-normal parameter to use slower code." );
-                                       }
-                                       break;
-                               default:
-                                       $this->processOption( $opt, $val, $param );
+                                       case "plugin":
+                                               $this->loadPlugin( $val, $param );
+                                               break;
+                                       case "output":
+                                               if ( !is_null( $sink ) ) {
+                                                       $sinks[] = $sink;
+                                               }
+                                               if ( !isset( $this->outputTypes[$val] ) ) {
+                                                       $this->fatalError( "Unrecognized output sink type '$val'" );
+                                               }
+                                               $type = $this->outputTypes[$val];
+                                               $sink = new $type( $param );
+                                               break;
+                                       case "filter":
+                                               if ( is_null( $sink ) ) {
+                                                       $sink = new DumpOutput();
+                                               }
+                                               if ( !isset( $this->filterTypes[$val] ) ) {
+                                                       $this->fatalError( "Unrecognized filter type '$val'" );
+                                               }
+                                               $type = $this->filterTypes[$val];
+                                               $filter = new $type( $sink, $param );
+
+                                               // references are lame in php...
+                                               unset( $sink );
+                                               $sink = $filter;
+
+                                               break;
+                                       case "report":
+                                               $this->reportingInterval = intval( $val );
+                                               break;
+                                       case "server":
+                                               $this->server = $val;
+                                               break;
+                                       case "force-normal":
+                                               if ( !function_exists( 'utf8_normalize' ) ) {
+                                                       $this->fatalError( "UTF-8 normalization extension not loaded. " .
+                                                               "Install or remove --force-normal parameter to use slower code." );
+                                               }
+                                               break;
+                                       default:
+                                               $this->processOption( $opt, $val, $param );
                                }
                        }
                }
@@ -229,8 +229,8 @@ class BackupDumper {
                        } else {
                                $exporter->allLogs();
                        }
-               # Page dumps: all or by page ID range
                } elseif ( is_null( $this->pages ) ) {
+                       # Page dumps: all or by page ID range
                        if ( $this->startId || $this->endId ) {
                                $exporter->pagesByRange( $this->startId, $this->endId );
                        } elseif ( $this->revStartId || $this->revEndId ) {
@@ -238,8 +238,8 @@ class BackupDumper {
                        } else {
                                $exporter->allPages();
                        }
-               # Dump of specific pages
                } else {
+                       # Dump of specific pages
                        $exporter->pagesByName( $this->pages );
                }
 
@@ -310,6 +310,7 @@ class BackupDumper {
 
        function backupServer() {
                global $wgDBserver;
+
                return $this->server
                        ? $this->server
                        : $wgDBserver;
index 869ba80..7bfb734 100644 (file)
@@ -53,8 +53,7 @@ class BaseDump {
                $infile = array_shift( $this->infiles );
                if ( defined( 'LIBXML_PARSEHUGE' ) ) {
                        $this->reader->open( $infile, null, LIBXML_PARSEHUGE );
-               }
-               else {
+               } else {
                        $this->reader->open( $infile );
                }
        }
@@ -78,6 +77,7 @@ class BaseDump {
                if ( $this->lastPage > $page || $this->atEnd ) {
                        $this->debug( "BaseDump::prefetch already past page $page "
                                . "looking for rev $rev  [$this->lastPage, $this->lastRev]" );
+
                        return null;
                }
                while ( $this->lastRev < $rev && !$this->atEnd && !$this->atPageEnd ) {
@@ -87,10 +87,12 @@ class BaseDump {
                }
                if ( $this->lastRev == $rev && !$this->atEnd ) {
                        $this->debug( "BaseDump::prefetch hit on $page, $rev [$this->lastPage, $this->lastRev]" );
+
                        return $this->nextText();
                } else {
                        $this->debug( "BaseDump::prefetch already past rev $rev on page $page "
                                . "[$this->lastPage, $this->lastRev]" );
+
                        return null;
                }
        }
@@ -140,6 +142,7 @@ class BaseDump {
         */
        function nextText() {
                $this->skipTo( 'text' );
+
                return strval( $this->nodeContents() );
        }
 
@@ -154,16 +157,20 @@ class BaseDump {
                        return false;
                }
                while ( $this->reader->read() ) {
-                       if ( $this->reader->nodeType == XMLReader::ELEMENT &&
-                               $this->reader->name == $name ) {
+                       if ( $this->reader->nodeType == XMLReader::ELEMENT
+                               && $this->reader->name == $name
+                       ) {
                                return true;
                        }
-                       if ( $this->reader->nodeType == XMLReader::END_ELEMENT &&
-                               $this->reader->name == $parent ) {
+                       if ( $this->reader->nodeType == XMLReader::END_ELEMENT
+                               && $this->reader->name == $parent
+                       ) {
                                $this->debug( "BaseDump::skipTo found </$parent> searching for <$name>" );
+
                                return false;
                        }
                }
+
                return $this->close();
        }
 
@@ -185,15 +192,16 @@ class BaseDump {
                $buffer = "";
                while ( $this->reader->read() ) {
                        switch ( $this->reader->nodeType ) {
-                       case XMLReader::TEXT:
-//                     case XMLReader::WHITESPACE:
-                       case XMLReader::SIGNIFICANT_WHITESPACE:
-                               $buffer .= $this->reader->value;
-                               break;
-                       case XMLReader::END_ELEMENT:
-                               return $buffer;
+                               case XMLReader::TEXT:
+                               //case XMLReader::WHITESPACE:
+                               case XMLReader::SIGNIFICANT_WHITESPACE:
+                                       $buffer .= $this->reader->value;
+                                       break;
+                               case XMLReader::END_ELEMENT:
+                                       return $buffer;
                        }
                }
+
                return $this->close();
        }
 
@@ -204,6 +212,7 @@ class BaseDump {
        function close() {
                $this->reader->close();
                $this->atEnd = true;
+
                return null;
        }
 }
index fd31844..7fca377 100644 (file)
@@ -31,6 +31,12 @@ require_once __DIR__ . '/backup.inc';
  */
 class TextPassDumper extends BackupDumper {
        public $prefetch = null;
+
+       // when we spend more than maxTimeAllowed seconds on this run, we continue
+       // processing until we write out the next complete page, then save output file(s),
+       // rename it/them and open new one(s)
+       public $maxTimeAllowed = 0; // 0 = no limit
+
        protected $input = "php://stdin";
        protected $history = WikiExporter::FULL;
        protected $fetchCount = 0;
@@ -67,10 +73,6 @@ class TextPassDumper extends BackupDumper {
 
        protected $xmlwriterobj = false;
 
-       // when we spend more than maxTimeAllowed seconds on this run, we continue
-       // processing until we write out the next complete page, then save output file(s),
-       // rename it/them and open new one(s)
-       protected $maxTimeAllowed = 0;  // 0 = no limit
        protected $timeExceeded = false;
        protected $firstPageWritten = false;
        protected $lastPageWritten = false;
@@ -102,6 +104,7 @@ class TextPassDumper extends BackupDumper {
 
                if ( $this->forcedDb !== null ) {
                        $this->db = $this->forcedDb;
+
                        return;
                }
 
@@ -183,31 +186,31 @@ class TextPassDumper extends BackupDumper {
                $url = $this->processFileOpt( $val, $param );
 
                switch ( $opt ) {
-               case 'prefetch':
-                       require_once "$IP/maintenance/backupPrefetch.inc";
-                       $this->prefetch = new BaseDump( $url );
-                       break;
-               case 'stub':
-                       $this->input = $url;
-                       break;
-               case 'maxtime':
-                       $this->maxTimeAllowed = intval( $val ) * 60;
-                       break;
-               case 'checkpointfile':
-                       $this->checkpointFiles[] = $val;
-                       break;
-               case 'current':
-                       $this->history = WikiExporter::CURRENT;
-                       break;
-               case 'full':
-                       $this->history = WikiExporter::FULL;
-                       break;
-               case 'spawn':
-                       $this->spawn = true;
-                       if ( $val ) {
-                               $this->php = $val;
-                       }
-                       break;
+                       case 'prefetch':
+                               require_once "$IP/maintenance/backupPrefetch.inc";
+                               $this->prefetch = new BaseDump( $url );
+                               break;
+                       case 'stub':
+                               $this->input = $url;
+                               break;
+                       case 'maxtime':
+                               $this->maxTimeAllowed = intval( $val ) * 60;
+                               break;
+                       case 'checkpointfile':
+                               $this->checkpointFiles[] = $val;
+                               break;
+                       case 'current':
+                               $this->history = WikiExporter::CURRENT;
+                               break;
+                       case 'full':
+                               $this->history = WikiExporter::FULL;
+                               break;
+                       case 'spawn':
+                               $this->spawn = true;
+                               if ( $val ) {
+                                       $this->php = $val;
+                               }
+                               break;
                }
        }
 
@@ -233,6 +236,7 @@ class TextPassDumper extends BackupDumper {
                        $newFileURIs[] = $newURI;
                }
                $val = implode( ';', $newFileURIs );
+
                return $val;
        }
 
@@ -242,6 +246,7 @@ class TextPassDumper extends BackupDumper {
        function showReport() {
                if ( !$this->prefetch ) {
                        parent::showReport();
+
                        return;
                }
 
@@ -278,7 +283,6 @@ class TextPassDumper extends BackupDumper {
                                }
                                $pageRatePart = $this->pageCountPart / $deltaPart;
                                $revRatePart = $this->revCountPart / $deltaPart;
-
                        } else {
                                $fetchRatePart = '-';
                                $pageRatePart = '-';
@@ -314,12 +318,13 @@ class TextPassDumper extends BackupDumper {
        }
 
        function finalOptionCheck() {
-               if ( ( $this->checkpointFiles && ! $this->maxTimeAllowed ) ||
-                       ( $this->maxTimeAllowed && !$this->checkpointFiles ) ) {
+               if ( ( $this->checkpointFiles && !$this->maxTimeAllowed )
+                       || ( $this->maxTimeAllowed && !$this->checkpointFiles )
+               ) {
                        throw new MWException( "Options checkpointfile and maxtime must be specified together.\n" );
                }
                foreach ( $this->checkpointFiles as $checkpointFile ) {
-                       $count = substr_count ( $checkpointFile, "%s" );
+                       $count = substr_count( $checkpointFile, "%s" );
                        if ( $count != 2 ) {
                                throw new MWException( "Option checkpointfile must contain two '%s' "
                                        . "for substitution of first and last pageids, count is $count instead, "
@@ -374,7 +379,7 @@ class TextPassDumper extends BackupDumper {
                                        'XML import parse failure',
                                        xml_get_current_line_number( $parser ),
                                        xml_get_current_column_number( $parser ),
-                                       $byte . ( is_null( $chunk ) ? null : ( '; "' . substr( $chunk, $byte -$offset, 16 ) . '"' ) ),
+                                       $byte . ( is_null( $chunk ) ? null : ( '; "' . substr( $chunk, $byte - $offset, 16 ) . '"' ) ),
                                        xml_error_string( xml_get_error_code( $parser ) ) )->escaped();
 
                                xml_parser_free( $parser );
@@ -393,7 +398,7 @@ class TextPassDumper extends BackupDumper {
                                # there's no pageID 0 so we use that. the caller is responsible
                                # for deciding what to do with a file containing only the
                                # siteinfo information and the mw tags.
-                               if ( ! $this->firstPageWritten ) {
+                               if ( !$this->firstPageWritten ) {
                                        $firstPageID = str_pad( 0, 9, "0", STR_PAD_LEFT );
                                        $lastPageID = str_pad( 0, 9, "0", STR_PAD_LEFT );
                                } else {
@@ -494,7 +499,7 @@ class TextPassDumper extends BackupDumper {
                                // Step 2: Checking for plausibility and return the text if it is
                                //         plausible
                                $revID = intval( $this->thisRev );
-                               if ( ! isset( $this->db ) ) {
+                               if ( !isset( $this->db ) ) {
                                        throw new MWException( "No database available" );
                                }
 
@@ -513,9 +518,7 @@ class TextPassDumper extends BackupDumper {
                                                        $revLength = $row->rev_len;
                                                }
                                        }
-
-                               }
-                               else {
+                               } else {
                                        $revLength = $this->db->selectField( 'revision', 'rev_len', array( 'rev_id' => $revID ) );
                                }
 
@@ -523,12 +526,12 @@ class TextPassDumper extends BackupDumper {
                                        if ( $tryIsPrefetch ) {
                                                $this->prefetchCount++;
                                        }
+
                                        return $text;
                                }
 
                                $text = false;
                                throw new MWException( "Received text is unplausible for id " . $id );
-
                        } catch ( Exception $e ) {
                                $msg = "getting/checking text " . $id . " failed (" . $e->getMessage() . ")";
                                if ( $failures + 1 < $this->maxFailures ) {
@@ -541,7 +544,7 @@ class TextPassDumper extends BackupDumper {
                        $failures++;
 
                        // A failure in a prefetch hit does not warrant resetting db connection etc.
-                       if ( ! $tryIsPrefetch ) {
+                       if ( !$tryIsPrefetch ) {
                                // After backing off for some time, we try to reboot the whole process as
                                // much as possible to not carry over failures from one part to the other
                                // parts
@@ -580,7 +583,7 @@ class TextPassDumper extends BackupDumper {
         */
        private function getTextDb( $id ) {
                global $wgContLang;
-               if ( ! isset( $this->db ) ) {
+               if ( !isset( $this->db ) ) {
                        throw new MWException( __METHOD__ . "No database available" );
                }
                $row = $this->db->selectRow( 'text',
@@ -593,6 +596,7 @@ class TextPassDumper extends BackupDumper {
                }
                $stripped = str_replace( "\r", "", $text );
                $normalized = $wgContLang->normalize( $stripped );
+
                return $normalized;
        }
 
@@ -604,6 +608,7 @@ class TextPassDumper extends BackupDumper {
                }
                $text = $this->getTextSpawnedOnce( $id );
                wfRestoreWarnings();
+
                return $text;
        }
 
@@ -618,8 +623,7 @@ class TextPassDumper extends BackupDumper {
                                                "$IP/../multiversion/MWScript.php",
                                                "fetchText.php",
                                                '--wiki', wfWikiID() ) ) );
-               }
-               else {
+               } else {
                        $cmd = implode( " ",
                                array_map( 'wfEscapeShellArg',
                                        array(
@@ -638,11 +642,12 @@ class TextPassDumper extends BackupDumper {
                if ( !$this->spawnProc ) {
                        // shit
                        $this->progress( "Subprocess spawn failed." );
+
                        return false;
                }
                list(
                        $this->spawnWrite, // -> stdin
-                       $this->spawnRead,  // <- stdout
+                       $this->spawnRead, // <- stdout
                ) = $pipes;
 
                return true;
@@ -720,12 +725,14 @@ class TextPassDumper extends BackupDumper {
                $gotbytes = strlen( $text );
                if ( $gotbytes != $nbytes ) {
                        $this->progress( "Expected $nbytes bytes from database subprocess, got $gotbytes " );
+
                        return false;
                }
 
                // Do normalization in the dump thread...
                $stripped = str_replace( "\r", "", $text );
                $normalized = $wgContLang->normalize( $stripped );
+
                return $normalized;
        }
 
@@ -773,7 +780,7 @@ class TextPassDumper extends BackupDumper {
                        $this->buffer = "";
                        $this->thisRev = "";
                } elseif ( $name == 'page' ) {
-                       if ( ! $this->firstPageWritten ) {
+                       if ( !$this->firstPageWritten ) {
                                $this->firstPageWritten = trim( $this->thisPage );
                        }
                        $this->lastPageWritten = trim( $this->thisPage );
@@ -811,7 +818,6 @@ class TextPassDumper extends BackupDumper {
                                $this->buffer = "";
                                $this->thisPage = "";
                        }
-
                } elseif ( $name == 'mediawiki' ) {
                        $this->egress->writeCloseStream( $this->buffer );
                        $this->buffer = "";
index dd558f3..3f8a899 100644 (file)
@@ -46,38 +46,38 @@ abstract class Benchmarker extends Maintenance {
                $bench_number = 0;
                $count = $this->getOption( 'count', 100 );
 
-               foreach( $benchs as $bench ) {
+               foreach ( $benchs as $bench ) {
                        // handle empty args
-                       if( !array_key_exists( 'args', $bench ) ) {
+                       if ( !array_key_exists( 'args', $bench ) ) {
                                $bench['args'] = array();
                        }
 
                        $bench_number++;
                        $start = microtime( true );
-                       for( $i = 0; $i < $count; $i++ ) {
+                       for ( $i = 0; $i < $count; $i++ ) {
                                call_user_func_array( $bench['function'], $bench['args'] );
                        }
                        $delta = microtime( true ) - $start;
 
                        // function passed as a callback
-                       if( is_array( $bench['function'] ) ) {
+                       if ( is_array( $bench['function'] ) ) {
                                $ret = get_class( $bench['function'][0] ) . '->' . $bench['function'][1];
                                $bench['function'] = $ret;
                        }
 
                        $this->results[$bench_number] = array(
-                               'function'  => $bench['function'],
+                               'function' => $bench['function'],
                                'arguments' => $bench['args'],
-                               'count'     => $count,
-                               'delta'     => $delta,
-                               'average'   => $delta / $count,
-                               );
+                               'count' => $count,
+                               'delta' => $delta,
+                               'average' => $delta / $count,
+                       );
                }
        }
 
        public function getFormattedResults() {
                $ret = '';
-               foreach( $this->results as $res ) {
+               foreach ( $this->results as $res ) {
                        // show function with args
                        $ret .= sprintf( "%s times: function %s(%s) :\n",
                                $res['count'],
@@ -89,6 +89,7 @@ abstract class Benchmarker extends Maintenance {
                                $res['average'] * 1000
                        );
                }
+
                return $ret;
        }
 }
index ed3fe5c..8ae4f03 100644 (file)
@@ -75,7 +75,7 @@ class BenchmarkDeleteTruncate extends Benchmarker {
        private function insertData( $dbw ) {
                $range = range( 0, 1024 );
                $data = array();
-               foreach( $range as $r ) {
+               foreach ( $range as $r ) {
                        $data[] = array( 'text' => $r );
                }
                $dbw->insert( 'test', $data, __METHOD__ );
index 99e9cfd..44c8e03 100644 (file)
@@ -50,7 +50,7 @@ class BenchStrtrStrReplace extends Benchmarker {
                        array( 'function' => array( $this, 'benchstr_replace' ) ),
                        array( 'function' => array( $this, 'benchstrtr_indirect' ) ),
                        array( 'function' => array( $this, 'benchstr_replace_indirect' ) ),
-               ));
+               ) );
                print $this->getFormattedResults();
        }
 
@@ -59,7 +59,7 @@ class BenchStrtrStrReplace extends Benchmarker {
        }
 
        function benchstr_replace() {
-               str_replace( "_", " ", "[[MediaWiki:Some_random_test_page]]");
+               str_replace( "_", " ", "[[MediaWiki:Some_random_test_page]]" );
        }
 
        function benchstrtr_indirect() {
index 1c31256..b742f66 100644 (file)
@@ -61,7 +61,7 @@ class BenchUtf8TitleCheck extends Benchmarker {
                );
                // @codingStandardsIgnoreEnd
 
-               $this->canRun = function_exists ( 'mb_check_encoding' );
+               $this->canRun = function_exists( 'mb_check_encoding' );
 
                if ( $this->canRun ) {
                        $this->mDescription = "Benchmark for using a regexp vs. mb_check_encoding " .
@@ -77,22 +77,22 @@ class BenchUtf8TitleCheck extends Benchmarker {
                        return;
                }
                $benchmarks = array();
-               foreach ($this->data as $val) {
+               foreach ( $this->data as $val ) {
                        $benchmarks[] = array(
                                'function' => array( $this, 'use_regexp' ),
-                               'args' => array( rawurldecode ( $val ) )
+                               'args' => array( rawurldecode( $val ) )
                        );
                        $benchmarks[] = array(
                                'function' => array( $this, 'use_regexp_non_capturing' ),
-                               'args' => array( rawurldecode ( $val ) )
+                               'args' => array( rawurldecode( $val ) )
                        );
                        $benchmarks[] = array(
                                'function' => array( $this, 'use_regexp_once_only' ),
-                               'args' => array( rawurldecode ( $val ) )
+                               'args' => array( rawurldecode( $val ) )
                        );
                        $benchmarks[] = array(
                                'function' => array( $this, 'use_mb_check_encoding' ),
-                               'args' => array( rawurldecode ( $val ) )
+                               'args' => array( rawurldecode( $val ) )
                        );
                }
                $this->bench( $benchmarks );
@@ -103,19 +103,19 @@ class BenchUtf8TitleCheck extends Benchmarker {
 
        function use_regexp( $s ) {
                $this->isutf8 = preg_match( '/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
-                               '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
+                       '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
        }
 
        function use_regexp_non_capturing( $s ) {
                // Same as above with a non-capturing subgroup.
                $this->isutf8 = preg_match( '/^(?:[\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
-                               '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
+                       '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
        }
 
        function use_regexp_once_only( $s ) {
                // Same as above with a once-only subgroup.
                $this->isutf8 = preg_match( '/^(?>[\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
-                               '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
+                       '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
        }
 
        function use_mb_check_encoding( $s ) {
index d08a0b0..b4be12b 100644 (file)
@@ -57,7 +57,7 @@ class BenchWfBaseConvert extends Benchmarker {
                                'function' => 'wfBaseConvert',
                                'args' => array( $number, $inbase, $outbase, 0, true, 'gmp' )
                        ),
-               ));
+               ) );
 
                $this->output( $this->getFormattedResults() );
        }
@@ -65,9 +65,10 @@ class BenchWfBaseConvert extends Benchmarker {
        protected static function makeRandomNumber( $base, $length ) {
                $baseChars = "0123456789abcdefghijklmnopqrstuvwxyz";
                $res = "";
-               for( $i = 0; $i < $length; $i++ ) {
-                       $res .= $baseChars[mt_rand(0, $base - 1)];
+               for ( $i = 0; $i < $length; $i++ ) {
+                       $res .= $baseChars[mt_rand( 0, $base - 1 )];
                }
+
                return $res;
        }
 }
index b5cb025..8446694 100644 (file)
@@ -41,7 +41,7 @@ class BenchWfIsWindows extends Benchmarker {
                $this->bench( array(
                        array( 'function' => array( $this, 'wfIsWindows' ) ),
                        array( 'function' => array( $this, 'wfIsWindowsCached' ) ),
-               ));
+               ) );
                print $this->getFormattedResults();
        }
 
@@ -57,9 +57,10 @@ class BenchWfIsWindows extends Benchmarker {
        // bench function 2
        function wfIsWindowsCached() {
                static $isWindows = null;
-               if( $isWindows == null ) {
+               if ( $isWindows == null ) {
                        $isWindows = self::is_win();
                }
+
                return $isWindows;
        }
 }
index bb7af2b..fb25b9d 100644 (file)
@@ -45,13 +45,13 @@ class BenchmarkHooks extends Benchmarker {
                $time = $this->benchHooks();
                $this->output( 'Loaded (one) hook: ' . $time . "\n" );
 
-               for( $i = 0; $i < 9; $i++ ) {
+               for ( $i = 0; $i < 9; $i++ ) {
                        $wgHooks['Test'][] = array( $this, 'test' );
                }
                $time = $this->benchHooks();
                $this->output( 'Loaded (ten) hook: ' . $time . "\n" );
 
-               for( $i = 0; $i < 90; $i++ ) {
+               for ( $i = 0; $i < 90; $i++ ) {
                        $wgHooks['Test'][] = array( $this, 'test' );
                }
                $time = $this->benchHooks();
@@ -70,6 +70,7 @@ class BenchmarkHooks extends Benchmarker {
                }
                $delta = microtime( true ) - $start;
                $pertrial = $delta / $trials;
+
                return sprintf( "Took %6.3fms",
                        $pertrial * 1000 );
        }
index cec2beb..b81f9fd 100644 (file)
@@ -47,7 +47,7 @@ class BenchmarkParse extends Maintenance {
                        false, true );
                $this->addOption( 'tpl-time',
                        'Use templates which were current at the given time (except that moves and ' .
-                               'deletes are not handled properly)',
+                       'deletes are not handled properly)',
                        false, true );
        }
 
@@ -94,7 +94,7 @@ class BenchmarkParse extends Maintenance {
                printf( "CPU time = %.3f s, wall clock time = %.3f s\n",
                        // CPU time
                        $endUsage['ru_utime.tv_sec'] + $endUsage['ru_utime.tv_usec'] * 1e-6
-                               - $startUsage['ru_utime.tv_sec'] - $startUsage['ru_utime.tv_usec'] * 1e-6,
+                       - $startUsage['ru_utime.tv_sec'] - $startUsage['ru_utime.tv_usec'] * 1e-6,
                        // Wall clock time
                        $endTime - $startTime );
        }
index dcaacab..42c1eb7 100644 (file)
@@ -68,6 +68,7 @@ class BenchmarkPurge extends Benchmarker {
                $delta = microtime( true ) - $start;
                $pertrial = $delta / $trials;
                $pertitle = $pertrial / count( $urls );
+
                return sprintf( "%4d titles in %6.2fms (%6.2fms each)",
                        count( $urls ), $pertrial * 1000.0, $pertitle * 1000.0 );
        }
@@ -82,6 +83,7 @@ class BenchmarkPurge extends Benchmarker {
                for ( $i = 0; $i < $length; $i++ ) {
                        $list[] = $this->randomUrl();
                }
+
                return $list;
        }
 
@@ -92,6 +94,7 @@ class BenchmarkPurge extends Benchmarker {
         */
        private function randomUrl() {
                global $wgServer, $wgArticlePath;
+
                return $wgServer . str_replace( '$1', $this->randomTitle(), $wgArticlePath );
        }
 
@@ -106,6 +109,7 @@ class BenchmarkPurge extends Benchmarker {
                for ( $i = 0; $i < $length; $i++ ) {
                        $str .= chr( mt_rand( ord( 'a' ), ord( 'z' ) ) );
                }
+
                return ucfirst( $str );
        }
 }
index a96e9b8..fec9291 100644 (file)
@@ -44,7 +44,7 @@ class CheckBadRedirects extends Maintenance {
 
                $count = $result->numRows();
                $this->output( "Found $count redirects.\n" .
-                                               "Checking for bad redirects:\n\n" );
+                       "Checking for bad redirects:\n\n" );
 
                foreach ( $result as $row ) {
                        $title = Title::makeTitle( $row->page_namespace, $row->page_title );
index e914645..3921c07 100644 (file)
@@ -80,7 +80,6 @@ class CheckImages extends Maintenance {
 
                                $numGood++;
                        }
-
                } while ( $res->numRows() );
 
                $this->output( "Good images: $numGood/$numImages\n" );
index e01767e..6ef4909 100644 (file)
@@ -96,7 +96,7 @@ class CheckSyntax extends Maintenance {
                $this->mIgnorePaths = array(
                        // Compat stuff, explodes on PHP 5.3
                        "includes/NamespaceCompat.php$",
-                       );
+               );
 
                $this->mNoStyleCheckPaths = array(
                        // Third-party code we don't care about
@@ -110,13 +110,14 @@ class CheckSyntax extends Maintenance {
                        "QPoll/Excel/",
                        "/geshi/",
                        "/smarty/",
-                       );
+               );
 
                if ( $this->hasOption( 'path' ) ) {
                        $path = $this->getOption( 'path' );
                        if ( !$this->addPath( $path ) ) {
                                $this->error( "Error: can't find file or directory $path\n", true );
                        }
+
                        return; // process only this path
                } elseif ( $this->hasOption( 'list-file' ) ) {
                        $file = $this->getOption( 'list-file' );
@@ -131,6 +132,7 @@ class CheckSyntax extends Maintenance {
                                $this->addPath( $path );
                        }
                        fclose( $f );
+
                        return;
                } elseif ( $this->hasOption( 'modified' ) ) {
                        $this->output( "Retrieving list from Git... " );
@@ -141,6 +143,7 @@ class CheckSyntax extends Maintenance {
                                        $this->mFiles[] = $file;
                                }
                        }
+
                        return;
                }
 
@@ -241,6 +244,7 @@ class CheckSyntax extends Maintenance {
                                return false;
                        }
                }
+
                return true;
        }
 
@@ -251,6 +255,7 @@ class CheckSyntax extends Maintenance {
         */
        private function addPath( $path ) {
                global $IP;
+
                return $this->addFileOrDir( $path ) || $this->addFileOrDir( "$IP/$path" );
        }
 
@@ -267,6 +272,7 @@ class CheckSyntax extends Maintenance {
                } else {
                        return false;
                }
+
                return true;
        }
 
@@ -313,6 +319,7 @@ class CheckSyntax extends Maintenance {
                                $this->mFailures[$file] = $errors;
                        }
                }
+
                return $ret;
        }
 
@@ -326,8 +333,10 @@ class CheckSyntax extends Maintenance {
                if ( strpos( $res, 'No syntax errors detected' ) === false ) {
                        $this->mFailures[$file] = $res;
                        $this->output( $res . "\n" );
+
                        return false;
                }
+
                return true;
        }
 
index 6df189f..777c833 100644 (file)
@@ -55,7 +55,7 @@ class CheckUsernames extends Maintenance {
                        );
 
                        foreach ( $res as $row ) {
-                               if ( ! User::isValidUserName( $row->user_name ) ) {
+                               if ( !User::isValidUserName( $row->user_name ) ) {
                                        $this->error( sprintf( "%s: %6d: '%s'\n", wfWikiID(), $row->user_id, $row->user_name ) );
                                        wfDebugLog( 'checkUsernames', $row->user_name );
                                }
index 428484b..2dbf8bc 100644 (file)
@@ -83,7 +83,7 @@ class CleanupAncientTables extends Maintenance {
                        if ( $db->indexExists( 'text', $index, __METHOD__ ) ) {
                                $this->output( "Dropping index $index from the text table..." );
                                $db->query( "DROP INDEX " . $db->addIdentifierQuotes( $index )
-                                               . " ON " . $db->tableName( 'text' ) );
+                                       . " ON " . $db->tableName( 'text' ) );
                                $this->output( "done.\n" );
                        }
                }
@@ -102,7 +102,7 @@ class CleanupAncientTables extends Maintenance {
                        if ( $db->fieldExists( 'text', $field, __METHOD__ ) ) {
                                $this->output( "Dropping the $field field from the text table..." );
                                $db->query( "ALTER TABLE  " . $db->tableName( 'text' )
-                                               . " DROP COLUMN " . $db->addIdentifierQuotes( $field )  );
+                                       . " DROP COLUMN " . $db->addIdentifierQuotes( $field ) );
                                $this->output( "done.\n" );
                        }
                }
index 321f089..9e88c13 100644 (file)
@@ -71,6 +71,7 @@ class CapsCleanup extends TableCleanup {
                $lower = $wgContLang->lcfirst( $row->page_title );
                if ( $upper == $lower ) {
                        $this->output( "\"$display\" already lowercase.\n" );
+
                        return $this->progress( 0 );
                }
 
@@ -78,6 +79,7 @@ class CapsCleanup extends TableCleanup {
                $targetDisplay = $target->getPrefixedText();
                if ( $target->exists() ) {
                        $this->output( "\"$display\" skipped; \"$targetDisplay\" already exists\n" );
+
                        return $this->progress( 0 );
                }
 
@@ -98,6 +100,7 @@ class CapsCleanup extends TableCleanup {
                                }
                        }
                }
+
                return $this->progress( 0 );
        }
 }
index 1b46ab8..915a2c0 100644 (file)
@@ -56,6 +56,7 @@ class ImageCleanup extends TableCleanup {
                if ( $source == '' ) {
                        // Ye olde empty rows. Just kill them.
                        $this->killRow( $source );
+
                        return $this->progress( 1 );
                }
 
@@ -82,6 +83,7 @@ class ImageCleanup extends TableCleanup {
                                return $this->progress( 0 );
                        }
                        $this->pokeFile( $source, $safe );
+
                        return $this->progress( 1 );
                }
 
@@ -89,6 +91,7 @@ class ImageCleanup extends TableCleanup {
                        $munged = $title->getDBkey();
                        $this->output( "page $source ($munged) doesn't match self.\n" );
                        $this->pokeFile( $source, $munged );
+
                        return $this->progress( 1 );
                }
 
@@ -114,6 +117,7 @@ class ImageCleanup extends TableCleanup {
                if ( !isset( $this->repo ) ) {
                        $this->repo = RepoGroup::singleton()->getLocalRepo();
                }
+
                return $this->repo->getRootDirectory() . '/' . $this->repo->getHashPath( $name ) . $name;
        }
 
@@ -135,6 +139,7 @@ class ImageCleanup extends TableCleanup {
                if ( !file_exists( $path ) ) {
                        $this->output( "missing file: $path\n" );
                        $this->killRow( $orig );
+
                        return;
                }
 
@@ -150,7 +155,7 @@ class ImageCleanup extends TableCleanup {
                $version = 0;
                $final = $new;
                $conflict = ( $this->imageExists( $final, $db ) ||
-                               ( $this->pageExists( $orig, $db ) && $this->pageExists( $final, $db ) ) );
+                       ( $this->pageExists( $orig, $db ) && $this->pageExists( $final, $db ) ) );
 
                while ( $conflict ) {
                        $this->output( "Rename conflicts with '$final'...\n" );
@@ -184,6 +189,7 @@ class ImageCleanup extends TableCleanup {
                                if ( !wfMkdirParents( $dir, null, __METHOD__ ) ) {
                                        $this->output( "RENAME FAILED, COULD NOT CREATE $dir" );
                                        $db->rollback( __METHOD__ );
+
                                        return;
                                }
                        }
@@ -210,6 +216,7 @@ class ImageCleanup extends TableCleanup {
                $test = Title::makeTitleSafe( NS_FILE, $x );
                if ( is_null( $test ) || $test->getDBkey() !== $x ) {
                        $this->error( "Unable to generate safe title from '$name', got '$x'" );
+
                        return false;
                }
 
index 8551f8f..f4a5147 100644 (file)
@@ -101,6 +101,7 @@ class CleanupSpam extends Maintenance {
                $title = Title::newFromID( $id );
                if ( !$title ) {
                        $this->error( "Internal error: no page for ID $id" );
+
                        return;
                }
 
@@ -109,7 +110,8 @@ class CleanupSpam extends Maintenance {
                $currentRevId = $rev->getId();
 
                while ( $rev && ( $rev->isDeleted( Revision::DELETED_TEXT )
-                                               || LinkFilter::matchEntry( $rev->getContent( Revision::RAW ), $domain ) ) ) {
+                       || LinkFilter::matchEntry( $rev->getContent( Revision::RAW ), $domain ) )
+               ) {
                        $rev = $rev->getPrevious();
                }
 
index 22fd05f..eb7d7b1 100644 (file)
@@ -69,6 +69,7 @@ class WatchlistCleanup extends TableCleanup {
                                . "({$row->wl_namespace}, \"{$row->wl_title}\")\n" );
                        $updated = $this->removeWatch( $row );
                        $this->progress( $updated );
+
                        return;
                }
                $this->progress( 0 );
@@ -77,12 +78,16 @@ class WatchlistCleanup extends TableCleanup {
        private function removeWatch( $row ) {
                if ( !$this->dryrun && $this->hasOption( 'fix' ) ) {
                        $dbw = wfGetDB( DB_MASTER );
-                       $dbw->delete( 'watchlist', array(
+                       $dbw->delete(
+                               'watchlist', array(
                                'wl_user' => $row->wl_user,
                                'wl_namespace' => $row->wl_namespace,
                                'wl_title' => $row->wl_title ),
-                       __METHOD__ );
+                               __METHOD__
+                       );
+
                        $this->output( "- removed\n" );
+
                        return 1;
                } else {
                        return 0;
index 3929a5b..e67c439 100644 (file)
@@ -116,6 +116,7 @@ class CompareParsers extends DumpIterator {
                if ( !$this->stripParametersEnabled ) {
                        return $text;
                }
+
                return preg_replace( '/(<a) [^>]+>/', '$1>', $text );
        }
 
@@ -179,10 +180,9 @@ class CompareParsers extends DumpIterator {
                /* Look for the parser in a file appropiately named in the current folder */
                if ( !class_exists( $parserName ) && file_exists( "$parserName.php" ) ) {
                        global $wgAutoloadClasses;
-                       $wgAutoloadClasses[ $parserName ] = realpath( '.' ) . "/$parserName.php";
+                       $wgAutoloadClasses[$parserName] = realpath( '.' ) . "/$parserName.php";
                }
        }
-
 }
 
 $maintClass = "CompareParsers";
index 6840a01..11a81eb 100644 (file)
@@ -71,6 +71,7 @@ class ConvertLinks extends Maintenance {
                $type = $dbw->getType();
                if ( $type != 'mysql' ) {
                        $this->output( "Link table conversion not necessary for $type\n" );
+
                        return;
                }
 
@@ -111,12 +112,14 @@ class ConvertLinks extends Maintenance {
 
                if ( $dbw->tableExists( 'pagelinks' ) ) {
                        $this->output( "...have pagelinks; skipping old links table updates\n" );
+
                        return;
                }
 
                $res = $dbw->query( "SELECT l_from FROM $links LIMIT 1" );
                if ( $dbw->fieldType( $res, 0 ) == "int" ) {
                        $this->output( "Schema already converted\n" );
+
                        return;
                }
 
@@ -131,7 +134,7 @@ class ConvertLinks extends Maintenance {
                } else {
                        $fh = false;
                        if ( $this->logPerformance ) {
-                               $fh = fopen ( $perfLogFilename, "w" );
+                               $fh = fopen( $perfLogFilename, "w" );
                                if ( !$fh ) {
                                        $this->error( "Couldn't open $perfLogFilename" );
                                        $this->logPerformance = false;
@@ -140,8 +143,8 @@ class ConvertLinks extends Maintenance {
                        $baseTime = $startTime = $this->getMicroTime();
                        # Create a title -> cur_id map
                        $this->output( "Loading IDs from $cur table...\n" );
-                       $this->performanceLog ( $fh, "Reading $numRows rows from cur table...\n" );
-                       $this->performanceLog ( $fh, "rows read vs seconds elapsed:\n" );
+                       $this->performanceLog( $fh, "Reading $numRows rows from cur table...\n" );
+                       $this->performanceLog( $fh, "rows read vs seconds elapsed:\n" );
 
                        $dbw->bufferResults( false );
                        $res = $dbw->query( "SELECT cur_namespace,cur_title,cur_id FROM $cur" );
@@ -239,7 +242,7 @@ class ConvertLinks extends Maintenance {
                                "Total execution time: " . ( $this->getMicroTime() - $startTime ) . " seconds.\n"
                        );
                        if ( $this->logPerformance ) {
-                               fclose ( $fh );
+                               fclose( $fh );
                        }
                }
                # --------------------------------------------------------------------
@@ -268,6 +271,7 @@ class ConvertLinks extends Maintenance {
 
                if ( !( $dbConn->isOpen() ) ) {
                        $this->output( "Opening connection to database failed.\n" );
+
                        return;
                }
                $links_temp = $dbConn->tableName( 'links_temp' );
@@ -279,14 +283,14 @@ class ConvertLinks extends Maintenance {
                $this->output( "Creating temporary links table..." );
                if ( $this->hasOption( 'noKeys' ) ) {
                        $dbConn->query( "CREATE TABLE $links_temp ( " .
-                       "l_from int(8) unsigned NOT NULL default '0', " .
-                       "l_to int(8) unsigned NOT NULL default '0')" );
+                               "l_from int(8) unsigned NOT NULL default '0', " .
+                               "l_to int(8) unsigned NOT NULL default '0')" );
                } else {
                        $dbConn->query( "CREATE TABLE $links_temp ( " .
-                       "l_from int(8) unsigned NOT NULL default '0', " .
-                       "l_to int(8) unsigned NOT NULL default '0', " .
-                       "UNIQUE KEY l_from(l_from,l_to), " .
-                       "KEY (l_to))" );
+                               "l_from int(8) unsigned NOT NULL default '0', " .
+                               "l_to int(8) unsigned NOT NULL default '0', " .
+                               "UNIQUE KEY l_from(l_from,l_to), " .
+                               "KEY (l_to))" );
                }
                $this->output( " done.\n\n" );
        }
@@ -299,6 +303,7 @@ class ConvertLinks extends Maintenance {
 
        private function getMicroTime() { # return time in seconds, with microsecond accuracy
                list( $usec, $sec ) = explode( " ", microtime() );
+
                return ( (float)$usec + (float)$sec );
        }
 }
index 24be2b4..bf57244 100644 (file)
@@ -46,6 +46,7 @@ class ConvertUserOptions extends Maintenance {
 
                if ( !$dbw->fieldExists( 'user', 'user_options', __METHOD__ ) ) {
                        $this->output( "nothing to migrate. " );
+
                        return;
                }
                while ( $id !== null ) {
index 86e47af..9ed63c3 100644 (file)
@@ -373,6 +373,7 @@ class CopyFileBackend extends Maintenance {
                        $same = ( $src->getFileSha1Base36( array( 'src' => $sPath, 'latest' => 1 ) )
                                === $dst->getFileSha1Base36( array( 'src' => $dPath, 'latest' => 1 ) ) );
                }
+
                return $same;
        }
 }
index c5a7827..a9c9547 100644 (file)
@@ -89,6 +89,7 @@ class CopyJobQueue extends Maintenance {
                        $totalOK += count( $batch );
                        $dst->waitForBackups();
                }
+
                return array( $total, $totalOK );
        }
 }
index a8de640..79f7254 100644 (file)
@@ -76,6 +76,7 @@ class CreateAndPromote extends Maintenance {
 
                if ( $exists && !$password && count( $promotions ) === 0 ) {
                        $this->output( "Account exists and nothing to do.\n" );
+
                        return;
                } elseif ( count( $promotions ) !== 0 ) {
                        $promoText = "User:{$username} into " . implode( ', ', $promotions ) . "...\n";
index d58e9a4..33da666 100644 (file)
@@ -49,9 +49,13 @@ class DeleteArchivedFilesImplementation {
                                $sha1 = LocalRepo::getHashFromKey( $key );
                        }
                        // Check if the file is used anywhere...
-                       $inuse = $dbw->selectField( 'oldimage', '1',
-                               array( 'oi_sha1' => $sha1,
-                               'oi_deleted & ' . File::DELETED_FILE => File::DELETED_FILE ),
+                       $inuse = $dbw->selectField(
+                               'oldimage',
+                               '1',
+                               array(
+                                       'oi_sha1' => $sha1,
+                                       'oi_deleted & ' . File::DELETED_FILE => File::DELETED_FILE
+                               ),
                                __METHOD__,
                                array( 'FOR UPDATE' )
                        );
index ad7b54d..286b1f2 100644 (file)
@@ -47,6 +47,7 @@ class DeleteArchivedFiles extends Maintenance {
        public function execute() {
                if ( !$this->hasOption( 'delete' ) ) {
                        $this->output( "Use --delete to actually confirm this script\n" );
+
                        return;
                }
                $force = $this->hasOption( 'force' );
index 62465ab..ed620ee 100644 (file)
@@ -30,7 +30,6 @@ class DeleteArchivedRevisionsImplementation {
 
        /**
         * Perform the delete on archived revisions.
-
         * @param object $maint An object (typically of class Maintenance)
         * that implements two methods: handleOutput() and
         * purgeRedundantText().  See Maintenance for a description of
index b21d950..a751396 100644 (file)
@@ -3,11 +3,11 @@
  * Deletes a batch of pages.
  * Usage: php deleteBatch.php [-u <user>] [-r <reason>] [-i <interval>] [listfile]
  * where
- *     [listfile] is a file where each line contains the title of a page to be
- *             deleted, standard input is used if listfile is not given.
- *     <user> is the username
- *     <reason> is the delete reason
- *     <interval> is the number of seconds to sleep for after each delete
+ *   [listfile] is a file where each line contains the title of a page to be
+ *     deleted, standard input is used if listfile is not given.
+ *   <user> is the username
+ *   <reason> is the delete reason
+ *   <interval> is the number of seconds to sleep for after each delete
  *
  * 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
index 7d8c80e..5aeeb8e 100644 (file)
@@ -34,7 +34,7 @@ class DeleteDefaultMessages extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Deletes all pages in the MediaWiki namespace" .
-                                                               " which were last edited by \"MediaWiki default\"";
+                       " which were last edited by \"MediaWiki default\"";
        }
 
        public function execute() {
@@ -54,6 +54,7 @@ class DeleteDefaultMessages extends Maintenance {
                if ( $dbr->numRows( $res ) == 0 ) {
                        # No more messages left
                        $this->output( "done.\n" );
+
                        return;
                }
 
index 8175891..c30a86e 100644 (file)
@@ -130,6 +130,7 @@ class DeleteEqualMessages extends Maintenance {
                if ( $messageInfo['equalPages'] === 0 ) {
                        // No more equal messages left
                        $this->output( "\ndone.\n" );
+
                        return;
                }
 
@@ -151,6 +152,7 @@ class DeleteEqualMessages extends Maintenance {
                                $this->output( " (include --delete-talk to also delete the talk pages)" );
                        }
                        $this->output( "\n" );
+
                        return;
                }
 
index b44a424..4799e5e 100644 (file)
@@ -80,6 +80,7 @@ class DeleteImageCache extends Maintenance {
 
        private function getImageCount() {
                $dbr = wfGetDB( DB_SLAVE );
+
                return $dbr->selectField( 'image', 'COUNT(*)', array(), __METHOD__ );
        }
 }
index 31f206d..818ee36 100644 (file)
@@ -42,29 +42,31 @@ class DeleteRevision extends Maintenance {
                }
 
                $this->output( "Deleting revision(s) " . implode( ',', $this->mArgs ) .
-                                               " from " . wfWikiID() . "...\n" );
+                       " from " . wfWikiID() . "...\n" );
                $dbw = wfGetDB( DB_MASTER );
 
                $affected = 0;
                foreach ( $this->mArgs as $revID ) {
                        $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
                                array(
-                                       'ar_namespace'  => 'page_namespace',
-                                       'ar_title'      => 'page_title',
-                                       'ar_page_id'    => 'page_id',
-                                       'ar_comment'    => 'rev_comment',
-                                       'ar_user'       => 'rev_user',
-                                       'ar_user_text'  => 'rev_user_text',
-                                       'ar_timestamp'  => 'rev_timestamp',
+                                       'ar_namespace' => 'page_namespace',
+                                       'ar_title' => 'page_title',
+                                       'ar_page_id' => 'page_id',
+                                       'ar_comment' => 'rev_comment',
+                                       'ar_user' => 'rev_user',
+                                       'ar_user_text' => 'rev_user_text',
+                                       'ar_timestamp' => 'rev_timestamp',
                                        'ar_minor_edit' => 'rev_minor_edit',
-                                       'ar_rev_id'     => 'rev_id',
-                                       'ar_text_id'    => 'rev_text_id',
-                                       'ar_deleted'    => 'rev_deleted',
-                                       'ar_len'        => 'rev_len',
-                               ), array(
+                                       'ar_rev_id' => 'rev_id',
+                                       'ar_text_id' => 'rev_text_id',
+                                       'ar_deleted' => 'rev_deleted',
+                                       'ar_len' => 'rev_len',
+                               ),
+                               array(
                                        'rev_id' => $revID,
                                        'page_id = rev_page'
-                               ), __METHOD__
+                               ),
+                               __METHOD__
                        );
                        if ( !$dbw->affectedRows() ) {
                                $this->output( "Revision $revID not found\n" );
index a3cc0ba..246d6fc 100644 (file)
@@ -59,6 +59,7 @@ if ( $ext == 'php' || $ext == 'php5' ) {
        # the php webserver will discard post data and things like login
        # will not function in the dev environment.
        require $file;
+
        return true;
 }
 $mime = false;
@@ -93,6 +94,7 @@ if ( $mime ) {
        header( "Content-Length: " . filesize( $file ) );
        // Stream that out to the browser
        fpassthru( $f );
+
        return true;
 }
 
index 02bfd60..18c78dc 100644 (file)
@@ -127,5 +127,5 @@ Fancy stuff: (Works? Add examples please.)
   --filter=<type>[:<options>] Add a filter on an output branch
 
 ENDS
-);
+       );
 }
index 078c598..4b2ff71 100644 (file)
@@ -123,6 +123,7 @@ abstract class DumpIterator extends Maintenance {
                $title = $rev->getTitle();
                if ( !$title ) {
                        $this->error( "Got bogus revision with null title!" );
+
                        return;
                }
 
index 71895bd..7c17607 100644 (file)
@@ -61,5 +61,5 @@ Options:
   --spawn        Spawn a subprocess for loading text records
   --help      Display this help message
 ENDS
-);
+       );
 }
index d6c70f8..9d53f07 100644 (file)
@@ -64,7 +64,7 @@ By default, outputs relative paths against the parent directory of \$wgUploadDir
                                $this->mSharedSupplement = true;
                        }
                }
-               $this->{ $this->mAction } ( $this->mShared );
+               $this->{$this->mAction} ( $this->mShared );
                if ( $this->mSharedSupplement ) {
                        $this->fetchUsed( true );
                }
index df5a208..fc676b8 100644 (file)
@@ -37,11 +37,11 @@ class FetchText extends Maintenance {
 
        /**
         * returns a string containing the following in order:
-        *       textid
-        *       \n
-        *       length of text (-1 on error = failure to retrieve/unserialize/gunzip/etc)
-        *       \n
-        *       text  (may be empty)
+        *   textid
+        *   \n
+        *   length of text (-1 on error = failure to retrieve/unserialize/gunzip/etc)
+        *   \n
+        *   text  (may be empty)
         *
         * note that that the text string itself is *not* followed by newline
         */
@@ -59,8 +59,7 @@ class FetchText extends Maintenance {
                        if ( $text === false ) {
                                # actual error, not zero-length text
                                $textLen = "-1";
-                       }
-                       else {
+                       } else {
                                $textLen = strlen( $text );
                        }
                        $this->output( $textId . "\n" . $textLen . "\n" . $text );
@@ -83,6 +82,7 @@ class FetchText extends Maintenance {
                if ( $text === false ) {
                        return false;
                }
+
                return $text;
        }
 }
index 7c6c824..86c01f4 100644 (file)
@@ -146,10 +146,11 @@ class FindHooks extends Maintenance {
         * @return array Array of documented hooks
         */
        private function getHooksFromLocalDoc( $doc ) {
-                       $m = array();
-                       $content = file_get_contents( $doc );
-                       preg_match_all( "/\n'(.*?)':/", $content, $m );
-                       return array_unique( $m[1] );
+               $m = array();
+               $content = file_get_contents( $doc );
+               preg_match_all( "/\n'(.*?)':/", $content, $m );
+
+               return array_unique( $m[1] );
        }
 
        /**
@@ -157,35 +158,36 @@ class FindHooks extends Maintenance {
         * @return array of documented hooks
         */
        private function getHooksFromOnlineDoc() {
-                       // All hooks
-                       $allhookdata = Http::get(
-                               'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&'
-                                       . 'cmtitle=Category:MediaWiki_hooks&cmlimit=500&format=php'
-                       );
-                       $allhookdata = unserialize( $allhookdata );
-                       $allhooks = array();
-                       foreach ( $allhookdata['query']['categorymembers'] as $page ) {
-                               $found = preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $matches );
-                               if ( $found ) {
-                                       $hook = str_replace( ' ', '_', $matches[1] );
-                                       $allhooks[] = $hook;
-                               }
+               // All hooks
+               $allhookdata = Http::get(
+                       'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&'
+                       . 'cmtitle=Category:MediaWiki_hooks&cmlimit=500&format=php'
+               );
+               $allhookdata = unserialize( $allhookdata );
+               $allhooks = array();
+               foreach ( $allhookdata['query']['categorymembers'] as $page ) {
+                       $found = preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $matches );
+                       if ( $found ) {
+                               $hook = str_replace( ' ', '_', $matches[1] );
+                               $allhooks[] = $hook;
                        }
-                       // Removed hooks
-                       $oldhookdata = Http::get(
-                               'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&'
-                                       . 'cmtitle=Category:Removed_hooks&cmlimit=500&format=php'
-                       );
-                       $oldhookdata = unserialize( $oldhookdata );
-                       $removed = array();
-                       foreach ( $oldhookdata['query']['categorymembers'] as $page ) {
-                               $found = preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $matches );
-                               if ( $found ) {
-                                       $hook = str_replace( ' ', '_', $matches[1] );
-                                       $removed[] = $hook;
-                               }
+               }
+               // Removed hooks
+               $oldhookdata = Http::get(
+                       'http://www.mediawiki.org/w/api.php?action=query&list=categorymembers&'
+                       . 'cmtitle=Category:Removed_hooks&cmlimit=500&format=php'
+               );
+               $oldhookdata = unserialize( $oldhookdata );
+               $removed = array();
+               foreach ( $oldhookdata['query']['categorymembers'] as $page ) {
+                       $found = preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $matches );
+                       if ( $found ) {
+                               $hook = str_replace( ' ', '_', $matches[1] );
+                               $removed[] = $hook;
                        }
-                       return array_diff( $allhooks, $removed );
+               }
+
+               return array_diff( $allhooks, $removed );
        }
 
        /**
@@ -221,6 +223,7 @@ class FindHooks extends Maintenance {
                        }
                        closedir( $dh );
                }
+
                return $hooks;
        }
 
@@ -238,6 +241,7 @@ class FindHooks extends Maintenance {
                foreach ( $m[0] as $match ) {
                        $list[] = $match . "(" . $file . ")";
                }
+
                return $list;
        }
 
@@ -258,6 +262,7 @@ class FindHooks extends Maintenance {
                        }
                        closedir( $dh );
                }
+
                return $hooks;
        }
 
index af8a58e..0b3cdba 100644 (file)
@@ -85,6 +85,7 @@ class FixDoubleRedirects extends Maintenance {
 
                if ( !$res->numRows() ) {
                        $this->output( "No double redirects found.\n" );
+
                        return;
                }
 
index 920b2b0..0c60e62 100644 (file)
@@ -50,6 +50,7 @@ class FixExtLinksProtocolRelative extends LoggedUpdateMaintenance {
                $db = wfGetDB( DB_MASTER );
                if ( !$db->tableExists( 'externallinks' ) ) {
                        $this->error( "externallinks table does not exist" );
+
                        return false;
                }
                $this->output( "Fixing protocol-relative entries in the externallinks table...\n" );
@@ -91,6 +92,7 @@ class FixExtLinksProtocolRelative extends LoggedUpdateMaintenance {
                        );
                }
                $this->output( "Done, $count rows updated.\n" );
+
                return true;
        }
 }
index cbb2e9d..a5418ce 100644 (file)
@@ -101,6 +101,7 @@ class FixSlaveDesync extends Maintenance {
                        }
                }
                $this->output( "\n" );
+
                return $desync;
        }
 
@@ -136,6 +137,7 @@ class FixSlaveDesync extends Maintenance {
                if ( !$found ) {
                        $this->output( "page_id $pageID seems fine\n" );
                        $dbw->commit( __METHOD__ );
+
                        return;
                }
 
index f96a917..5431cf2 100644 (file)
@@ -85,11 +85,11 @@ class FixTimestamps extends Maintenance {
                        if ( $sign == 0 || $sign == $expectedSign ) {
                                // Monotonic change
                                $lastNormal = $timestamp;
-                               ++ $numGoodRevs;
+                               ++$numGoodRevs;
                                continue;
                        } elseif ( abs( $delta ) <= $grace ) {
                                // Non-monotonic change within grace interval
-                               ++ $numGoodRevs;
+                               ++$numGoodRevs;
                                continue;
                        } else {
                                // Non-monotonic change larger than grace interval
@@ -100,7 +100,7 @@ class FixTimestamps extends Maintenance {
                $numBadRevs = count( $badRevs );
                if ( $numBadRevs > $numGoodRevs ) {
                        $this->error(
-               "The majority of revisions in the search interval are marked as bad.
+                               "The majority of revisions in the search interval are marked as bad.
 
                Are you sure the offset ($offset) has the right sign? Positive means the clock
                was incorrectly set forward, negative means the clock was incorrectly set back.
index 6c4ff20..7fe3bd9 100644 (file)
@@ -50,6 +50,7 @@ class GenerateJsonI18n extends Maintenance {
 
                if ( $this->hasOption( 'shim-only' ) ) {
                        $this->shimOnly( $phpfile, $jsondir );
+
                        return;
                }
 
@@ -184,6 +185,7 @@ PHP;
                $jsondir = str_replace( '\\', '/', $jsondir );
                $shim = str_replace( '{{OUT}}', $jsondir, $shim );
                $shim = str_replace( '{{FUNC}}', 'wfJsonI18nShim' . wfRandomString( 16 ), $shim );
+
                return $shim;
        }
 
@@ -216,6 +218,7 @@ PHP;
        protected function getAuthorsFromComment( $comment ) {
                $matches = null;
                preg_match_all( '/@author (.*?)$/m', $comment, $matches );
+
                return $matches && $matches[1] ? $matches[1] : array();
        }
 }
index b5681c1..c43851e 100644 (file)
@@ -263,6 +263,7 @@ class GenerateSitemap extends Maintenance {
                global $wgSitemapNamespaces;
                if ( is_array( $wgSitemapNamespaces ) ) {
                        $this->namespaces = $wgSitemapNamespaces;
+
                        return;
                }
 
@@ -343,7 +344,7 @@ class GenerateSitemap extends Maintenance {
 
                        $fns = $wgContLang->getFormattedNsText( $namespace );
                        $this->output( "$namespace ($fns)\n" );
-                       $skippedRedirects = 0;  // Number of redirects skipped for that namespace
+                       $skippedRedirects = 0; // Number of redirects skipped for that namespace
                        foreach ( $res as $row ) {
                                if ( $this->skipRedirects && $row->page_is_redirect ) {
                                        $skippedRedirects++;
@@ -415,6 +416,7 @@ class GenerateSitemap extends Maintenance {
                        throw new MWException( __METHOD__
                                . " error opening file $file with flags $flags. Check permissions?" );
                }
+
                return $resource;
        }
 
@@ -457,6 +459,7 @@ class GenerateSitemap extends Maintenance {
         */
        function sitemapFilename( $namespace, $count ) {
                $ext = $this->compress ? '.gz' : '';
+
                return "sitemap-{$this->identifier}-NS_$namespace-$count.xml$ext";
        }
 
index 52cb209..1db53f3 100644 (file)
@@ -63,7 +63,7 @@ class GetConfiguration extends Maintenance {
                $format = strtolower( $this->getOption( 'format', 'PHP' ) );
 
                $validFormat = in_array( $format, self::$outFormats );
-               if ( ! $validFormat ) {
+               if ( !$validFormat ) {
                        $this->error( "--format set to an unrecognized format", 0 );
                        $error_out = true;
                }
@@ -87,11 +87,11 @@ class GetConfiguration extends Maintenance {
        public function finalSetup() {
                parent::finalSetup();
 
-               $this->regex = $this->getOption( 'regex' ) ?: $this->getOption( 'iregex' );
+               $this->regex = $this->getOption( 'regex' ) ? : $this->getOption( 'iregex' );
                if ( $this->regex ) {
                        $this->regex = '/' . $this->regex . '/';
                        if ( $this->hasOption( 'iregex' ) ) {
-                               $this->regex .= 'i';  # case insensitive regex
+                               $this->regex .= 'i'; # case insensitive regex
                        }
                }
 
@@ -115,7 +115,7 @@ class GetConfiguration extends Maintenance {
                $res = array();
 
                # Sane default: dump any wg / wmg variable
-               if ( ! $this->regex && ! $this->getOption( 'settings' ) ) {
+               if ( !$this->regex && !$this->getOption( 'settings' ) ) {
                        $this->regex = '/^wm?g/';
                }
 
@@ -165,7 +165,7 @@ class GetConfiguration extends Maintenance {
        protected function formatVarDump( $res ) {
                $ret = '';
                foreach ( $res as $key => $value ) {
-                       ob_start();  # intercept var_dump() output
+                       ob_start(); # intercept var_dump() output
                        print "\${$key} = ";
                        var_dump( $value );
                        # grab var_dump() output and discard it from the output buffer
@@ -182,10 +182,12 @@ class GetConfiguration extends Maintenance {
                                        return false;
                                }
                        }
+
                        return true;
                } elseif ( is_scalar( $value ) ) {
                        return true;
                }
+
                return false;
        }
 }
index d618825..68c1943 100644 (file)
@@ -34,6 +34,7 @@ class GetSlaveServer extends Maintenance {
                $this->addOption( "group", "Query group to check specifically" );
                $this->mDescription = "Report the hostname of a slave server";
        }
+
        public function execute() {
                global $wgAllDBsAreLocalhost;
                if ( $wgAllDBsAreLocalhost ) {
index 88e7120..1f7cbf5 100644 (file)
@@ -111,6 +111,7 @@ TEXT;
        function setNsfilter( array $namespaces ) {
                if ( count( $namespaces ) == 0 ) {
                        $this->nsFilter = false;
+
                        return;
                }
                $this->nsFilter = array_unique( array_map( array( $this, 'getNsIndex' ), $namespaces ) );
@@ -143,6 +144,7 @@ TEXT;
                        echo wfBacktrace();
                        $this->error( "Cannot get namespace of object in " . __METHOD__, true );
                }
+
                return is_array( $this->nsFilter ) && !in_array( $ns, $this->nsFilter );
        }
 
@@ -157,6 +159,7 @@ TEXT;
                $title = $rev->getTitle();
                if ( !$title ) {
                        $this->progress( "Got bogus revision with null title!" );
+
                        return;
                }
 
@@ -189,6 +192,7 @@ TEXT;
                                // bluuuh hack
                                // call_user_func( $this->uploadCallback, $revision );
                                $dbw = wfGetDB( DB_MASTER );
+
                                return $dbw->deadlockLoop( array( $revision, 'importUpload' ) );
                        }
                }
@@ -248,6 +252,7 @@ TEXT;
                }
 
                $file = fopen( $filename, 'rt' );
+
                return $this->importFromHandle( $file );
        }
 
@@ -256,6 +261,7 @@ TEXT;
                if ( self::posix_isatty( $file ) ) {
                        $this->maybeHelp( true );
                }
+
                return $this->importFromHandle( $file );
        }
 
index 7caedea..b803e3d 100644 (file)
@@ -46,6 +46,7 @@ function findFiles( $dir, $exts, $recurse = false ) {
                                        $files = array_merge( $files, findFiles( $dir . '/' . $file, $exts, true ) );
                                }
                        }
+
                        return $files;
                } else {
                        return array();
@@ -63,9 +64,10 @@ function findFiles( $dir, $exts, $recurse = false ) {
  */
 function splitFilename( $filename ) {
        $parts = explode( '.', $filename );
-       $ext = $parts[ count( $parts ) - 1 ];
-       unset( $parts[ count( $parts ) - 1 ] );
+       $ext = $parts[count( $parts ) - 1];
+       unset( $parts[count( $parts ) - 1] );
        $fname = implode( '.', $parts );
+
        return array( $fname, $ext );
 }
 
index ba77354..3dd4a9e 100644 (file)
@@ -290,25 +290,24 @@ if ( $count > 0 ) {
                        }
 
                        if ( $doProtect ) {
-                                       # Protect the file
-                                       echo "\nWaiting for slaves...\n";
-                                       // Wait for slaves.
-                                       sleep( 2.0 ); # Why this sleep?
-                                       wfWaitForSlaves();
-
-                                       echo "\nSetting image restrictions ... ";
-
-                                       $cascade = false;
-                                       $restrictions = array();
-                                       foreach ( $title->getRestrictionTypes() as $type ) {
-                                               $restrictions[$type] = $protectLevel;
-                                       }
+                               # Protect the file
+                               echo "\nWaiting for slaves...\n";
+                               // Wait for slaves.
+                               sleep( 2.0 ); # Why this sleep?
+                               wfWaitForSlaves();
+
+                               echo "\nSetting image restrictions ... ";
+
+                               $cascade = false;
+                               $restrictions = array();
+                               foreach ( $title->getRestrictionTypes() as $type ) {
+                                       $restrictions[$type] = $protectLevel;
+                               }
 
-                                       $page = WikiPage::factory( $title );
-                                       $status = $page->doUpdateRestrictions( $restrictions, array(), $cascade, '', $user );
-                                       echo ( $status->isOK() ? 'done' : 'failed' ) . "\n";
+                               $page = WikiPage::factory( $title );
+                               $status = $page->doUpdateRestrictions( $restrictions, array(), $cascade, '', $user );
+                               echo ( $status->isOK() ? 'done' : 'failed' ) . "\n";
                        }
-
                } else {
                        echo "failed. (at recordUpload stage)\n";
                        $svar = 'failed';
@@ -328,14 +327,21 @@ if ( $count > 0 ) {
 
        # Print out some statistics
        echo "\n";
-       foreach ( array( 'count' => 'Found', 'limit' => 'Limit', 'ignored' => 'Ignored',
-               'added' => 'Added', 'skipped' => 'Skipped', 'overwritten' => 'Overwritten',
-               'failed' => 'Failed' ) as $var => $desc ) {
+       foreach (
+               array(
+                       'count' => 'Found',
+                       'limit' => 'Limit',
+                       'ignored' => 'Ignored',
+                       'added' => 'Added',
+                       'skipped' => 'Skipped',
+                       'overwritten' => 'Overwritten',
+                       'failed' => 'Failed'
+               ) as $var => $desc
+       ) {
                if ( $$var > 0 ) {
                        echo "{$desc}: {$$var}\n";
                }
        }
-
 } else {
        echo "No suitable files could be found for import.\n";
 }
index fd768b3..7705ec9 100644 (file)
@@ -65,13 +65,12 @@ class ImportSiteScripts extends Maintenance {
                        $content = ContentHandler::makeContent( $text, $wikiPage->getTitle() );
                        $wikiPage->doEditContent( $content, "Importing from $url", 0, false, $user );
                }
-
        }
 
        protected function fetchScriptList() {
                $data = array(
                        'action' => 'query',
-                       'format' => 'php',//'json',
+                       'format' => 'php', //'json',
                        'list' => 'allpages',
                        'apnamespace' => '8',
                        'aplimit' => '500',
@@ -100,7 +99,6 @@ class ImportSiteScripts extends Maintenance {
                } while ( isset( $result['query-continue'] ) );
 
                return $pages;
-
        }
 }
 
index c7df6c3..f73dd1c 100644 (file)
@@ -60,33 +60,29 @@ if ( count( $args ) < 1 || isset( $options['help'] ) ) {
                                        $content = ContentHandler::makeContent( $text, $title );
                                        $page->doEditContent( $content, $comment, $flags, false, $user );
                                        echo "done.\n";
-
                                } else {
                                        echo "invalid username.\n";
                                }
-
                        } else {
                                echo "page exists.\n";
                        }
-
                } else {
                        echo "invalid title.\n";
                }
-
        } else {
                echo "does not exist.\n";
        }
-
 }
 
 function titleFromFilename( $filename ) {
        $parts = explode( '/', $filename );
-       $parts = explode( '.', $parts[ count( $parts ) - 1 ] );
+       $parts = explode( '.', $parts[count( $parts ) - 1] );
+
        return $parts[0];
 }
 
 function showHelp() {
-print <<<EOF
+       print <<<EOF
 USAGE: php importTextFile.php <options> <filename>
 
 <filename> : Path to the file containing page content to import
index 6fc4782..20d6ad5 100644 (file)
@@ -133,6 +133,7 @@ class CommandLineInstaller extends Maintenance {
                        $installer->showMessage( 'config-env-good' );
                } else {
                        $installer->showStatusMessage( $status );
+
                        return;
                }
                if ( !$this->hasOption( 'env-checks' ) ) {
diff --git a/maintenance/jsduck/MetaTags.rb b/maintenance/jsduck/MetaTags.rb
deleted file mode 100644 (file)
index cde7d3b..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-# Custom tags for JSDuck 4.x
-# See also:
-# - https://github.com/senchalabs/jsduck/wiki/Tags
-# - https://github.com/senchalabs/jsduck/wiki/Custom-tags
-# - https://github.com/senchalabs/jsduck/wiki/Custom-tags/7f5c32e568eab9edc8e3365e935bcb836cb11f1d
-require 'jsduck/meta_tag'
-
-class SourceTag < JsDuck::MetaTag
-  def initialize
-    # This defines the name of the @tag
-    @name = 'source'
-  end
-
-  # Generate HTML output for this tag.
-  # One can make use of the #format method to easily support
-  # Markdown and {@link} tags inside the contents of the tag.
-  #
-  # @param tags All matches of this tag on one class.
-  def to_html(tags)
-    '<h3 class="pa">Source</h3>' + tags.map {|tag| format(tag) }.join("\n")
-  end
-end
-
-class ContextTag < JsDuck::MetaTag
-  def initialize
-    @name = 'context'
-  end
-
-  # @param tags All matches of this tag on one class.
-  def to_html(tags)
-    return '<h3 class="pa">Context</h3>' +  render_long_context(tags.last)
-  end
-
-  def render_long_context(tag)
-    if tag =~ /\A([^\s]+)/m
-      name = $1
-      return format("`this` : {@link #{name}}")
-    end
-  end
-end
-
-class SeeTag < JsDuck::MetaTag
-  def initialize
-    @name = 'see'
-    @multiline = true
-  end
-
-  # @param tags All matches of this tag on one class.
-  def to_html(tags)
-    doc = []
-    doc << '<h3 class="pa">Related</h3>'
-    doc << [
-        '<ul>',
-        tags.map {|tag| render_long_see(tag) },
-        '</ul>',
-      ]
-    doc
-  end
-
-  def render_long_see(tag)
-    if tag =~ /\A([^\s]+)( .*)?\Z/m
-      name = $1
-      doc = $2 ? ': ' + $2 : ''
-      return [
-        '<li>',
-        format("{@link #{name}} #{doc}"),
-        '</li>'
-      ]
-    end
-  end
-end
-
-# As of JSDuck 5 this is in core
-class FiresTag < JsDuck::MetaTag
-  def initialize
-    @name = 'fires'
-    @multiline = true
-  end
-
-  # @param tags All matches of this tag on one class.
-  def to_html(tags)
-    doc = []
-    doc << '<h3 class="pa">Fires</h3>'
-    doc << [
-        '<ul>',
-        tags.map {|tag| render_long_event(tag) },
-        '</ul>',
-      ]
-    doc
-  end
-
-  def render_long_event(tag)
-    if tag =~ /\A(\w+)( .*)?\Z/m
-      name = $1
-      doc = $2 ? ': ' + $2 : ''
-      return [
-        '<li>',
-        format("{@link #event-#{name}} #{doc}"),
-        '</li>'
-      ]
-    end
-  end
-end
index eaf0a38..2d45645 100644 (file)
                "groups": [
                        {
                                "name": "Plugins",
-                               "classes": ["jQuery.plugin.*"]
+                               "classes": [
+                                       "jQuery.client",
+                                       "jQuery.colorUtil",
+                                       "jQuery.plugin.*"
+                               ]
                        }
                ]
        },
index 493815e..65ead02 100644 (file)
@@ -1,26 +1,37 @@
 {
        "--title": "MediaWiki core - Documentation",
-       "--footer": "Documentation for MediaWiki core. Generated on {DATE} by {JSDUCK} {VERSION}.",
        "--categories": "./categories.json",
        "--eg-iframe": "./eg-iframe.html",
+       "--tags": "./CustomTags.rb",
+       "--warnings": ["-nodoc(class,public)"],
        "--builtin-classes": true,
-       "--output": "../../docs/js",
+       "--warnings-exit-nonzero": true,
        "--external": "HTMLElement,HTMLDocument,Window",
+       "--footer": "Documentation for MediaWiki core. Generated on {DATE} by {JSDUCK} {VERSION}.",
+       "--output": "../../docs/js",
        "--": [
                "./external.js",
                "../../resources/src/mediawiki",
-               "../../resources/src/mediawiki.action/mediawiki.action.edit.js",
-               "../../resources/src/mediawiki.action/mediawiki.action.view.postEdit.js",
-               "../../resources/src/mediawiki.page/mediawiki.page.startup.js",
-               "../../resources/src/mediawiki.page/mediawiki.page.watch.ajax.js",
+               "../../resources/src/mediawiki.action",
+               "../../resources/src/mediawiki.page",
                "../../resources/src/mediawiki.api",
                "../../resources/src/mediawiki.language",
+               "../../resources/src/jquery/jquery.accessKeyLabel.js",
                "../../resources/src/jquery/jquery.arrowSteps.js",
                "../../resources/src/jquery/jquery.autoEllipsis.js",
                "../../resources/src/jquery/jquery.badge.js",
+               "../../resources/src/jquery/jquery.byteLength.js",
                "../../resources/src/jquery/jquery.byteLimit.js",
+               "../../resources/src/jquery/jquery.checkboxShiftClick.js",
+               "../../resources/src/jquery/jquery.client.js",
+               "../../resources/src/jquery/jquery.colorUtil.js",
+               "../../resources/src/jquery/jquery.footHovzer.js",
+               "../../resources/src/jquery/jquery.getAttrs.js",
+               "../../resources/src/jquery/jquery.hidpi.js",
                "../../resources/src/jquery/jquery.localize.js",
+               "../../resources/src/jquery/jquery.makeCollapsible.js",
                "../../resources/src/jquery/jquery.spinner.js",
+               "../../resources/src/jquery/jquery.tabIndex.js",
                "../../resources/lib/oojs",
                "../../resources/lib/oojs-ui"
        ]
index 86eae4b..7dc4afa 100644 (file)
@@ -1,88 +1,88 @@
 <!DOCTYPE html>
 <html>
 <head>
-    <meta charset="utf-8">
-    <title>MediaWiki Code Example</title>
-    <script src="modules/startup.js"></script>
-    <script>
-        function startUp() {
-            mw.config = new mw.Map();
-        }
-    </script>
-    <script src="modules/jquery/jquery.js"></script>
-    <script src="modules/mediawiki/mediawiki.js"></script>
-    <style>
-        .mw-jsduck-log {
-            position: relative;
-            min-height: 3em;
-            margin-top: 2em;
-            background: #f7f7f7;
-            border: 1px solid #e4e4e4;
-        }
+       <meta charset="utf-8">
+       <title>MediaWiki Code Example</title>
+       <script src="modules/startup.js"></script>
+       <script>
+               function startUp() {
+                       mw.config = new mw.Map();
+               }
+       </script>
+       <script src="modules/jquery/jquery.js"></script>
+       <script src="modules/mediawiki/mediawiki.js"></script>
+       <style>
+               .mw-jsduck-log {
+                       position: relative;
+                       min-height: 3em;
+                       margin-top: 2em;
+                       background: #f7f7f7;
+                       border: 1px solid #e4e4e4;
+               }
 
-        .mw-jsduck-log::after {
-            position: absolute;
-            bottom: 100%;
-            right: -1px;
-            padding: 0.5em;
-            background: #fff;
-            border: 1px solid #e4e4e4;
-            border-bottom: 0;
-            border-radius: 0.5em 0.5em 0 0;
-            font: normal 0.5em sans-serif;
-            content: 'console';
-        }
+               .mw-jsduck-log::after {
+                       position: absolute;
+                       bottom: 100%;
+                       right: -1px;
+                       padding: 0.5em;
+                       background: #fff;
+                       border: 1px solid #e4e4e4;
+                       border-bottom: 0;
+                       border-radius: 0.5em 0.5em 0 0;
+                       font: normal 0.5em sans-serif;
+                       content: 'console';
+               }
 
-        .mw-jsduck-log-line {
-            padding: 0.2em 0.5em;
-            white-space: pre-wrap;
-        }
+               .mw-jsduck-log-line {
+                       padding: 0.2em 0.5em;
+                       white-space: pre-wrap;
+               }
 
-        .mw-jsduck-log-line:nth-child(odd) {
-            background: #fff;
-        }
-    </style>
+               .mw-jsduck-log-line:nth-child(odd) {
+                       background: #fff;
+               }
+       </style>
 </head>
 <body>
-    <script>
-        /**
-         * Basic log console for the example iframe in documentation pages.
-         */
-        ( function () {
-            var pre;
-            mw.log = function () {
-                var str, i, len, line;
-                if ( !pre ) {
-                    pre = document.createElement( 'pre' );
-                    pre.className = 'mw-jsduck-log';
-                    document.body.appendChild( pre );
-                }
-                str = [];
-                for ( i = 0, len = arguments.length; i < len; i++ ) {
-                    str.push( String( arguments[ i ] ) );
-                }
-                line = document.createElement( 'div' );
-                line.className = 'mw-jsduck-log-line';
-                line.appendChild(
-                    document.createTextNode( str.join( ' , ' ) + '\n' )
-                );
-                pre.appendChild( line );
-            };
-        }() );
+<script>
+       /**
+        * Basic log console for the example iframe in documentation pages.
+        */
+       ( function () {
+               var pre;
+               mw.log = function () {
+                       var str, i, len, line;
+                       if ( !pre ) {
+                               pre = document.createElement( 'pre' );
+                               pre.className = 'mw-jsduck-log';
+                               document.body.appendChild( pre );
+                       }
+                       str = [];
+                       for ( i = 0, len = arguments.length; i < len; i++ ) {
+                               str.push( String( arguments[ i ] ) );
+                       }
+                       line = document.createElement( 'div' );
+                       line.className = 'mw-jsduck-log-line';
+                       line.appendChild(
+                                       document.createTextNode( str.join( ' , ' ) + '\n' )
+                       );
+                       pre.appendChild( line );
+               };
+       }() );
 
-        /**
-         * Method called by jsduck to execute the example code.
-         */
-        function loadInlineExample( code, options, callback ) {
-            try {
-                eval( code );
-                callback && callback( true );
-            } catch (e) {
-                mw.log( 'Uncaught exception: ' + e );
-                callback && callback( false, e );
-                throw e;
-            }
-        }
-    </script>
+       /**
+        * Method called by jsduck to execute the example code.
+        */
+       function loadInlineExample( code, options, callback ) {
+               try {
+                       eval( code );
+                       callback && callback( true );
+               } catch ( e ) {
+                       mw.log( 'Uncaught exception: ' + e );
+                       callback && callback( false, e );
+                       throw e;
+               }
+       }
+</script>
 </body>
 </html>
index f9390f6..31ce702 100644 (file)
@@ -29,6 +29,7 @@ class StatsOutput {
                wfSuppressWarnings();
                $return = sprintf( '%.' . $accuracy . 'f%%', 100 * $subset / $total );
                wfRestoreWarnings();
+
                return $return;
        }
 
index db6c315..2bb5e6b 100644 (file)
@@ -365,7 +365,7 @@ class UcdXmlReader {
                $xml = $this->open();
                $this->callback = $callback;
 
-               while ( $xml->name !== 'repertoire' && $xml->next() );
+               while ( $xml->name !== 'repertoire' && $xml->next() ) ;
 
                while ( $xml->read() ) {
                        if ( $xml->nodeType == XMLReader::ELEMENT ) {
@@ -389,7 +389,7 @@ class UcdXmlReader {
                if ( !$this->xml ) {
                        throw new MWException( __METHOD__ . ": unable to open {$this->fileName}" );
                }
-               while ( $this->xml->name !== 'ucd' && $this->xml->read() );
+               while ( $this->xml->name !== 'ucd' && $this->xml->read() ) ;
                $this->xml->read();
 
                return $this->xml;
@@ -450,7 +450,7 @@ class UcdXmlReader {
                }
 
                $xml = $this->open();
-               while ( $xml->name !== 'blocks' && $xml->read() );
+               while ( $xml->name !== 'blocks' && $xml->read() ) ;
 
                while ( $xml->read() ) {
                        if ( $xml->nodeType == XMLReader::ELEMENT ) {
index cc7b471..6e5b29d 100644 (file)
@@ -28,7 +28,7 @@ class Languages {
        /** @var array List of languages */
        protected $mLanguages;
 
-       /** @var array Raw list of the messages in each language  */
+       /** @var array Raw list of the messages in each language */
        protected $mRawMessages;
 
        /** @var array Messages in each language (except for English), divided to groups */
index a88d1ba..500d7de 100644 (file)
@@ -264,6 +264,7 @@ $wgMessageStructure = array(
                'jumptonavigation',
                'jumptosearch',
                'view-pool-error',
+               'generic-pool-error',
                'pool-timeout',
                'pool-queuefull',
                'pool-errorunknown',
index 243f97c..da49e55 100644 (file)
@@ -67,7 +67,7 @@ class McTest extends Maintenance {
                foreach ( $servers as $server ) {
                        $this->output(
                                str_pad( $server, $maxSrvLen ),
-                               $server  # output channel
+                               $server # output channel
                        );
 
                        $mcc = new MemCachedClientforWiki( array(
@@ -107,6 +107,7 @@ class McTest extends Maintenance {
         */
        private function microtime_float() {
                list( $usec, $sec ) = explode( " ", microtime() );
+
                return ( (float)$usec + (float)$sec );
        }
 }
index f016a2c..2a6f8a8 100644 (file)
@@ -125,6 +125,7 @@ class MergeMessageFileList extends Maintenance {
                if ( $fileLines === false ) {
                        $this->hasError = true;
                        $this->error( "Unable to open list file $fileName." );
+
                        return $files;
                }
                # Strip comments, discard empty lines, and trim leading and trailing
@@ -142,6 +143,7 @@ class MergeMessageFileList extends Maintenance {
                                }
                        }
                }
+
                return $files;
        }
 }
index ec936c8..efecaad 100644 (file)
@@ -49,7 +49,6 @@ class MinifyScript extends Maintenance {
                $this->mDescription = "Minify a file or set of files.\n\n" .
                        "If --outfile is not specified, then the output file names will have a .min extension\n" .
                        "added, e.g. jquery.js -> jquery.min.js.";
-
        }
 
        public function execute() {
@@ -66,6 +65,7 @@ class MinifyScript extends Maintenance {
 
                        // Minify one file
                        $this->minify( $this->getArg( 0 ), $this->getOption( 'outfile' ) );
+
                        return;
                }
 
@@ -103,6 +103,7 @@ class MinifyScript extends Maintenance {
                        $this->error( "No file extension, cannot determine type: $fileName" );
                        exit( 1 );
                }
+
                return substr( $fileName, $dotPos + 1 );
        }
 
diff --git a/maintenance/mssql/archives/patch-user_password_expires.sql b/maintenance/mssql/archives/patch-user_password_expires.sql
new file mode 100644 (file)
index 0000000..c22b10c
--- /dev/null
@@ -0,0 +1 @@
+ALTER TABLE /*_*/mwuser ADD user_password_expires VARCHAR(14) DEFAULT NULL
\ No newline at end of file
index 4a3cdea..fb8db08 100644 (file)
@@ -45,8 +45,8 @@ CREATE TABLE /*_*/mwuser (
    user_email_token  NCHAR(32) DEFAULT '',
    user_email_token_expires varchar(14) DEFAULT NULL,
    user_registration varchar(14) DEFAULT NULL,
-   user_editcount    INT NULL DEFAULT NULL
-   user_password_expires DATETIME DEFAULT NULL
+   user_editcount    INT NULL DEFAULT NULL,
+   user_password_expires varchar(14) DEFAULT NULL
 );
 CREATE UNIQUE INDEX /*i*/user_name ON /*_*/mwuser (user_name);
 CREATE INDEX /*i*/user_email_token ON /*_*/mwuser (user_email_token);
index b22dd88..ee0ff01 100644 (file)
@@ -152,15 +152,13 @@ You might want to delete the temporary file:
 ---------------------------------------------------
 
 TEXT
-       );
+               );
 
                if ( $exitcode !== 0 ) {
                        $this->error( "Something went wrong (exit: $exitcode)\n",
                                $exitcode );
                }
-
        }
-
 }
 
 $maintClass = 'MWDocGen';
index 442163e..cc42307 100755 (executable)
@@ -14,18 +14,9 @@ fi
 
 MWCORE_DIR=$(cd $(dirname $0)/..; pwd)
 
-# Support jsduck 4.x and 5.x
-JSDUCK_VERSION="$(jsduck --version | sed -e 's/[.].*//')"
-if [  "$JSDUCK_VERSION" = "JSDuck 4" ]; then
-       JSDUCK_VERSION_OPT="--meta-tags $MWCORE_DIR/maintenance/jsduck/MetaTags.rb --warnings=-no_doc"
-else
-       JSDUCK_VERSION_OPT="--tags $MWCORE_DIR/maintenance/jsduck/CustomTags.rb --warnings=-nodoc(class,public)"
-fi
-
 jsduck \
 --config=$MWCORE_DIR/maintenance/jsduck/config.json \
-$JSDUCK_VERSION_OPT \
 --footer="Documentation for branch ($JSDUCK_MWVERSION) on {DATE} by {JSDUCK} {VERSION}." \
---processes 0 --warnings-exit-nonzero \
+--processes 0 \
 && echo 'JSDuck execution finished.' \
 && ln -s ../../resources $MWCORE_DIR/docs/js/modules
index 5fc972c..a152091 100644 (file)
@@ -44,9 +44,9 @@ class NamespaceConflictChecker extends Maintenance {
                $this->mDescription = "";
                $this->addOption( 'fix', 'Attempt to automatically fix errors' );
                $this->addOption( 'suffix', "Dupes will be renamed with correct namespace with " .
-                                                                       "<text> appended after the article name", false, true );
+                       "<text> appended after the article name", false, true );
                $this->addOption( 'prefix', "Do an explicit check for the given title prefix " .
-                                                                       "appended after the article name", false, true );
+                       "appended after the article name", false, true );
        }
 
        public function execute() {
@@ -138,6 +138,7 @@ class NamespaceConflictChecker extends Maintenance {
                foreach ( $spaces as $name => $ns ) {
                        $ok = $this->checkNamespace( $ns, $name, $fix, $suffix ) && $ok;
                }
+
                return $ok;
        }
 
@@ -152,6 +153,7 @@ class NamespaceConflictChecker extends Maintenance {
                foreach ( $result as $row ) {
                        $prefixes[] = $row['iw_prefix'];
                }
+
                return $prefixes;
        }
 
@@ -178,6 +180,7 @@ class NamespaceConflictChecker extends Maintenance {
                                $ok = $this->resolveConflict( $row, $resolvable, $suffix ) && $ok;
                        }
                }
+
                return $ok;
        }
 
@@ -191,6 +194,7 @@ class NamespaceConflictChecker extends Maintenance {
         */
        private function checkPrefix( $key, $prefix, $fix, $suffix = '' ) {
                $this->output( "Checking prefix \"$prefix\" vs namespace $key\n" );
+
                return $this->checkNamespace( $key, $prefix, $fix, $suffix );
        }
 
@@ -231,6 +235,7 @@ class NamespaceConflictChecker extends Maintenance {
                foreach ( $result as $row ) {
                        $set[] = $row;
                }
+
                return $set;
        }
 
@@ -251,6 +256,7 @@ class NamespaceConflictChecker extends Maintenance {
                                $row->oldnamespace,
                                $row->oldtitle ) );
                        $this->output( "...  *** cannot resolve automatically; illegal title ***\n" );
+
                        return false;
                }
 
@@ -265,6 +271,7 @@ class NamespaceConflictChecker extends Maintenance {
                $id = $newTitle->getArticleID();
                if ( $id ) {
                        $this->output( "...  *** cannot resolve automatically; page exists with ID $id ***\n" );
+
                        return false;
                } else {
                        return true;
@@ -288,6 +295,7 @@ class NamespaceConflictChecker extends Maintenance {
                                $title = Title::makeTitleSafe( $row->namespace, $row->title );
                                if ( !$title ) {
                                        $this->output( "... !!! invalid title\n" );
+
                                        return false;
                                }
                                $id = $title->getArticleID();
@@ -300,6 +308,7 @@ class NamespaceConflictChecker extends Maintenance {
                        $this->output( "...  *** using suffixed form [[" . $title->getPrefixedText() . "]] ***\n" );
                }
                $this->resolveConflictOn( $row, 'page', 'page' );
+
                return true;
        }
 
@@ -326,6 +335,7 @@ class NamespaceConflictChecker extends Maintenance {
                        ),
                        __METHOD__ );
                $this->output( "ok.\n" );
+
                return true;
        }
 }
index 479dcf7..64bf1b6 100644 (file)
@@ -91,7 +91,7 @@ class NukeNS extends Maintenance {
                                        $child = $this->runChild( 'NukePage', 'nukePage.php' );
                                        $child->deleteRevisions( $revs );
                                        $this->purgeRedundantText( true );
-                                       $n_deleted ++;
+                                       $n_deleted++;
                                }
                        } else {
                                $this->output( "skip: " . $title->getPrefixedText() . "\n" );
index 8f0b83f..eea6f7b 100644 (file)
@@ -44,6 +44,7 @@ class AlterSharedConstraints extends Maintenance {
 
                if ( $wgSharedDB == null ) {
                        $this->output( "Database sharing is not enabled\n" );
+
                        return;
                }
 
@@ -66,29 +67,28 @@ class AlterSharedConstraints extends Maintenance {
                                                AND uccpk.table_name = '$ltable'" );
                        while ( ( $row = $result->fetchRow() ) !== false ) {
 
-                                       $this->output( "Altering {$row['constraint_name']} ..." );
+                               $this->output( "Altering {$row['constraint_name']} ..." );
 
-                                       try {
-                                               $dbw->query( "ALTER TABLE {$row['table_name']}
+                               try {
+                                       $dbw->query( "ALTER TABLE {$row['table_name']}
                                                        DROP CONSTRAINT {$wgDBprefix}{$row['constraint_name']}" );
-                                       } catch ( DBQueryError $exdb ) {
-                                               if ( $exdb->errno != 2443 ) {
-                                                       throw $exdb;
-                                               }
+                               } catch ( DBQueryError $exdb ) {
+                                       if ( $exdb->errno != 2443 ) {
+                                               throw $exdb;
                                        }
+                               }
 
-                                       $deleteRule = $row['delete_rule'] == 'NO ACTION' ? '' : "ON DELETE {$row['delete_rule']}";
-                                       $dbw->query( "ALTER TABLE {$row['table_name']}
+                               $deleteRule = $row['delete_rule'] == 'NO ACTION' ? '' : "ON DELETE {$row['delete_rule']}";
+                               $dbw->query( "ALTER TABLE {$row['table_name']}
                                                ADD CONSTRAINT {$wgDBprefix}{$row['constraint_name']}
                                                FOREIGN KEY ({$row['column_name']})
                                                REFERENCES {$wgSharedDB}.$stable({$row['pk_column_name']})
                                                {$deleteRule} {$row['deferrable']} INITIALLY {$row['deferred']}" );
 
-                                       $this->output( "DONE\n" );
+                               $this->output( "DONE\n" );
                        }
                }
        }
-
 }
 
 $maintClass = "AlterSharedConstraints";
index 1a8052b..7e27107 100644 (file)
@@ -40,9 +40,9 @@ class Orphans extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->mDescription = "Look for 'orphan' revisions hooked to pages which don't exist\n" .
-                                                               "and 'childless' pages with no revisions\n" .
-                                                               "Then, kill the poor widows and orphans\n" .
-                                                               "Man this is depressing";
+                       "and 'childless' pages with no revisions\n" .
+                       "Then, kill the poor widows and orphans\n" .
+                       "Man this is depressing";
                $this->addOption( 'fix', 'Actually fix broken entries' );
        }
 
index 0ec1de9..9af57da 100644 (file)
@@ -116,10 +116,10 @@ class CLIParser extends Maintenance {
         * @return Title object
         */
        protected function getTitle() {
-               $title =
-                       $this->getOption( 'title' )
+               $title = $this->getOption( 'title' )
                        ? $this->getOption( 'title' )
                        : 'CLIParser';
+
                return Title::newFromText( $title );
        }
 
index 15087f8..ab0ca1e 100644 (file)
@@ -92,8 +92,9 @@ TEXT;
                        );
                        if ( $row ) {
                                $this->output( "Category table already populated.  Use php " .
-                               "maintenance/populateCategory.php\n--force from the command line " .
-                               "to override.\n" );
+                                       "maintenance/populateCategory.php\n--force from the command line " .
+                                       "to override.\n" );
+
                                return true;
                        }
                }
@@ -141,16 +142,17 @@ TEXT;
                }
 
                if ( $dbw->insert(
-                               'updatelog',
-                               array( 'ul_key' => 'populate category' ),
-                               __METHOD__,
-                               'IGNORE'
-                       )
-               ) {
+                       'updatelog',
+                       array( 'ul_key' => 'populate category' ),
+                       __METHOD__,
+                       'IGNORE'
+               ) ) {
                        $this->output( "Category population complete.\n" );
+
                        return true;
                } else {
                        $this->output( "Could not insert category population row.\n" );
+
                        return false;
                }
        }
index c579d4f..850a5a5 100644 (file)
@@ -51,6 +51,7 @@ class PopulateFilearchiveSha1 extends LoggedUpdateMaintenance {
 
                if ( !$dbw->fieldExists( $table, 'fa_sha1', __METHOD__ ) ) {
                        $this->output( "fa_sha1 column does not exist\n\n", true );
+
                        return false;
                }
 
index 575573b..e9123aa 100644 (file)
@@ -77,11 +77,15 @@ class PopulateImageSha1 extends LoggedUpdateMaintenance {
                        );
                        if ( !$res ) {
                                $this->error( "No such file: $file", true );
+
                                return false;
                        }
                        $this->output( "Populating img_sha1 field for specified files\n" );
                } else {
-                       if ( $force ) {
+                       if ( $this->hasOption( 'multiversiononly' ) ) {
+                               $conds = array();
+                               $this->output( "Populating and recalculating img_sha1 field for versioned files\n" );
+                       } elseif ( $force ) {
                                $conds = array();
                                $this->output( "Populating and recalculating img_sha1 field\n" );
                        } else {
index 83e470d..4c1a72e 100644 (file)
@@ -56,11 +56,13 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
                $db = $this->getDB( DB_MASTER );
                if ( !$db->tableExists( 'log_search' ) ) {
                        $this->error( "log_search does not exist" );
+
                        return false;
                }
                $start = $db->selectField( 'logging', 'MIN(log_id)', false, __FUNCTION__ );
                if ( !$start ) {
                        $this->output( "Nothing to do.\n" );
+
                        return true;
                }
                $end = $db->selectField( 'logging', 'MAX(log_id)', false, __FUNCTION__ );
@@ -126,8 +128,8 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
                                        // Add item author relations...
                                        $log->addRelations( 'target_author_id', $userIds, $row->log_id );
                                        $log->addRelations( 'target_author_ip', $userIPs, $row->log_id );
-                               // RevisionDelete logs - log events
                                } elseif ( LogEventsList::typeAction( $row, $delTypes, 'event' ) ) {
+                                       // RevisionDelete logs - log events
                                        $params = LogPage::extractParams( $row->log_params );
                                        // Param format: <item CSV> [<ofield> <nfield>]
                                        if ( count( $params ) < 1 ) {
@@ -159,6 +161,7 @@ class PopulateLogSearch extends LoggedUpdateMaintenance {
                        wfWaitForSlaves();
                }
                $this->output( "Done populating log_search table.\n" );
+
                return true;
        }
 }
index e579e52..96cb1ec 100644 (file)
@@ -52,6 +52,7 @@ class PopulateLogUsertext extends LoggedUpdateMaintenance {
                $start = $db->selectField( 'logging', 'MIN(log_id)', false, __METHOD__ );
                if ( !$start ) {
                        $this->output( "Nothing to do.\n" );
+
                        return true;
                }
                $end = $db->selectField( 'logging', 'MAX(log_id)', false, __METHOD__ );
@@ -77,6 +78,7 @@ class PopulateLogUsertext extends LoggedUpdateMaintenance {
                        wfWaitForSlaves();
                }
                $this->output( "Done populating log_user_text field.\n" );
+
                return true;
        }
 }
index 35eef83..f77978f 100644 (file)
@@ -49,6 +49,7 @@ class PopulateParentId extends LoggedUpdateMaintenance {
                $db = wfGetDB( DB_MASTER );
                if ( !$db->tableExists( 'revision' ) ) {
                        $this->error( "revision table does not exist" );
+
                        return false;
                }
                $this->output( "Populating rev_parent_id column\n" );
@@ -56,6 +57,7 @@ class PopulateParentId extends LoggedUpdateMaintenance {
                $end = $db->selectField( 'revision', 'MAX(rev_id)', false, __FUNCTION__ );
                if ( is_null( $start ) || is_null( $end ) ) {
                        $this->output( "...revision table seems to be empty, nothing to do.\n" );
+
                        return true;
                }
                # Do remaining chunk
@@ -119,6 +121,7 @@ class PopulateParentId extends LoggedUpdateMaintenance {
                        wfWaitForSlaves();
                }
                $this->output( "rev_parent_id population complete ... {$count} rows [{$changed} changed]\n" );
+
                return true;
        }
 }
index e9c9407..25a51d7 100644 (file)
@@ -46,6 +46,7 @@ class PopulateRecentChangesSource extends LoggedUpdateMaintenance {
                $start = $dbw->selectField( 'recentchanges', 'MIN(rc_id)', false, __METHOD__ );
                if ( !$start ) {
                        $this->output( "Nothing to do.\n" );
+
                        return true;
                }
                $end = $dbw->selectField( 'recentchanges', 'MAX(rc_id)', false, __METHOD__ );
index 636d63e..b73ac7f 100644 (file)
@@ -49,6 +49,7 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
                        $this->error( "archive table does not exist", true );
                } elseif ( !$db->fieldExists( 'revision', 'rev_len', __METHOD__ ) ) {
                        $this->output( "rev_len column does not exist\n\n", true );
+
                        return false;
                }
 
@@ -60,6 +61,7 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
 
                $this->output( "rev_len and ar_len population complete "
                        . "[$rev revision rows, $ar archive rows].\n" );
+
                return true;
        }
 
@@ -76,6 +78,7 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
                $end = $db->selectField( $table, "MAX($idCol)", false, __METHOD__ );
                if ( !$start || !$end ) {
                        $this->output( "...$table table seems to be empty.\n" );
+
                        return 0;
                }
 
@@ -133,6 +136,7 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
                        # This should not happen, but sometimes does (bug 20757)
                        $id = $row->$idCol;
                        $this->output( "Content of $table $id unavailable!\n" );
+
                        return false;
                }
 
index 03f9b09..f06b56b 100644 (file)
@@ -50,6 +50,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                        $this->error( "archive table does not exist", true );
                } elseif ( !$db->fieldExists( 'revision', 'rev_sha1', __METHOD__ ) ) {
                        $this->output( "rev_sha1 column does not exist\n\n", true );
+
                        return false;
                }
 
@@ -63,6 +64,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
 
                $this->output( "rev_sha1 and ar_sha1 population complete "
                        . "[$rc revision rows, $ac archive rows].\n" );
+
                return true;
        }
 
@@ -78,6 +80,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                $end = $db->selectField( $table, "MAX($idCol)", false, __METHOD__ );
                if ( !$start || !$end ) {
                        $this->output( "...$table table seems to be empty.\n" );
+
                        return 0;
                }
 
@@ -104,6 +107,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                        $blockEnd += $this->mBatchSize;
                        wfWaitForSlaves();
                }
+
                return $count;
        }
 
@@ -131,6 +135,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                        }
                }
                $db->commit( __METHOD__ );
+
                return $count;
        }
 
@@ -150,11 +155,13 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                        $text = $rev->getSerializedData();
                } catch ( MWException $e ) {
                        $this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
+
                        return false; // bug 22624?
                }
                if ( !is_string( $text ) ) {
                        # This should not happen, but sometimes does (bug 20757)
                        $this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
+
                        return false;
                } else {
                        $db->update( $table,
@@ -162,6 +169,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                                array( $idCol => $row->$idCol ),
                                __METHOD__
                        );
+
                        return true;
                }
        }
@@ -176,12 +184,14 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                        $rev = Revision::newFromArchiveRow( $row );
                } catch ( MWException $e ) {
                        $this->output( "Text of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
+
                        return false; // bug 22624?
                }
                $text = $rev->getSerializedData();
                if ( !is_string( $text ) ) {
                        # This should not happen, but sometimes does (bug 20757)
                        $this->output( "Data of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
+
                        return false;
                } else {
                        # Archive table as no PK, but (NS,title,time) should be near unique.
@@ -196,6 +206,7 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                                ),
                                __METHOD__
                        );
+
                        return true;
                }
        }
index c69e5c2..17d97b0 100644 (file)
@@ -41,6 +41,7 @@ class PreprocessDump extends DumpIterator {
 
        public function getStripList() {
                global $wgParser;
+
                return $wgParser->getStripList();
        }
 
index 498ddf6..9155623 100644 (file)
@@ -121,6 +121,7 @@ class PPFuzzTester {
                // It's done by the MW UI, so it's a reasonably legitimate thing to do.
                global $wgContLang;
                $s = $wgContLang->normalize( $s );
+
                return $s;
        }
 
@@ -136,7 +137,8 @@ class PPFuzzTester {
 
        function pickEntryPoint() {
                $count = count( $this->entryPoints );
-               return $this->entryPoints[ mt_rand( 0, $count - 1 ) ];
+
+               return $this->entryPoints[mt_rand( 0, $count - 1 )];
        }
 }
 
@@ -182,6 +184,7 @@ class PPFuzzTest {
                                'text' => $text,
                                'finalTitle' => $finalTitle );
                }
+
                return $this->templates[$titleText];
        }
 
@@ -211,7 +214,7 @@ class PPFuzzTest {
 //                     "Output type: {$this->outputType}\n" .
                        "Entry point: {$this->entryPoint}\n" .
                        "User: " . ( $this->fancySig ? 'fancy' : 'no-fancy' ) .
-                               ' ' . var_export( $this->nickname, true ) . "\n" .
+                       ' ' . var_export( $this->nickname, true ) . "\n" .
                        "Main text: " . var_export( $this->mainText, true ) . "\n";
                foreach ( $this->templates as $titleText => $template ) {
                        $finalTitle = $template['finalTitle'];
index 91c36f2..1e702de 100644 (file)
@@ -177,7 +177,6 @@ class PurgeChangedFiles extends Maintenance {
                                                        // Sanity check to avoid data loss
                                                        $repo->getBackend()->delete( array( 'src' => $file->getPath() ) );
                                                        $this->verbose( "Deleted orphan file: {$file->getPath()}.\n" );
-
                                                } else {
                                                        $this->error( "File was not deleted: {$file->getPath()}.\n" );
                                                }
@@ -185,7 +184,6 @@ class PurgeChangedFiles extends Maintenance {
 
                                        // Purge items from fileachive table (rows are likely here)
                                        $this->purgeFromArchiveTable( $repo, $file );
-
                                } elseif ( $logType === 'move' ) {
                                        // Purge the target file as well
 
@@ -232,7 +230,6 @@ class PurgeChangedFiles extends Maintenance {
                                        // Sanity check to avoid data loss
                                        $repo->getBackend()->delete( array( 'src' => $ofile->getPath() ) );
                                        $this->output( "Deleted orphan file: {$ofile->getPath()}.\n" );
-
                                } else {
                                        $this->error( "File was not deleted: {$ofile->getPath()}.\n" );
                                }
@@ -244,6 +241,7 @@ class PurgeChangedFiles extends Maintenance {
        protected function getDeletedPath( LocalRepo $repo, LocalFile $file ) {
                $hash = $repo->getFileSha1( $file->getPath() );
                $key = "{$hash}.{$file->getExtension()}";
+
                return $repo->getDeletedHashPath( $key ) . $key;
        }
 
@@ -257,7 +255,6 @@ class PurgeChangedFiles extends Maintenance {
                        $this->output( $msg );
                }
        }
-
 }
 
 $maintClass = "PurgeChangedFiles";
index 071ac09..f0b6ec7 100644 (file)
@@ -183,6 +183,7 @@ class PurgeChangedPages extends Maintenance {
                        }
                }
                $lastValueLeft = count( $rows ) ? $rows[count( $rows ) - 1]->$column : null;
+
                return array( $rows, $lastValueLeft );
        }
 }
index 8a3818a..2e19630 100644 (file)
@@ -141,7 +141,6 @@ class PurgeList extends Maintenance {
                        $u->doUpdate();
                }
        }
-
 }
 
 $maintClass = "PurgeList";
index db961d8..913e9f0 100644 (file)
@@ -74,5 +74,4 @@ function PurgeRedundantText( $delete = false ) {
 
        # Done
        $dbw->commit( __METHOD__ );
-
 }
index ca2a041..9970c1f 100644 (file)
@@ -37,7 +37,8 @@ class PurgeParserCache extends Maintenance {
                $this->addDescription( "Remove old objects from the parser cache. " .
                        "This only works when the parser cache is in an SQL database." );
                $this->addOption( 'expiredate', 'Delete objects expiring before this date.', false, true );
-               $this->addOption( 'age',
+               $this->addOption(
+                       'age',
                        'Delete objects created more than this many seconds ago, assuming $wgParserCacheExpireTime ' .
                                'has been consistent.',
                        false, true );
@@ -77,8 +78,8 @@ class PurgeParserCache extends Maintenance {
                $stars = floor( $percent / 2 );
                $this->output( '[' . str_repeat( '*', $stars ) . str_repeat( '.', 50 - $stars ) . '] ' .
                        "$percentString%\r" );
-
        }
 }
+
 $maintClass = 'PurgeParserCache';
 require_once RUN_MAINTENANCE_IF_MAIN;
index 9b10470..679cadb 100644 (file)
@@ -140,6 +140,7 @@ class ReassignEdits extends Maintenance {
                }
 
                $dbw->commit( __METHOD__ );
+
                return (int)$total;
        }
 
@@ -189,6 +190,7 @@ class ReassignEdits extends Maintenance {
                        }
                }
                $user->load();
+
                return $user;
        }
 }
index 8b0b057..5a14967 100644 (file)
@@ -79,6 +79,7 @@ class ImageBuilder extends Maintenance {
                if ( !isset( $this->repo ) ) {
                        $this->repo = RepoGroup::singleton()->getLocalRepo();
                }
+
                return $this->repo;
        }
 
@@ -149,6 +150,7 @@ class ImageBuilder extends Maintenance {
                // Create a File object from the row
                // This will also upgrade it
                $file = $this->getRepo()->newFileFromRow( $row );
+
                return $file->getUpgraded();
        }
 
@@ -161,9 +163,11 @@ class ImageBuilder extends Maintenance {
                // This will also upgrade it
                if ( $row->oi_archive_name == '' ) {
                        $this->output( "Empty oi_archive_name for oi_name={$row->oi_name}\n" );
+
                        return false;
                }
                $file = $this->getRepo()->newFileFromRow( $row );
+
                return $file->getUpgraded();
        }
 
@@ -201,21 +205,22 @@ class ImageBuilder extends Maintenance {
 
                if ( $filename == '' ) {
                        $this->output( "Empty filename for $fullpath\n" );
+
                        return;
                }
                if ( !$this->dryrun ) {
                        $file = wfLocalFile( $filename );
                        if ( !$file->recordUpload(
-                                       '',
-                                       '(recovered file, missing upload log entry)',
-                                       '',
-                                       '',
-                                       '',
-                                       false,
-                                       $timestamp
-                               )
-                       ) {
+                               '',
+                               '(recovered file, missing upload log entry)',
+                               '',
+                               '',
+                               '',
+                               false,
+                               $timestamp
+                       ) ) {
                                $this->output( "Error uploading file $fullpath\n" );
+
                                return;
                        }
                }
index cfcb950..b04639c 100644 (file)
@@ -52,6 +52,7 @@ class RebuildLocalisationCache extends Maintenance {
                if ( $this->hasOption( 'memory-limit' ) ) {
                        return parent::memoryLimit();
                }
+
                return '1000M';
        }
 
@@ -148,7 +149,7 @@ class RebuildLocalisationCache extends Maintenance {
        /**
         * Helper function to rebuild list of languages codes. Prints the code
         * for each language which is rebuilt.
-        * @param array $codes  List of language codes to rebuild.
+        * @param array $codes List of language codes to rebuild.
         * @param LocalisationCache $lc Instance of LocalisationCacheBulkLoad (?)
         * @param bool $force Rebuild up-to-date languages
         * @return int Number of rebuilt languages
@@ -162,6 +163,7 @@ class RebuildLocalisationCache extends Maintenance {
                                $numRebuilt++;
                        }
                }
+
                return $numRebuilt;
        }
 
index 2c83454..203d795 100644 (file)
@@ -69,29 +69,31 @@ class RebuildRecentchanges extends Maintenance {
                $cutoff = time() - $wgRCMaxAge;
                $dbw->insertSelect( 'recentchanges', array( 'page', 'revision' ),
                        array(
-                               'rc_timestamp'  => 'rev_timestamp',
-                               'rc_user'       => 'rev_user',
-                               'rc_user_text'  => 'rev_user_text',
-                               'rc_namespace'  => 'page_namespace',
-                               'rc_title'      => 'page_title',
-                               'rc_comment'    => 'rev_comment',
-                               'rc_minor'      => 'rev_minor_edit',
-                               'rc_bot'        => 0,
-                               'rc_new'        => 'page_is_new',
-                               'rc_cur_id'     => 'page_id',
+                               'rc_timestamp' => 'rev_timestamp',
+                               'rc_user' => 'rev_user',
+                               'rc_user_text' => 'rev_user_text',
+                               'rc_namespace' => 'page_namespace',
+                               'rc_title' => 'page_title',
+                               'rc_comment' => 'rev_comment',
+                               'rc_minor' => 'rev_minor_edit',
+                               'rc_bot' => 0,
+                               'rc_new' => 'page_is_new',
+                               'rc_cur_id' => 'page_id',
                                'rc_this_oldid' => 'rev_id',
                                'rc_last_oldid' => 0, // is this ok?
-                               'rc_type'       => $dbw->conditional( 'page_is_new != 0', RC_NEW, RC_EDIT ),
-                               'rc_source'     => $dbw->conditional(
-                                       'page_is_new != 0',
-                                       $dbw->addQuotes( RecentChange::SRC_NEW ),
-                                       $dbw->addQuotes( RecentChange::SRC_EDIT )
+                               'rc_type' => $dbw->conditional( 'page_is_new != 0', RC_NEW, RC_EDIT ),
+                               'rc_source' => $dbw->conditional(
+                                               'page_is_new != 0',
+                                               $dbw->addQuotes( RecentChange::SRC_NEW ),
+                                               $dbw->addQuotes( RecentChange::SRC_EDIT )
                                ),
-                               'rc_deleted'    => 'rev_deleted'
-                       ), array(
+                               'rc_deleted' => 'rev_deleted'
+                       ),
+                       array(
                                'rev_timestamp > ' . $dbw->addQuotes( $dbw->timestamp( $cutoff ) ),
                                'rev_page=page_id'
-                       ), __METHOD__,
+                       ),
+                       __METHOD__,
                        array(), // INSERT options
                        array( 'ORDER BY' => 'rev_timestamp DESC', 'LIMIT' => 5000 ) // SELECT options
                );
@@ -193,31 +195,33 @@ class RebuildRecentchanges extends Maintenance {
                                "$logging LEFT JOIN $page ON (log_namespace=page_namespace AND log_title=page_title)"
                        ),
                        array(
-                               'rc_timestamp'  => 'log_timestamp',
-                               'rc_user'       => 'log_user',
-                               'rc_user_text'  => 'user_name',
-                               'rc_namespace'  => 'log_namespace',
-                               'rc_title'      => 'log_title',
-                               'rc_comment'    => 'log_comment',
-                               'rc_minor'      => 0,
-                               'rc_bot'        => 0,
-                               'rc_patrolled'  => 1,
-                               'rc_new'        => 0,
+                               'rc_timestamp' => 'log_timestamp',
+                               'rc_user' => 'log_user',
+                               'rc_user_text' => 'user_name',
+                               'rc_namespace' => 'log_namespace',
+                               'rc_title' => 'log_title',
+                               'rc_comment' => 'log_comment',
+                               'rc_minor' => 0,
+                               'rc_bot' => 0,
+                               'rc_patrolled' => 1,
+                               'rc_new' => 0,
                                'rc_this_oldid' => 0,
                                'rc_last_oldid' => 0,
-                               'rc_type'       => RC_LOG,
-                               'rc_source'     => $dbw->addQuotes( RecentChange::SRC_LOG ),
-                               'rc_cur_id'     => $dbw->cascadingDeletes() ? 'page_id' : 'COALESCE(page_id, 0)',
-                               'rc_log_type'   => 'log_type',
+                               'rc_type' => RC_LOG,
+                               'rc_source' => $dbw->addQuotes( RecentChange::SRC_LOG ),
+                               'rc_cur_id' => $dbw->cascadingDeletes() ? 'page_id' : 'COALESCE(page_id, 0)',
+                               'rc_log_type' => 'log_type',
                                'rc_log_action' => 'log_action',
-                               'rc_logid'      => 'log_id',
-                               'rc_params'     => 'log_params',
-                               'rc_deleted'    => 'log_deleted'
-                       ), array(
+                               'rc_logid' => 'log_id',
+                               'rc_params' => 'log_params',
+                               'rc_deleted' => 'log_deleted'
+                       ),
+                       array(
                                'log_timestamp > ' . $dbw->addQuotes( $dbw->timestamp( $cutoff ) ),
                                'log_user=user_id',
                                'log_type IN(' . implode( ',', $selectLogs ) . ')'
-                       ), __METHOD__,
+                       ),
+                       __METHOD__,
                        array(), // INSERT options
                        array( 'ORDER BY' => 'log_timestamp DESC', 'LIMIT' => 5000 ) // SELECT options
                );
@@ -299,7 +303,6 @@ class RebuildRecentchanges extends Maintenance {
                        $messageMemc->delete( wfMemcKey( 'rcfeed', $feed, 'timestamp' ) ); # Good enough for now.
                }
        }
-
 }
 
 $maintClass = "RebuildRecentchanges";
index 95dc10b..8cb23fd 100644 (file)
@@ -82,7 +82,6 @@ class RefreshImageMetadata extends Maintenance {
                        false,
                        true
                );
-
        }
 
        public function execute() {
@@ -148,7 +147,7 @@ class RefreshImageMetadata extends Maintenance {
                                                // to weed out any inconsequential changes.
                                                $error++;
                                                $this->output( "Warning: File:{$row->img_name} used to have " .
-                                               "$oldLength bytes of metadata but now has $newLength bytes.\n" );
+                                                       "$oldLength bytes of metadata but now has $newLength bytes.\n" );
                                        } elseif ( $verbose ) {
                                                $this->output( "Refreshed File:{$row->img_name}.\n" );
                                        }
@@ -161,20 +160,17 @@ class RefreshImageMetadata extends Maintenance {
                                                if ( $newLength < $oldLength - 5 ) {
                                                        $error++;
                                                        $this->output( "Warning: File:{$row->img_name} used to have " .
-                                                       "$oldLength bytes of metadata but now has $newLength bytes. (forced)\n" );
-
+                                                               "$oldLength bytes of metadata but now has $newLength bytes. (forced)\n" );
                                                }
                                                if ( $verbose ) {
                                                        $this->output( "Forcibly refreshed File:{$row->img_name}.\n" );
                                                }
-                                       }
-                                       else {
+                                       } else {
                                                if ( $verbose ) {
                                                        $this->output( "Skipping File:{$row->img_name}.\n" );
                                                }
                                        }
                                }
-
                        }
                        $conds2 = array( 'img_name > ' . $dbw->addQuotes( $row->img_name ) );
                        wfWaitForSlaves();
@@ -216,6 +212,7 @@ class RefreshImageMetadata extends Maintenance {
                if ( $like ) {
                        $conds[] = 'img_metadata ' . $dbw->buildLike( $dbw->anyString(), $like, $dbw->anyString() );
                }
+
                return $conds;
        }
 
index eca207a..0c2f722 100644 (file)
@@ -65,7 +65,8 @@ class RefreshLinks extends Maintenance {
         * @param bool $oldRedirectsOnly Only fix redirects without redirect entries
         */
        private function doRefreshLinks( $start, $newOnly = false, $maxLag = false,
-                                               $end = 0, $redirectsOnly = false, $oldRedirectsOnly = false ) {
+               $end = 0, $redirectsOnly = false, $oldRedirectsOnly = false
+       ) {
                global $wgParser, $wgUseTidy;
 
                $reportingInterval = 100;
@@ -196,6 +197,7 @@ class RefreshLinks extends Maintenance {
                        // Delete any redirect table entry for it
                        $dbw->delete( 'redirect', array( 'rd_from' => $id ),
                                __METHOD__ );
+
                        return;
                }
 
index 55b2360..90dc622 100644 (file)
@@ -64,7 +64,7 @@ class RemoveUnusedAccounts extends Maintenance {
                        if ( count( array_intersect( $instance->getEffectiveGroups(), $excludedGroups ) ) == 0
                                && $this->isInactiveAccount( $row->user_id, true )
                                && wfTimestamp( TS_UNIX, $row->user_touched ) < wfTimestamp( TS_UNIX, time() - $touchedSeconds )
-                               ) {
+                       ) {
                                # Inactive; print out the name and flag it
                                $del[] = $row->user_id;
                                $this->output( $row->user_name . "\n" );
index b76d9a1..169f512 100644 (file)
@@ -84,6 +84,7 @@ class DumpRenderer extends Maintenance {
                $title = $rev->getTitle();
                if ( !$title ) {
                        $this->error( "Got bogus revision with null title!" );
+
                        return;
                }
                $display = $title->getPrefixedText();
index a1ee3de..08be553 100644 (file)
@@ -70,7 +70,7 @@ class ResetUserTokens extends Maintenance {
                $where = array();
                if ( $this->nullsOnly ) {
                        // Have to build this by hand, because \ is escaped in helper functions
-                       $where = array( 'user_token = \'' . str_repeat( '\0', 32) . '\'' );
+                       $where = array( 'user_token = \'' . str_repeat( '\0', 32 ) . '\'' );
                }
 
                $maxid = $dbr->selectField( 'user', 'MAX(user_id)', array(), __METHOD__ );
@@ -98,9 +98,7 @@ class ResetUserTokens extends Maintenance {
                        $max = $min + $this->mBatchSize;
 
                        wfWaitForSlaves();
-
                } while ( $min <= $maxid );
-
        }
 
        private function updateUser( $userid ) {
index 6bb0fb8..967dda8 100644 (file)
@@ -72,6 +72,7 @@ class RollbackEdits extends Maintenance {
 
                if ( !$titles ) {
                        $this->output( 'No suitable titles to be rolled back' );
+
                        return;
                }
 
@@ -105,6 +106,7 @@ class RollbackEdits extends Maintenance {
                foreach ( $results as $row ) {
                        $titles[] = Title::makeTitle( $row->page_namespace, $row->page_title );
                }
+
                return $titles;
        }
 }
index c3eb4ba..f69a3a3 100644 (file)
@@ -43,6 +43,7 @@ class RunJobs extends Maintenance {
                if ( $this->hasOption( 'memory-limit' ) ) {
                        return parent::memoryLimit();
                }
+
                // Don't eat all memory on the machine if we get a bad job.
                return "150M";
        }
@@ -101,7 +102,7 @@ class RunJobs extends Maintenance {
                                $this->runJobsLog( $job->toString() . " STARTING" );
 
                                // Set timer to stop the job if too much CPU time is used
-                               set_time_limit( $maxTime ?: 0 );
+                               set_time_limit( $maxTime ? : 0 );
                                // Run the job...
                                wfProfileIn( __METHOD__ . '-' . get_class( $job ) );
                                $t = microtime( true );
@@ -175,9 +176,12 @@ class RunJobs extends Maintenance {
        private function getBackoffTimeToWait( Job $job ) {
                global $wgJobBackoffThrottling;
 
-               if ( !isset( $wgJobBackoffThrottling[$job->getType()] ) ) {
+               if ( !isset( $wgJobBackoffThrottling[$job->getType()] ) ||
+                       $job instanceof DuplicateJob // no work was done
+               ) {
                        return 0; // not throttled
                }
+
                $itemsPerSecond = $wgJobBackoffThrottling[$job->getType()];
                if ( $itemsPerSecond <= 0 ) {
                        return 0; // not throttled
@@ -209,7 +213,7 @@ class RunJobs extends Maintenance {
                        $content = stream_get_contents( $handle );
                        flock( $handle, LOCK_UN );
                        fclose( $handle );
-                       $backoffs = json_decode( $content, true ) ?: array();
+                       $backoffs = json_decode( $content, true ) ? : array();
                }
 
                return $backoffs;
@@ -227,7 +231,7 @@ class RunJobs extends Maintenance {
                $handle = fopen( $file, 'wb+' );
                flock( $handle, LOCK_EX );
                $content = stream_get_contents( $handle );
-               $cBackoffs = json_decode( $content, true ) ?: array();
+               $cBackoffs = json_decode( $content, true ) ? : array();
                foreach ( $backoffs as $type => $timestamp ) {
                        $cBackoffs[$type] = isset( $cBackoffs[$type] ) ? $cBackoffs[$type] : 0;
                        $cBackoffs[$type] = max( $cBackoffs[$type], $backoffs[$type] );
index 6bf4daa..374a66e 100644 (file)
@@ -41,6 +41,7 @@ class ShowSiteStats extends Maintenance {
                parent::__construct();
                $this->mDescription = "Show the cached statistics";
        }
+
        public function execute() {
                $fields = array(
                        'ss_total_views' => 'Total views',
index b20b0cf..c947a4c 100644 (file)
@@ -39,7 +39,7 @@ class MwSql extends Maintenance {
        }
 
        public function execute() {
-               $wiki = $this->getOption( 'wikidb' ) ?: false;
+               $wiki = $this->getOption( 'wikidb' ) ? : false;
                // Get the appropriate load balancer (for this wiki)
                if ( $this->hasOption( 'cluster' ) ) {
                        $lb = wfGetLBFactory()->getExternalLB( $this->getOption( 'cluster' ), $wiki );
@@ -88,12 +88,12 @@ class MwSql extends Maintenance {
                }
 
                $useReadline = function_exists( 'readline_add_history' )
-                               && Maintenance::posix_isatty( 0 /*STDIN*/ );
+                       && Maintenance::posix_isatty( 0 /*STDIN*/ );
 
                if ( $useReadline ) {
                        global $IP;
                        $historyFile = isset( $_ENV['HOME'] ) ?
-                                       "{$_ENV['HOME']}/.mwsql_history" : "$IP/maintenance/.mwsql_history";
+                               "{$_ENV['HOME']}/.mwsql_history" : "$IP/maintenance/.mwsql_history";
                        readline_read_history( $historyFile );
                }
 
@@ -126,7 +126,7 @@ class MwSql extends Maintenance {
                                $prompt = $newPrompt;
                                $wholeLine = '';
                        } catch ( DBQueryError $e ) {
-                               $doDie = ! Maintenance::posix_isatty( 0 );
+                               $doDie = !Maintenance::posix_isatty( 0 );
                                $this->error( $e, $doDie );
                        }
                }
index 6520e13..9729a72 100644 (file)
@@ -78,6 +78,7 @@ class Sqlite {
                                foreach ( $columns as $col ) {
                                        if ( !isset( $allowedTypes[strtolower( $col->type )] ) ) {
                                                $db->close();
+
                                                return "Table {$table->name} has column {$col->name} with non-native type '{$col->type}'";
                                        }
                                }
@@ -86,6 +87,7 @@ class Sqlite {
                        return $e->getMessage();
                }
                $db->close();
+
                return true;
        }
-};
+}
index dbd8ed1..edc9e14 100644 (file)
@@ -55,6 +55,7 @@ class SqliteMaintenance extends Maintenance {
                // Should work even if we use a non-SQLite database
                if ( $this->hasOption( 'check-syntax' ) ) {
                        $this->checkSyntax();
+
                        return;
                }
 
@@ -62,6 +63,7 @@ class SqliteMaintenance extends Maintenance {
 
                if ( $this->db->getType() != 'sqlite' ) {
                        $this->error( "This maintenance script requires a SQLite database.\n" );
+
                        return;
                }
 
@@ -101,6 +103,7 @@ class SqliteMaintenance extends Maintenance {
 
                if ( !$res || $res->numRows() == 0 ) {
                        $this->error( "Error: integrity check query returned nothing.\n" );
+
                        return;
                }
 
index 6b8b5a3..0f99662 100644 (file)
@@ -322,7 +322,6 @@ class CheckStorage {
 
                        // Check targets of unresolved stubs
                        $this->checkExternalConcatBlobs( $externalConcatBlobs );
-
                        // next chunk
                }
 
@@ -403,7 +402,6 @@ class CheckStorage {
                                        );
                                }
                                unset( $oldIds[$row->blob_id] );
-
                        }
                        $extDb->freeResult( $res );
 
@@ -434,6 +432,7 @@ class CheckStorage {
                // Write revision list
                if ( !file_put_contents( $revFileName, implode( "\n", $revIds ) ) ) {
                        echo "Error writing revision list, can't restore text\n";
+
                        return;
                }
 
@@ -450,12 +449,14 @@ class CheckStorage {
 
                if ( $exitStatus ) {
                        echo "mwdumper died with exit status $exitStatus\n";
+
                        return;
                }
 
                $file = fopen( $filteredXmlFileName, 'r' );
                if ( !$file ) {
                        echo "Unable to open filtered XML file\n";
+
                        return;
                }
 
@@ -477,6 +478,7 @@ class CheckStorage {
 
                if ( $content === null ) {
                        echo "Revision $id is broken, we have no content available\n";
+
                        return;
                }
 
@@ -488,12 +490,14 @@ class CheckStorage {
                        // be safe, we'll skip it and leave it broken
 
                        echo "Revision $id is blank in the dump, may have been broken before export\n";
+
                        return;
                }
 
                if ( !$id ) {
                        // No ID, can't import
                        echo "No id tag in revision, can't import\n";
+
                        return;
                }
 
@@ -502,6 +506,7 @@ class CheckStorage {
                $oldId = $dbr->selectField( 'revision', 'rev_text_id', array( 'rev_id' => $id ), __METHOD__ );
                if ( !$oldId ) {
                        echo "Missing revision row for rev_id $id\n";
+
                        return;
                }
 
index bfa269b..d2fe3b4 100644 (file)
@@ -296,6 +296,7 @@ class FixBug20757 extends Maintenance {
                        $this->mapCache[$pageId] = $map;
                        $this->mapCacheSize += count( $map );
                }
+
                return $this->mapCache[$pageId];
        }
 
@@ -312,7 +313,7 @@ class FixBug20757 extends Maintenance {
                if ( in_array( 'external', $flags ) ) {
                        $url = $text;
                        wfSuppressWarnings();
-                       list( /* $proto */ , $path ) = explode( '://', $url, 2 );
+                       list( /* $proto */, $path ) = explode( '://', $url, 2 );
                        wfRestoreWarnings();
 
                        if ( $path == "" ) {
@@ -341,6 +342,7 @@ class FixBug20757 extends Maintenance {
 
                $obj->uncompress();
                $text = $obj->getItem( $stub['hash'] );
+
                return $text !== false;
        }
 }
index 9dc5280..c5213ad 100644 (file)
@@ -38,6 +38,7 @@ class OrphanStats extends Maintenance {
 
        protected function &getDB( $cluster, $groups = array(), $wiki = false ) {
                $lb = wfGetLBFactory()->getExternalLB( $cluster );
+
                return $lb->getConnection( DB_SLAVE );
        }
 
@@ -65,7 +66,7 @@ class OrphanStats extends Maintenance {
                        $num++;
                        $size = strlen( $blobRow->blob_text );
                        $totalSize += $size;
-                       $hashes[ sha1( $blobRow->blob_text ) ] = true;
+                       $hashes[sha1( $blobRow->blob_text )] = true;
                        $maxSize = max( $size, $maxSize );
                }
                unset( $res );
@@ -73,8 +74,8 @@ class OrphanStats extends Maintenance {
                $this->output( "Number of orphans: $num\n" );
                if ( $num > 0 ) {
                        $this->output( "Average size: " . round( $totalSize / $num, 0 ) . " bytes\n" .
-                       "Max size: $maxSize\n" .
-                       "Number of unique texts: " . count( $hashes ) . "\n" );
+                               "Max size: $maxSize\n" .
+                               "Number of unique texts: " . count( $hashes ) . "\n" );
                }
        }
 }
index b19a0b3..307d0b0 100644 (file)
@@ -95,6 +95,7 @@ class RecompressTracked {
                                $jobOptions[$classOption] = $options[$cmdOption];
                        }
                }
+
                return new self( $jobOptions );
        }
 
@@ -118,7 +119,6 @@ class RecompressTracked {
                if ( $this->debugLog ) {
                        $this->logToFile( $msg, $this->debugLog );
                }
-
        }
 
        function info( $msg ) {
@@ -190,13 +190,16 @@ class RecompressTracked {
                $dbr = wfGetDB( DB_SLAVE );
                if ( !$dbr->tableExists( 'blob_tracking' ) ) {
                        $this->critical( "Error: blob_tracking table does not exist" );
+
                        return false;
                }
                $row = $dbr->selectRow( 'blob_tracking', '*', false, __METHOD__ );
                if ( !$row ) {
                        $this->info( "Warning: blob_tracking table contains no rows, skipping this wiki." );
+
                        return false;
                }
+
                return true;
        }
 
@@ -276,6 +279,7 @@ class RecompressTracked {
                        if ( isset( $pipes[$slaveId] ) ) {
                                $this->prevSlaveId = $slaveId;
                                $this->dispatchToSlave( $slaveId, $args );
+
                                return;
                        }
                }
@@ -443,14 +447,14 @@ class RecompressTracked {
                        $args = explode( ' ', $line );
                        $cmd = array_shift( $args );
                        switch ( $cmd ) {
-                       case 'doPage':
-                               $this->doPage( intval( $args[0] ) );
-                               break;
-                       case 'doOrphanList':
-                               $this->doOrphanList( array_map( 'intval', $args ) );
-                               break;
-                       case 'quit':
-                               return;
+                               case 'doPage':
+                                       $this->doPage( intval( $args[0] ) );
+                                       break;
+                               case 'doOrphanList':
+                                       $this->doOrphanList( array_map( 'intval', $args ) );
+                                       break;
+                               case 'quit':
+                                       return;
                        }
                        $this->waitForSlaves();
                }
@@ -618,6 +622,7 @@ class RecompressTracked {
                if ( $cluster === false ) {
                        $cluster = reset( $this->destClusters );
                }
+
                return $cluster;
        }
 
@@ -628,6 +633,7 @@ class RecompressTracked {
         */
        function getExtDB( $cluster ) {
                $lb = wfGetLBFactory()->getExternalLB( $cluster );
+
                return $lb->getConnection( DB_MASTER );
        }
 
@@ -724,6 +730,7 @@ class CgzCopyTransaction {
                $hash = $this->cgz->addItem( $text );
                $this->referrers[$textId] = $hash;
                $this->texts[$textId] = $text;
+
                return $this->cgz->isHappy();
        }
 
@@ -787,6 +794,7 @@ class CgzCopyTransaction {
                                        $this->critical( "Warning: concurrent operation detected, are there two conflicting " .
                                                "processes running, doing the same job?" );
                                }
+
                                return;
                        }
                        $this->recompress();
index 4ac5a98..dff5cb8 100644 (file)
@@ -77,6 +77,7 @@ function resolveStub( $id, $stubText, $flags ) {
 
        if ( strtolower( get_class( $stub ) ) !== 'historyblobstub' ) {
                print "Error found object of class " . get_class( $stub ) . ", expecting historyblobstub\n";
+
                return;
        }
 
index c2df0dd..a3f9386 100644 (file)
@@ -126,6 +126,7 @@ class TrackBlobs {
                                $this->textClause .= 'old_text' . $dbr->buildLike( "DB://$cluster/", $dbr->anyString() );
                        }
                }
+
                return $this->textClause;
        }
 
@@ -133,6 +134,7 @@ class TrackBlobs {
                if ( !preg_match( '!^DB://(\w+)/(\d+)(?:/([0-9a-fA-F]+)|)$!', $text, $m ) ) {
                        return false;
                }
+
                return array(
                        'cluster' => $m[1],
                        'id' => intval( $m[2] ),
@@ -305,6 +307,7 @@ class TrackBlobs {
        function findOrphanBlobs() {
                if ( !extension_loaded( 'gmp' ) ) {
                        echo "Can't find orphan blobs, need bitfield support provided by GMP.\n";
+
                        return;
                }
 
index c505b14..b9493cd 100644 (file)
@@ -71,6 +71,7 @@ class SyncFileBackend extends Maintenance {
                        if ( $this->isQuiet() ) {
                                print $id; // give a single machine-readable number
                        }
+
                        return;
                }
 
@@ -104,7 +105,7 @@ class SyncFileBackend extends Maintenance {
                }
 
                // Periodically update the position file
-               $callback = function( $pos ) use ( $startFromPosFile, $posFile, $start ) {
+               $callback = function ( $pos ) use ( $startFromPosFile, $posFile, $start ) {
                        if ( $startFromPosFile && $pos >= $start ) { // successfully advanced
                                file_put_contents( $posFile, $pos, LOCK_EX );
                        }
@@ -238,6 +239,7 @@ class SyncFileBackend extends Maintenance {
                                if ( !$fsFile ) {
                                        $this->error( "Unable to sync '$dPath': could not get local copy." );
                                        $status->fatal( 'backend-fail-internal', $src->getName() );
+
                                        return $status;
                                }
                                $fsFiles[] = $fsFile; // keep TempFSFile objects alive as needed
@@ -254,6 +256,7 @@ class SyncFileBackend extends Maintenance {
                        } else { // error
                                $this->error( "Unable to sync '$dPath': could not stat file." );
                                $status->fatal( 'backend-fail-internal', $src->getName() );
+
                                return $status;
                        }
                }
index ca610fc..d39ee87 100644 (file)
@@ -1429,12 +1429,13 @@ CREATE INDEX /*i*/pt_timestamp ON /*_*/protected_titles (pt_timestamp);
 CREATE TABLE /*_*/page_props (
   pp_page int NOT NULL,
   pp_propname varbinary(60) NOT NULL,
-  pp_value blob NOT NULL
+  pp_value blob NOT NULL,
+  pp_sortkey float DEFAULT NULL
 ) /*$wgDBTableOptions*/;
 
 CREATE UNIQUE INDEX /*i*/pp_page_propname ON /*_*/page_props (pp_page,pp_propname);
 CREATE UNIQUE INDEX /*i*/pp_propname_page ON /*_*/page_props (pp_propname,pp_page);
-
+CREATE UNIQUE INDEX /*i*/pp_propname_sortkey_page ON /*_*/page_props (pp_propname,pp_sortkey,pp_page);
 
 -- A table to log updates, one text key row per update.
 CREATE TABLE /*_*/updatelog (
index 7ca04b4..19c1d24 100644 (file)
@@ -120,6 +120,7 @@ TEXT;
                        }
                        if ( $count == 0 ) {
                                $this->output( "Collations up-to-date.\n" );
+
                                return;
                        }
                        $this->output( "Fixing collation for $count rows.\n" );
@@ -150,7 +151,8 @@ TEXT;
                                        # This is an old-style row, so the sortkey needs to be
                                        # converted.
                                        if ( $row->cl_sortkey == $title->getText()
-                                               || $row->cl_sortkey == $title->getPrefixedText() ) {
+                                               || $row->cl_sortkey == $title->getPrefixedText()
+                                       ) {
                                                $prefix = '';
                                        } else {
                                                # Custom sortkey, use it as a prefix
@@ -236,6 +238,7 @@ TEXT;
                                $prefix .= " AND $equality";
                        }
                }
+
                return $cond;
        }
 
index f863697..796cedd 100644 (file)
@@ -72,6 +72,7 @@ class UpdateDoubleWidthSearch extends Maintenance {
                $sql = "SELECT si_page FROM $searchindex
                                 WHERE ( si_text RLIKE '$regexp' )
                                        OR ( si_title RLIKE '$regexp' )";
+
                return $dbw->query( $sql, __METHOD__ );
        }
 }
index 12c4a2c..fae9063 100644 (file)
@@ -57,8 +57,8 @@ class UpdateSpecialPages extends Maintenance {
                        }
 
                        if ( !$this->hasOption( 'override' )
-                               && $wgDisableQueryPageUpdate && in_array( $special, $wgDisableQueryPageUpdate ) )
-                       {
+                               && $wgDisableQueryPageUpdate && in_array( $special, $wgDisableQueryPageUpdate )
+                       {
                                $this->output( sprintf( "%-30s [QueryPage] disabled\n", $special ) );
                                continue;
                        }
index bc8fbcf..15e1174 100644 (file)
@@ -61,6 +61,7 @@ class UserDupes {
                $info = $this->db->indexInfo( 'user', 'user_name', __METHOD__ );
                if ( !$info ) {
                        $this->out( "WARNING: doesn't seem to have user_name index at all!\n" );
+
                        return false;
                }
 
@@ -102,6 +103,7 @@ class UserDupes {
        function checkDupes( $doDelete = false ) {
                if ( $this->hasUniqueIndex() ) {
                        echo wfWikiID() . " already has a unique index on its user table.\n";
+
                        return true;
                }
 
@@ -144,14 +146,17 @@ class UserDupes {
 
                if ( $this->failed > 0 ) {
                        $this->out( "Something terribly awry; $this->failed duplicate accounts were not removed.\n" );
+
                        return false;
                }
 
                if ( $this->trimmed == 0 || $doDelete ) {
                        $this->out( "It is now safe to apply the unique index on user_name.\n" );
+
                        return true;
                } else {
                        $this->out( "Run this script again with the --fix option to automatically delete them.\n" );
+
                        return false;
                }
        }
@@ -196,6 +201,7 @@ class UserDupes {
                foreach ( $result as $row ) {
                        $list[] = $row->user_name;
                }
+
                return $list;
        }
 
@@ -288,5 +294,4 @@ class UserDupes {
                $this->db->delete( 'user', array( 'user_id' => $userid ), __METHOD__ );
                $this->out( " ok" );
        }
-
 }
index 5998cb5..9b8714d 100644 (file)
@@ -107,7 +107,8 @@ class UserOptions {
                        return false;
                }
 
-               $this->{ $this->mMode } ();
+               $this->{$this->mMode}();
+
                return true;
        }
 
@@ -139,7 +140,7 @@ class UserOptions {
                        array( 'user_id' ),
                        array(),
                        __METHOD__
-                       );
+               );
 
                foreach ( $result as $id ) {
 
@@ -159,7 +160,6 @@ class UserOptions {
                                        @$ret[$this->mAnOption][$userValue]++;
                                        // @codingStandardsIgnoreEnd
                                }
-
                        } else {
 
                                foreach ( $defaultOptions as $name => $defaultValue ) {
@@ -192,7 +192,7 @@ class UserOptions {
                        array( 'user_id' ),
                        array(),
                        __METHOD__
-                       );
+               );
 
                foreach ( $result as $id ) {
 
@@ -218,7 +218,6 @@ class UserOptions {
                                if ( !$this->mQuiet ) {
                                        print " OK\n";
                                }
-
                        } elseif ( !$this->mQuiet ) {
                                print "Not changing '$username' using <{$this->mAnOption}> = '$curValue'\n";
                        }
@@ -235,6 +234,7 @@ class UserOptions {
                foreach ( $def as $optname => $defaultValue ) {
                        array_push( $ret, $optname );
                }
+
                return $ret;
        }
 
@@ -243,7 +243,7 @@ class UserOptions {
        #
 
        public static function showUsageAndExit() {
-print <<<USAGE
+               print <<<USAGE
 
 This script pass through all users and change one of their options.
 The new option is NOT validated.
@@ -267,7 +267,7 @@ Options:
        --dry   : do not save user settings back to database
 
 USAGE;
-       exit( 0 );
+               exit( 0 );
        }
 
        /**
@@ -280,14 +280,14 @@ USAGE;
                        return true;
                }
 
-print <<<WARN
+               print <<<WARN
 The script is about to change the skin for ALL USERS in the database.
 Users with option <$this->mAnOption> = '$this->mOldValue' will be made to use '$this->mNewValue'.
 
 Abort with control-c in the next five seconds....
 WARN;
                wfCountDown( 5 );
+
                return true;
        }
-
 }
index a62d161..c9b1abb 100644 (file)
@@ -34,6 +34,7 @@ class WaitForSlave extends Maintenance {
                parent::__construct();
                $this->addArg( 'maxlag', 'How long to wait for the slaves, default 10 seconds', false );
        }
+
        public function execute() {
                wfWaitForSlaves( $this->getArg( 0, 10 ) );
        }
index a3c427e..e5e87f4 100644 (file)
@@ -185,6 +185,13 @@ return array(
 
        /* jQuery Plugins */
 
+       'jquery.accessKeyLabel' => array(
+               'scripts' => 'resources/src/jquery/jquery.accessKeyLabel.js',
+               'dependencies' => array(
+                       'jquery.client',
+               ),
+               'targets' => array( 'mobile', 'desktop' ),
+       ),
        'jquery.appear' => array(
                'scripts' => 'resources/lib/jquery/jquery.appear.js',
        ),
@@ -897,7 +904,7 @@ return array(
        'mediawiki.util' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.util.js',
                'dependencies' => array(
-                       'jquery.client',
+                       'jquery.accessKeyLabel',
                        'jquery.mwExtension',
                        'mediawiki.notify',
                ),
@@ -1062,6 +1069,8 @@ return array(
                )
        ),
 
+       'mediawiki.language.names' => array( 'class' => 'ResourceLoaderLanguageNamesModule' ),
+
        /* MediaWiki Libs */
 
        'mediawiki.libs.jpegmeta' => array(
index 137322a..44247ca 100644 (file)
@@ -8,5 +8,7 @@
        },
        "ooui-dialog-action-close": "Serriñ",
        "ooui-outline-control-move-down": "Lakaat an elfenn da ziskenn",
-       "ooui-outline-control-move-up": "Lakaat an elfenn da bignat"
+       "ooui-outline-control-move-up": "Lakaat an elfenn da bignat",
+       "ooui-outline-control-remove": "Tennañ an elfenn",
+       "ooui-toolbar-more": "Muioc'h"
 }
diff --git a/resources/lib/oojs-ui/i18n/oc.json b/resources/lib/oojs-ui/i18n/oc.json
new file mode 100644 (file)
index 0000000..4f8a988
--- /dev/null
@@ -0,0 +1,12 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Cedric31"
+               ]
+       },
+       "ooui-dialog-action-close": "Tampar",
+       "ooui-outline-control-move-down": "Far davalar l’element",
+       "ooui-outline-control-move-up": "Far montar l’element",
+       "ooui-outline-control-remove": "Suprimir l’element",
+       "ooui-toolbar-more": "Mai"
+}
index 2dcb198..085f908 100644 (file)
@@ -7,6 +7,6 @@
        "ooui-dialog-action-close": "Claise",
        "ooui-outline-control-move-down": "Muiv eetem doon",
        "ooui-outline-control-move-up": "Muiv eetem up",
-       "ooui-outline-control-remove": "Remuiv eitem",
+       "ooui-outline-control-remove": "Remuiv eetem",
        "ooui-toolbar-more": "Mair"
 }
index 0eec396..091dbaf 100644 (file)
@@ -9,5 +9,6 @@
        "ooui-dialog-action-close": "שליסן",
        "ooui-outline-control-move-down": "רוקן עלעמענט אראפ",
        "ooui-outline-control-move-up": "רוקן עלעמענט ארויף",
+       "ooui-outline-control-remove": "אַראָפנעמען איינס",
        "ooui-toolbar-more": "נאך"
 }
index da9bacc..56f5e6d 100644 (file)
                        "Shirayuki",
                        "Simon Shek",
                        "Spring Roll Conan",
-                       "Waihorace"
+                       "Waihorace",
+                       "Cwlin0416"
                ]
        },
        "ooui-dialog-action-close": "關閉",
-       "ooui-outline-control-move-down": "向下移項",
-       "ooui-outline-control-move-up": "向上移項",
-       "ooui-outline-control-remove": "移除項",
+       "ooui-outline-control-move-down": "項目下移",
+       "ooui-outline-control-move-up": "項目上移",
+       "ooui-outline-control-remove": "移除項",
        "ooui-toolbar-more": "更多"
 }
diff --git a/resources/lib/oojs-ui/images/icons/info.png b/resources/lib/oojs-ui/images/icons/info.png
new file mode 100644 (file)
index 0000000..f43804d
Binary files /dev/null and b/resources/lib/oojs-ui/images/icons/info.png differ
diff --git a/resources/lib/oojs-ui/images/icons/info.svg b/resources/lib/oojs-ui/images/icons/info.svg
new file mode 100644 (file)
index 0000000..8c5672a
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="24" height="24" viewBox="0, 0, 24, 24">
+  <g id="help" opacity="0.75">
+    <path d="M11.499,17 C8.463,17 6,14.536 6,11.5 C6,8.463 8.462,6 11.499,6 C14.536,6 17,8.462 17,11.5 C17,14.536 14.536,17 11.499,17 z M11.501,5 C7.91,5 5,7.91 5,11.5 C5,15.09 7.91,18 11.501,18 C15.089,18 18,15.089 18,11.5 C18,7.911 15.089,5 11.501,5 z" fill="#000000"/>
+    <path d="M12,10 L12,14 L13,14 L13,15 L10,15 L10,14 L11,14 L11,11 L10,11 L10,10 z" fill="#000000"/>
+    <path d="M11,8 L12,8 L12,9 L11,9 z" fill="#000000"/>
+  </g>
+  <defs/>
+</svg>
diff --git a/resources/lib/oojs-ui/images/indicators/alert.png b/resources/lib/oojs-ui/images/indicators/alert.png
new file mode 100644 (file)
index 0000000..bfc83e7
Binary files /dev/null and b/resources/lib/oojs-ui/images/indicators/alert.png differ
diff --git a/resources/lib/oojs-ui/images/indicators/alert.svg b/resources/lib/oojs-ui/images/indicators/alert.svg
new file mode 100644 (file)
index 0000000..8ce4b25
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12" height="12" viewBox="0, 0, 12, 12">
+  <g id="deprecated" opacity="0.75">
+    <path d="M6,12 C2.686,12 -0,9.314 -0,6 C-0,2.686 2.686,-0 6,-0 C9.314,-0 12,2.686 12,6 C12,9.314 9.314,12 6,12 z M5,7 L7,7 L7,2 L5,2 z M5,10 L7,10 L7,8 L5,8 z" fill="#000000"/>
+  </g>
+  <defs/>
+</svg>
index aeb35a3..d10e0d4 100644 (file)
Binary files a/resources/lib/oojs-ui/images/indicators/required.png and b/resources/lib/oojs-ui/images/indicators/required.png differ
index 7c60ec0..ee1baf7 100644 (file)
@@ -2,7 +2,9 @@
 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
 <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="12" height="12" viewBox="0, 0, 12, 12">
   <g id="required" opacity="0.75">
-    <path d="M7,0 L7,4.268 L10.696,2.134 L11.696,3.866 L8,6 L11.696,8.134 L10.696,9.866 L7,7.732 L7,12 L5,12 L5,7.732 L1.304,9.866 L0.304,8.134 L4,6 L0.304,3.866 L1.304,2.134 L5,4.268 L5,0 z" fill="#000000"/>
+    <path d="M5,1 L7,1 L7,11 L5,11 z" fill="#000000"/>
+    <path d="M9.83,2.634 L10.83,4.366 L2.17,9.366 L1.17,7.634 z" fill="#000000"/>
+    <path d="M1.17,4.366 L2.17,2.634 L10.83,7.634 L9.83,9.366 z" fill="#000000"/>
   </g>
   <defs/>
 </svg>
index 9e6cc6d..ac07802 100644 (file)
@@ -9,7 +9,7 @@
           transition: all 250ms ease-in-out;
 }
 
-.oo-ui-dialog .oo-ui-window-frame {
+.oo-ui-dialog .oo-ui-window-frame {
   background-color: #fff;
   border: solid 1px #ccc;
   border-radius: 0.5em;
@@ -30,7 +30,7 @@
   opacity: 1;
 }
 
-.oo-ui-dialog-open .oo-ui-window-frame {
+.oo-ui-dialog-open .oo-ui-window-frame {
   -webkit-transform: scale(1);
      -moz-transform: scale(1);
       -ms-transform: scale(1);
   padding-right: 1.5em;
 }
 
+.oo-ui-outlineItemWidget.oo-ui-indicatedElement .oo-ui-indicatedElement-indicator {
+  opacity: 0.5;
+}
+
 .oo-ui-outlineItemWidget-level-0 {
   padding-left: 3.5em;
 }
   font-style: italic;
 }
 
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-iconedElement-icon,
-.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-indicatedElement-indicator {
+.oo-ui-outlineItemWidget.oo-ui-flaggableElement-empty .oo-ui-iconedElement-icon {
   opacity: 0.5;
 }
 
index 47a9a93..92d7378 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (d4baf57069)
+ * OOjs UI v0.1.0-pre (bdbb9cfa55)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Mon Apr 21 2014 12:42:04 GMT-0700 (PDT)
+ * Date: Wed Apr 30 2014 16:34:11 GMT-0700 (PDT)
  */
 ( function ( OO ) {
 
@@ -173,7 +173,8 @@ OO.ui.resolveMsg = function ( msg ) {
  * @param {Object} [config] Configuration options
  * @cfg {Function} [$] jQuery for the frame the widget is in
  * @cfg {string[]} [classes] CSS class names
- * @cfg {jQuery} [$content] Content elements to append
+ * @cfg {string} [text] Text to insert
+ * @cfg {jQuery} [$content] Content elements to append (after text)
  */
 OO.ui.Element = function OoUiElement( config ) {
        // Configuration initialization
@@ -188,6 +189,9 @@ OO.ui.Element = function OoUiElement( config ) {
        if ( $.isArray( config.classes ) ) {
                this.$element.addClass( config.classes.join( ' ' ) );
        }
+       if ( config.text ) {
+               this.$element.text( config.text );
+       }
        if ( config.$content ) {
                this.$element.append( config.$content );
        }
@@ -612,32 +616,52 @@ OO.ui.Element.prototype.offDOMEvent = function ( event, callback ) {
 
 ( function () {
        // Static
-       var specialFocusin;
 
-       function handler( e ) {
-               jQuery.event.simulate( 'focusin', e.target, jQuery.event.fix( e ), /* bubble = */ true );
-       }
+       // jQuery 1.8.3 has a bug with handling focusin/focusout events inside iframes.
+       // Firefox doesn't support focusin/focusout at all, so we listen for 'focus'/'blur' on the
+       // document, and simulate a 'focusin'/'focusout' event on the target element and make
+       // it bubble from there.
+       //
+       // - http://jsfiddle.net/sw3hr/
+       // - http://bugs.jquery.com/ticket/14180
+       // - https://github.com/jquery/jquery/commit/1cecf64e5aa4153
+       function specialEvent( simulatedName, realName ) {
+               function handler( e ) {
+                       jQuery.event.simulate(
+                               simulatedName,
+                               e.target,
+                               jQuery.event.fix( e ),
+                               /* bubble = */ true
+                       );
+               }
 
-       specialFocusin = {
-               setup: function () {
-                       var doc = this.ownerDocument || this,
-                               attaches = $.data( doc, 'ooui-focusin-attaches' );
-                       if ( !attaches ) {
-                               doc.addEventListener( 'focus', handler, true );
-                       }
-                       $.data( doc, 'ooui-focusin-attaches', ( attaches || 0 ) + 1 );
-               },
-               teardown: function () {
-                       var doc = this.ownerDocument || this,
-                               attaches = $.data( doc, 'ooui-focusin-attaches' ) - 1;
-                       if ( !attaches ) {
-                               doc.removeEventListener( 'focus', handler, true );
-                               $.removeData( doc, 'ooui-focusin-attaches' );
-                       } else {
-                               $.data( doc, 'ooui-focusin-attaches', attaches );
+               return {
+                       setup: function () {
+                               var doc = this.ownerDocument || this,
+                                       attaches = $.data( doc, 'ooui-' + simulatedName + '-attaches' );
+                               if ( !attaches ) {
+                                       doc.addEventListener( realName, handler, true );
+                               }
+                               $.data( doc, 'ooui-' + simulatedName + '-attaches', ( attaches || 0 ) + 1 );
+                       },
+                       teardown: function () {
+                               var doc = this.ownerDocument || this,
+                                       attaches = $.data( doc, 'ooui-' + simulatedName + '-attaches' ) - 1;
+                               if ( !attaches ) {
+                                       doc.removeEventListener( realName, handler, true );
+                                       $.removeData( doc, 'ooui-' + simulatedName + '-attaches' );
+                               } else {
+                                       $.data( doc, 'ooui-' + simulatedName + '-attaches', attaches );
+                               }
                        }
-               }
-       };
+               };
+       }
+
+       var hasOwn = Object.prototype.hasOwnProperty,
+               specialEvents = {
+                       focusin: specialEvent( 'focusin', 'focus' ),
+                       focusout: specialEvent( 'focusout', 'blur' )
+               };
 
        /**
         * Bind a handler for an event on a DOM element.
@@ -654,25 +678,15 @@ OO.ui.Element.prototype.offDOMEvent = function ( event, callback ) {
        OO.ui.Element.onDOMEvent = function ( el, event, callback ) {
                var orig;
 
-               if ( event === 'focusin' ) {
-                       // jQuery 1.8.3 has a bug with handling focusin events inside iframes.
-                       // Firefox doesn't support focusin at all, so we listen for 'focus' on the
-                       // document, and simulate a 'focusin' event on the target element and make
-                       // it bubble from there.
-                       //
-                       // - http://jsfiddle.net/sw3hr/
-                       // - http://bugs.jquery.com/ticket/14180
-                       // - https://github.com/jquery/jquery/commit/1cecf64e5aa4153
-
+               if ( hasOwn.call( specialEvents, event ) ) {
                        // Replace jQuery's override with our own
-                       orig = $.event.special.focusin;
-                       $.event.special.focusin = specialFocusin;
+                       orig = $.event.special[event];
+                       $.event.special[event] = specialEvents[event];
 
                        $( el ).on( event, callback );
 
                        // Restore
-                       $.event.special.focusin = orig;
-
+                       $.event.special[event] = orig;
                } else {
                        $( el ).on( event, callback );
                }
@@ -688,11 +702,15 @@ OO.ui.Element.prototype.offDOMEvent = function ( event, callback ) {
         */
        OO.ui.Element.offDOMEvent = function ( el, event, callback ) {
                var orig;
-               if ( event === 'focusin' ) {
-                       orig = $.event.special.focusin;
-                       $.event.special.focusin = specialFocusin;
+               if ( hasOwn.call( specialEvents, event ) ) {
+                       // Replace jQuery's override with our own
+                       orig = $.event.special[event];
+                       $.event.special[event] = specialEvents[event];
+
                        $( el ).off( event, callback );
-                       $.event.special.focusin = orig;
+
+                       // Restore
+                       $.event.special[event] = orig;
                } else {
                        $( el ).off( event, callback );
                }
@@ -1279,7 +1297,9 @@ OO.ui.Window.prototype.teardown = function () {
  * Do not override this method. See #setup for a way to make changes each time the window opens.
  *
  * @param {Object} [data] Window opening data
+ * @fires opening
  * @fires open
+ * @fires ready
  * @chainable
  */
 OO.ui.Window.prototype.open = function ( data ) {
@@ -1290,13 +1310,16 @@ OO.ui.Window.prototype.open = function ( data ) {
                        this.visible = true;
                        this.emit( 'opening', data );
                        this.setup( data );
-                       // Focus the content div (which has a tabIndex) to inactivate
-                       // (but not clear) selections in the parent frame.
-                       // Must happen after setup runs (otherwise focusing it doesn't work)
-                       // but before 'open' is emitted (so subclasses can give focus to something else)
-                       this.frame.$content.focus();
                        this.emit( 'open', data );
-                       this.opening = false;
+                       setTimeout( OO.ui.bind( function () {
+                               // Focus the content div (which has a tabIndex) to inactivate
+                               // (but not clear) selections in the parent frame.
+                               // Must happen after 'open' is emitted (to ensure it is visible)
+                               // but before 'ready' is emitted (so subclasses can give focus to something else)
+                               this.frame.$content.focus();
+                               this.emit( 'ready', data );
+                               this.opening = false;
+                       }, this ) );
                }, this ) );
        }
 
@@ -1309,6 +1332,7 @@ OO.ui.Window.prototype.open = function ( data ) {
  * See #teardown for a way to do something each time the window closes.
  *
  * @param {Object} [data] Window closing data
+ * @fires closing
  * @fires close
  * @chainable
  */
@@ -2147,6 +2171,23 @@ OO.ui.FlaggableElement.prototype.getFlags = function () {
        return Object.keys( this.flags );
 };
 
+/**
+ * Clear all flags.
+ *
+ * @chainable
+ */
+OO.ui.FlaggableElement.prototype.clearFlags = function () {
+       var flag,
+               classPrefix = 'oo-ui-flaggableElement-';
+
+       for ( flag in this.flags ) {
+               delete this.flags[flag];
+               this.$element.removeClass( classPrefix + flag );
+       }
+
+       return this;
+};
+
 /**
  * Add one or more flags.
  *
@@ -2189,7 +2230,6 @@ OO.ui.FlaggableElement.prototype.setFlags = function ( flags ) {
  * @constructor
  * @param {jQuery} $group Container node, assigned to #$group
  * @param {Object} [config] Configuration options
- * @cfg {Object.<string,string>} [aggregations] Events to aggregate, keyed by item event name
  */
 OO.ui.GroupElement = function OoUiGroupElement( $group, config ) {
        // Configuration
@@ -2199,8 +2239,7 @@ OO.ui.GroupElement = function OoUiGroupElement( $group, config ) {
        this.$group = $group;
        this.items = [];
        this.$items = this.$( [] );
-       this.aggregate = !$.isEmptyObject( config.aggregations );
-       this.aggregations = config.aggregations || {};
+       this.aggregateItemEvents = {};
 };
 
 /* Methods */
@@ -2214,6 +2253,59 @@ OO.ui.GroupElement.prototype.getItems = function () {
        return this.items.slice( 0 );
 };
 
+/**
+ * Add an aggregate item event.
+ *
+ * Aggregated events are listened to on each item and then emitted by the group under a new name,
+ * and with an additional leading parameter containing the item that emitted the original event.
+ * Other arguments that were emitted from the original event are passed through.
+ *
+ * @param {Object.<string,string|null>} events Aggregate events emitted by group, keyed by item
+ *   event, use null value to remove aggregation
+ * @throws {Error} If aggregation already exists
+ */
+OO.ui.GroupElement.prototype.aggregate = function ( events ) {
+       var i, len, item, add, remove, itemEvent, groupEvent;
+
+       for ( itemEvent in events ) {
+               groupEvent = events[itemEvent];
+
+               // Remove existing aggregated event
+               if ( itemEvent in this.aggregateItemEvents ) {
+                       // Don't allow duplicate aggregations
+                       if ( groupEvent ) {
+                               throw new Error( 'Duplicate item event aggregation for ' + itemEvent );
+                       }
+                       // Remove event aggregation from existing items
+                       for ( i = 0, len = this.items.length; i < len; i++ ) {
+                               item = this.items[i];
+                               if ( item.connect && item.disconnect ) {
+                                       remove = {};
+                                       remove[itemEvent] = [ 'emit', groupEvent, item ];
+                                       item.disconnect( this, remove );
+                               }
+                       }
+                       // Prevent future items from aggregating event
+                       delete this.aggregateItemEvents[itemEvent];
+               }
+
+               // Add new aggregate event
+               if ( groupEvent ) {
+                       // Make future items aggregate event
+                       this.aggregateItemEvents[itemEvent] = groupEvent;
+                       // Add event aggregation to existing items
+                       for ( i = 0, len = this.items.length; i < len; i++ ) {
+                               item = this.items[i];
+                               if ( item.connect && item.disconnect ) {
+                                       add = {};
+                                       add[itemEvent] = [ 'emit', groupEvent, item ];
+                                       item.connect( this, add );
+                               }
+                       }
+               }
+       }
+};
+
 /**
  * Add items.
  *
@@ -2238,10 +2330,10 @@ OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
                        }
                }
                // Add the item
-               if ( this.aggregate ) {
+               if ( item.connect && item.disconnect && !$.isEmptyObject( this.aggregateItemEvents ) ) {
                        events = {};
-                       for ( event in this.aggregations ) {
-                               events[event] = [ 'emit', this.aggregations[event], item ];
+                       for ( event in this.aggregateItemEvents ) {
+                               events[event] = [ 'emit', this.aggregateItemEvents[event], item ];
                        }
                        item.connect( this, events );
                }
@@ -2274,15 +2366,22 @@ OO.ui.GroupElement.prototype.addItems = function ( items, index ) {
  * @chainable
  */
 OO.ui.GroupElement.prototype.removeItems = function ( items ) {
-       var i, len, item, index;
+       var i, len, item, index, remove, itemEvent;
 
        // Remove specific items
        for ( i = 0, len = items.length; i < len; i++ ) {
                item = items[i];
                index = $.inArray( item, this.items );
                if ( index !== -1 ) {
-                       if ( this.aggregate ) {
-                               item.disconnect( this );
+                       if (
+                               item.connect && item.disconnect &&
+                               !$.isEmptyObject( this.aggregateItemEvents )
+                       ) {
+                               remove = {};
+                               if ( itemEvent in this.aggregateItemEvents ) {
+                                       remove[itemEvent] = [ 'emit', this.aggregateItemEvents[itemEvent], item ];
+                               }
+                               item.disconnect( this, remove );
                        }
                        item.setElementGroup( null );
                        this.items.splice( index, 1 );
@@ -2302,13 +2401,20 @@ OO.ui.GroupElement.prototype.removeItems = function ( items ) {
  * @chainable
  */
 OO.ui.GroupElement.prototype.clearItems = function () {
-       var i, len, item;
+       var i, len, item, remove, itemEvent;
 
        // Remove all items
        for ( i = 0, len = this.items.length; i < len; i++ ) {
                item = this.items[i];
-               if ( this.aggregate ) {
-                       item.disconnect( this );
+               if (
+                       item.connect && item.disconnect &&
+                       !$.isEmptyObject( this.aggregateItemEvents )
+               ) {
+                       remove = {};
+                       if ( itemEvent in this.aggregateItemEvents ) {
+                               remove[itemEvent] = [ 'emit', this.aggregateItemEvents[itemEvent], item ];
+                       }
+                       item.disconnect( this, remove );
                }
                item.setElementGroup( null );
        }
@@ -3327,9 +3433,7 @@ OO.ui.ToolFactory.prototype.extract = function ( collection, used ) {
  */
 OO.ui.ToolGroup = function OoUiToolGroup( toolbar, config ) {
        // Configuration initialization
-       config = $.extend( true, {
-               'aggregations': { 'disable': 'itemDisable' }
-       }, config );
+       config = config || {};
 
        // Parent constructor
        OO.ui.ToolGroup.super.call( this, config );
@@ -3356,6 +3460,7 @@ OO.ui.ToolGroup = function OoUiToolGroup( toolbar, config ) {
                'mouseout': OO.ui.bind( this.onMouseOut, this )
        } );
        this.toolbar.getToolFactory().connect( this, { 'register': 'onToolFactoryRegister' } );
+       this.aggregate( { 'disable': 'itemDisable' } );
        this.connect( this, { 'itemDisable': 'updateDisabled' } );
 
        // Initialization
@@ -5447,7 +5552,7 @@ OO.ui.InputWidget.prototype.isReadOnly = function () {
  */
 OO.ui.InputWidget.prototype.setReadOnly = function ( state ) {
        this.readOnly = !!state;
-       this.$input.prop( 'readonly', this.readOnly );
+       this.$input.prop( 'readOnly', this.readOnly );
        return this;
 };
 
@@ -5663,6 +5768,15 @@ OO.ui.LookupInputWidget.prototype.onLookupInputChange = function () {
        this.openLookupMenu();
 };
 
+/**
+ * Get lookup menu.
+ *
+ * @return {OO.ui.TextInputMenuWidget}
+ */
+OO.ui.LookupInputWidget.prototype.getLookupMenu = function () {
+       return this.lookupMenu;
+};
+
 /**
  * Open the menu.
  *
@@ -5991,24 +6105,26 @@ OO.ui.OptionWidget.prototype.setPressed = function ( state ) {
  *
  * While flashing, the visual style of the pressed state is removed if present.
  *
- * @param {Function} [done] Callback to execute when flash effect is complete.
+ * @return {jQuery.Promise} Promise resolved when flashing is done
  */
-OO.ui.OptionWidget.prototype.flash = function ( done ) {
-       var $this = this.$element;
+OO.ui.OptionWidget.prototype.flash = function () {
+       var $this = this.$element,
+               deferred = $.Deferred();
 
        if ( !this.disabled && this.constructor.static.pressable ) {
                $this.removeClass( 'oo-ui-optionWidget-highlighted oo-ui-optionWidget-pressed' );
                setTimeout( OO.ui.bind( function () {
-                       $this.addClass( 'oo-ui-optionWidget-highlighted' );
-                       if ( done ) {
-                               // Restore original classes
-                               $this
-                                       .toggleClass( 'oo-ui-optionWidget-highlighted', this.highlighted )
-                                       .toggleClass( 'oo-ui-optionWidget-pressed', this.pressed );
-                               setTimeout( done, 100 );
-                       }
+                       // Restore original classes
+                       $this
+                               .toggleClass( 'oo-ui-optionWidget-highlighted', this.highlighted )
+                               .toggleClass( 'oo-ui-optionWidget-pressed', this.pressed );
+                       setTimeout( function () {
+                               deferred.resolve();
+                       }, 100 );
                }, this ), 100 );
        }
+
+       return deferred.promise();
 };
 
 /**
@@ -6679,7 +6795,7 @@ OO.ui.MenuWidget.prototype.chooseItem = function ( item ) {
 
        if ( item && !this.flashing ) {
                this.flashing = true;
-               item.flash( OO.ui.bind( function () {
+               item.flash().done( OO.ui.bind( function () {
                        this.hide();
                        this.flashing = false;
                }, this ) );
@@ -7689,6 +7805,13 @@ OO.ui.SearchWidget.prototype.clear = function () {
        this.query.setValue( '' );
 };
 
+/**
+ * Focus the query input.
+ */
+OO.ui.SearchWidget.prototype.focus = function () {
+       this.query.$input[0].focus();
+};
+
 /**
  * Get the results list.
  *
index ed564be..3a5268d 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (d4baf57069)
+ * OOjs UI v0.1.0-pre (bdbb9cfa55)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: Mon Apr 21 2014 12:42:04 GMT-0700 (PDT)
+ * Date: Wed Apr 30 2014 16:34:11 GMT-0700 (PDT)
  */
 
 /* Textures */
@@ -53,7 +53,7 @@
           backface-visibility: hidden;
 }
 
-.oo-ui-dialog .oo-ui-window-frame {
+.oo-ui-dialog .oo-ui-window-frame {
   position: fixed;
   top: 1em;
   right: 0;
   overflow: hidden;
 }
 
-.oo-ui-dialog-small .oo-ui-window-frame {
+.oo-ui-dialog > .oo-ui-window-frame .oo-ui-frame {
+  width: 100%;
+  height: 100%;
+}
+
+.oo-ui-dialog-small > .oo-ui-window-frame {
   width: 400px;
   max-height: 230px;
 }
 
-.oo-ui-dialog-medium .oo-ui-window-frame {
+.oo-ui-dialog-medium .oo-ui-window-frame {
   width: 600px;
   max-height: 460px;
 }
 
-.oo-ui-dialog-large .oo-ui-window-frame {
+.oo-ui-dialog-large .oo-ui-window-frame {
   width: 800px;
   max-height: 690px;
 }
 
-.oo-ui-dialog .oo-ui-frame {
-  width: 100%;
-  height: 100%;
-}
-
 .oo-ui-dialog-content .oo-ui-window-head,
 .oo-ui-dialog-content .oo-ui-window-body,
 .oo-ui-dialog-content .oo-ui-window-foot {
   background-image: /* @embed */ url(images/icons/help.svg);
 }
 
+.oo-ui-icon-info {
+  background-image: /* @embed */ url(images/icons/info.svg);
+}
+
 .oo-ui-icon-link {
   background-image: /* @embed */ url(images/icons/link.svg);
 }
 
 /* Indicators */
 
+.oo-ui-indicator-alert {
+  background-image: /* @embed */ url(images/indicators/alert.svg);
+}
+
 .oo-ui-indicator-down {
   background-image: /* @embed */ url(images/indicators/down.svg);
 }
index 3680fbe..6471516 100644 (file)
@@ -12,8 +12,6 @@
        color: black;
        max-width: 15em;
        border-radius: 4px;
-       -moz-border-radius: 4px;
-       -webkit-border-radius: 4px;
        /*
        -moz-box-shadow: 0px 2px 8px #cccccc;
        -webkit-box-shadow: 0px 2px 8px #cccccc;
@@ -72,4 +70,4 @@
        left: 0px;
        width: 6px;
        height: 11px;
-}
\ No newline at end of file
+}
index 300cdaa..8c2286d 100644 (file)
@@ -111,8 +111,6 @@ body .ui-button-large {
 .ui-button.ui-corner-top,
 .ui-button.ui-corner-left,
 .ui-button.ui-corner-tl {
-       -moz-border-radius-topleft: 4px;
-       -webkit-border-top-left-radius: 4px;
        border-top-left-radius: 4px;
 }
 .ui-button.ui-corner-all,
@@ -120,24 +118,18 @@ body .ui-button-large {
 
 .ui-button.ui-corner-right,
 .ui-button.ui-corner-tr {
-       -moz-border-radius-topright: 4px;
-       -webkit-border-top-right-radius: 4px;
        border-top-right-radius: 4px;
 }
 .ui-button.ui-corner-all,
 .ui-button.ui-corner-bottom,
 .ui-button.ui-corner-left,
 .ui-button.ui-corner-bl {
-       -moz-border-radius-bottomleft: 4px;
-       -webkit-border-bottom-left-radius: 4px;
        border-bottom-left-radius: 4px;
 }
 .ui-button.ui-corner-all,
 .ui-button.ui-corner-bottom,
 .ui-button.ui-corner-right,
 .ui-button.ui-corner-br {
-       -moz-border-radius-bottomright: 4px;
-       -webkit-border-bottom-right-radius: 4px;
        border-bottom-right-radius: 4px;
 }
 
index e39371d..8f46645 100644 (file)
 ----------------------------------*/
 
 /* Corner radius */
-.ui-corner-tl { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; }
-.ui-corner-tr { -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; }
-.ui-corner-bl { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; }
-.ui-corner-br { -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; }
-.ui-corner-top { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; }
-.ui-corner-bottom { -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; }
-.ui-corner-right {  -moz-border-radius-topright: 0; -webkit-border-top-right-radius: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-right-radius: 0; }
-.ui-corner-left { -moz-border-radius-topleft: 0; -webkit-border-top-left-radius: 0; -moz-border-radius-bottomleft: 0; -webkit-border-bottom-left-radius: 0; }
-.ui-corner-all { -moz-border-radius: 0; -webkit-border-radius: 0; }
+.ui-corner-tl { border-top-left-radius: 0; }
+.ui-corner-tr { border-top-right-radius: 0; }
+.ui-corner-bl { border-bottom-left-radius: 0; }
+.ui-corner-br { border-bottom-right-radius: 0; }
+.ui-corner-top { border-top-left-radius: 0; border-top-right-radius: 0; }
+.ui-corner-bottom { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }
+.ui-corner-right {  border-top-right-radius: 0; border-bottom-right-radius: 0; }
+.ui-corner-left { border-top-left-radius: 0; border-bottom-left-radius: 0; }
+.ui-corner-all { border-radius: 0; }
 
 /* Overlays */
 .ui-widget-overlay { background: #000000; opacity: .75;filter:Alpha(Opacity=75); }
-.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; /* @embed */ background: #000000 url(images/ui-bg_flat_70_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }
\ No newline at end of file
+.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; /* @embed */ background: #000000 url(images/ui-bg_flat_70_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); border-radius: 8px; }
diff --git a/resources/src/jquery/jquery.accessKeyLabel.js b/resources/src/jquery/jquery.accessKeyLabel.js
new file mode 100644 (file)
index 0000000..4caf072
--- /dev/null
@@ -0,0 +1,197 @@
+/**
+ * jQuery plugin to update the tooltip to show the correct access key
+ *
+ * @class jQuery.plugin.accessKeyLabel
+ */
+( function ( $ ) {
+
+// Cached access key prefix for used browser
+var cachedAccessKeyPrefix,
+
+       // Wether to use 'test-' instead of correct prefix (used for testing)
+       useTestPrefix = false,
+
+       // tag names which can have a label tag
+       // https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#Form-associated_content
+       labelable = 'button, input, textarea, keygen, meter, output, progress, select';
+
+/**
+ * Get the prefix for the access key for browsers that don't support accessKeyLabel.
+ *
+ * For browsers that support accessKeyLabel, #getAccessKeyLabel never calls here.
+ *
+ * @private
+ * @param {Object} [ua] An object with a 'userAgent' and 'platform' property.
+ * @return {string} Access key prefix
+ */
+function getAccessKeyPrefix( ua ) {
+       // use cached prefix if possible
+       if ( !ua && cachedAccessKeyPrefix ) {
+               return cachedAccessKeyPrefix;
+       }
+
+       var profile = $.client.profile( ua ),
+               accessKeyPrefix = 'alt-';
+
+       // Opera on any platform
+       if ( profile.name === 'opera' ) {
+               accessKeyPrefix = 'shift-esc-';
+
+       // Chrome on any platform
+       } else if ( profile.name === 'chrome' ) {
+               accessKeyPrefix = (
+                       profile.platform === 'mac'
+                               // Chrome on Mac
+                               ? 'ctrl-option-'
+                               // Chrome on Windows or Linux
+                               // (both alt- and alt-shift work, but alt with E, D, F etc does not
+                               // work since they are browser shortcuts)
+                               : 'alt-shift-'
+               );
+
+       // Non-Windows Safari with webkit_version > 526
+       } else if ( profile.platform !== 'win'
+               && profile.name === 'safari'
+               && profile.layoutVersion > 526
+       ) {
+               accessKeyPrefix = 'ctrl-alt-';
+
+       // Safari/Konqueror on any platform, or any browser on Mac
+       // (but not Safari on Windows)
+       } else if ( !( profile.platform === 'win' && profile.name === 'safari' )
+               && ( profile.name === 'safari'
+               || profile.platform === 'mac'
+               || profile.name === 'konqueror' )
+       ) {
+               accessKeyPrefix = 'ctrl-';
+
+       // Firefox/Iceweasel 2.x and later
+       } else if ( ( profile.name === 'firefox' || profile.name === 'iceweasel' )
+               && profile.versionBase > '1'
+       ) {
+               accessKeyPrefix = 'alt-shift-';
+       }
+
+       // cache prefix
+       if ( !ua ) {
+               cachedAccessKeyPrefix = accessKeyPrefix;
+       }
+       return accessKeyPrefix;
+}
+
+/**
+ * Get the access key label for an element.
+ *
+ * Will use native accessKeyLabel if available (currently only in Firefox 8+),
+ * falls back to #getAccessKeyPrefix.
+ *
+ * @private
+ * @param {HTMLElement} element Element to get the label for
+ * @return {string} Access key label
+ */
+function getAccessKeyLabel( element ) {
+       // abort early if no access key
+       if ( !element.accessKey ) {
+               return '';
+       }
+       // use accessKeyLabel if possible
+       // http://www.whatwg.org/specs/web-apps/current-work/multipage/editing.html#dom-accesskeylabel
+       if ( !useTestPrefix && element.accessKeyLabel ) {
+               return element.accessKeyLabel;
+       }
+       return ( useTestPrefix ? 'test-' : getAccessKeyPrefix() ) + element.accessKey;
+}
+
+/**
+ * Update the title for an element (on the element with the access key or it's label) to show
+ * the correct access key label.
+ *
+ * @private
+ * @param {HTMLElement} element Element with the accesskey
+ * @param {HTMLElement} titleElement Element with the title to update (may be the same as `element`)
+ */
+function updateTooltipOnElement( element, titleElement ) {
+       var oldTitle = titleElement.title,
+               rawTitle = oldTitle.replace( / \[.*?\]$/, '' ),
+               newTitle = rawTitle,
+               accessKeyLabel = getAccessKeyLabel( element );
+
+       // don't add a title if the element didn't have one before
+       if ( !oldTitle ) {
+               return;
+       }
+
+       if ( accessKeyLabel ) {
+               newTitle += ' [' + accessKeyLabel + ']';
+       }
+       if ( oldTitle !== newTitle ) {
+               titleElement.title = newTitle;
+       }
+}
+
+/**
+ * Update the title for an element to show the correct access key label.
+ *
+ * @private
+ * @param {HTMLElement} element Element with the accesskey
+ */
+function updateTooltip( element ) {
+       var id, $element, $label, $labelParent;
+       updateTooltipOnElement( element, element );
+
+       // update associated label if there is one
+       $element = $( element );
+       if ( $element.is( labelable ) ) {
+               // Search it using 'for' attribute
+               id = element.id.replace( /"/g, '\\"' );
+               if ( id ) {
+                       $label = $( 'label[for="' + id + '"]' );
+                       if ( $label.length === 1 ) {
+                               updateTooltipOnElement( element, $label[0] );
+                       }
+               }
+
+               // Search it as parent, because the form control can also inside the label element itself
+               $labelParent = $element.parents( 'label' );
+               if ( $labelParent.length === 1 ) {
+                       updateTooltipOnElement( element, $labelParent[0] );
+               }
+       }
+}
+
+/**
+ * Update the titles for all elements in a jQuery selection.
+ *
+ * @return {jQuery}
+ * @chainable
+ */
+$.fn.updateTooltipAccessKeys = function () {
+       return this.each( function () {
+               updateTooltip( this );
+       } );
+};
+
+/**
+ * Exposed for testing.
+ *
+ * @method updateTooltipAccessKeys_getAccessKeyPrefix
+ * @inheritdoc #getAccessKeyPrefix
+ */
+$.fn.updateTooltipAccessKeys.getAccessKeyPrefix = getAccessKeyPrefix;
+
+/**
+ * Switch test mode on and off.
+ *
+ * @method updateTooltipAccessKeys_setTestMode
+ * @param {boolean} mode New mode
+ */
+$.fn.updateTooltipAccessKeys.setTestMode = function ( mode ) {
+       useTestPrefix = mode;
+};
+
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.accessKeyLabel
+ */
+
+}( jQuery ) );
index 398937e..7fe25ee 100644 (file)
@@ -1,14 +1,19 @@
 /**
- * jQuery.byteLength
- *
- * Calculate the byte length of a string (accounting for UTF-8).
- *
+ * @class jQuery.plugin.byteLength
  * @author Jan Paul Posma, 2011
  * @author Timo Tijhof, 2012
  * @author David Chan, 2013
  */
-jQuery.byteLength = function ( str ) {
 
+/**
+ * Calculate the byte length of a string (accounting for UTF-8).
+ *
+ * @static
+ * @inheritable
+ * @param {string} str
+ * @return {string}
+ */
+jQuery.byteLength = function ( str ) {
        // This basically figures out how many bytes a UTF-16 string (which is what js sees)
        // will take in UTF-8 by replacing a 2 byte character with 2 *'s, etc, and counting that.
        // Note, surrogate (\uD800-\uDFFF) characters are counted as 2 bytes, since there's two of them
@@ -27,5 +32,9 @@ jQuery.byteLength = function ( str ) {
                .replace( /[\u0080-\u07FF\uD800-\uDFFF]/g, '**' )
                .replace( /[\u0800-\uD7FF\uE000-\uFFFF]/g, '***' )
                .length;
-
 };
+
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.byteLength
+ */
index b206566..d99e9f0 100644 (file)
@@ -1,13 +1,15 @@
 /**
- * jQuery checkboxShiftClick
- *
- * This will enable checkboxes to be checked or unchecked in a row by clicking one,
- * holding shift and clicking another one.
- *
- * @author Timo Tijhof, 2011 - 2012
- * @license GPL v2
+ * @class jQuery.plugin.checkboxShiftClick
  */
 ( function ( $ ) {
+
+       /**
+        * Enable checkboxes to be checked or unchecked in a row by clicking one,
+        * holding shift and clicking another one.
+        *
+        * @return {jQuery}
+        * @chainable
+        */
        $.fn.checkboxShiftClick = function () {
                var prevCheckbox = null,
                        $box = this;
                } );
                return $box;
        };
+
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.checkboxShiftClick
+        */
+
 }( jQuery ) );
index 6689b7c..662a688 100644 (file)
@@ -1,35 +1,36 @@
 /**
  * User-agent detection
+ *
+ * @class jQuery.client
+ * @singleton
  */
 ( function ( $ ) {
 
-       /* Private Members */
-
        /**
-        * @var {Object} profileCache Keyed by userAgent string,
+        * @private
+        * @property {Object} profileCache Keyed by userAgent string,
         * value is the parsed $.client.profile object for that user agent.
         */
        var profileCache = {};
 
-       /* Public Methods */
-
        $.client = {
 
                /**
                 * Get an object containing information about the client.
                 *
-                * @param {Object} nav An object with atleast a 'userAgent' and 'platform' key.
-                * Defaults to the global Navigator object.
+                * @param {Object} [nav] An object with a 'userAgent' and 'platform' property.
+                *  Defaults to the global `navigator` object.
                 * @return {Object} The resulting client object will be in the following format:
-                *  {
-                *   'name': 'firefox',
-                *   'layout': 'gecko',
-                *   'layoutVersion': 20101026,
-                *   'platform': 'linux'
-                *   'version': '3.5.1',
-                *   'versionBase': '3',
-                *   'versionNumber': 3.5,
-                *  }
+                *
+                *     {
+                *         'name': 'firefox',
+                *         'layout': 'gecko',
+                *         'layoutVersion': 20101026,
+                *         'platform': 'linux'
+                *         'version': '3.5.1',
+                *         'versionBase': '3',
+                *         'versionNumber': 3.5,
+                *     }
                 */
                profile: function ( nav ) {
                        /*jshint boss: true */
@@ -47,7 +48,7 @@
                                versionNumber,
                                key = nav.userAgent + '|' + nav.platform,
 
-                               /* Configuration */
+                               // Configuration
 
                                // Name of browsers or layout engines we don't recognize
                                uk = 'unknown',
                                // Translations for conforming operating system names
                                platformTranslations = [ ['sunos', 'solaris'], ['wow64', 'win'] ],
 
-                               /* Methods */
-
                                /**
                                 * Performs multiple replacements on a string
+                                * @ignore
                                 */
                                translate = function ( source, translations ) {
                                        var i;
                                        return source;
                                },
 
-                               /* Pre-processing */
+                               // Pre-processing
 
                                ua = nav.userAgent,
                                match,
                        // Everything will be in lowercase from now on
                        ua = ua.toLowerCase();
 
-                       /* Extraction */
+                       // Extraction
 
                        if ( match = new RegExp( '(' + names.join( '|' ) + ')' ).exec( ua ) ) {
                                name = translate( match[1], nameTranslations );
                                version = match[3];
                        }
 
-                       /* Edge Cases -- did I mention about how user agent string lie? */
+                       // Edge Cases -- did I mention about how user agent string lie?
 
                        // Decode Safari's crazy 400+ version numbers
                        if ( name === 'safari' && version > 400 ) {
 
                        versionNumber = parseFloat( version, 10 ) || 0.0;
 
-                       /* Caching */
+                       // Caching
 
                        return profileCache[ key  ] = {
                                name: name,
                 * algorithm, similar to PHP's version_compare ('1.2' < '1.11').
                 *
                 * A browser map is in the following format:
-                * {
-                *   // Multiple rules with configurable operators
-                *   'msie': [['>=', 7], ['!=', 9]],
-                *    // Match no versions
-                *   'iphone': false,
-                *    // Match any version
-                *   'android': null
-                * }
+                *
+                *     {
+                *         // Multiple rules with configurable operators
+                *         'msie': [['>=', 7], ['!=', 9]],
+                *         // Match no versions
+                *         'iphone': false,
+                *         // Match any version
+                *         'android': null
+                *     }
                 *
                 * It can optionally be split into ltr/rtl sections:
-                * {
-                *   'ltr': {
-                *     'android': null,
-                *     'iphone': false
-                *   },
-                *   'rtl': {
-                *     'android': false,
-                *     // rules are not inherited from ltr
-                *     'iphone': false
-                *   }
-                * }
+                *
+                *     {
+                *         'ltr': {
+                *             'android': null,
+                *             'iphone': false
+                *         },
+                *         'rtl': {
+                *             'android': false,
+                *             // rules are not inherited from ltr
+                *             'iphone': false
+                *         }
+                *     }
                 *
                 * @param {Object} map Browser support map
                 * @param {Object} [profile] A client-profile object
index 37bf176..be770a9 100644 (file)
@@ -1,17 +1,27 @@
-/**
+/*!
  * jQuery Color Utilities
- * Written by Krinkle in 2011
+ *
  * Released under the MIT and GPL licenses.
+ *
  * Mostly based on other plugins and functions (linted and optimized a little).
  * Sources cited inline.
  */
 ( function ( $ ) {
+       /**
+        * @class jQuery.colorUtil
+        * @singleton
+        */
        $.colorUtil = {
 
-               // Color Conversion function from highlightFade
-               // By Blair Mitchelmore
-               // http://jquery.offput.ca/highlightFade/
-               // Parse strings looking for color tuples [255,255,255]
+               /**
+                * Parse CSS color strings looking for color tuples
+                *
+                * Based on highlightFade by Blair Mitchelmore
+                * <http://jquery.offput.ca/highlightFade/>
+                *
+                * @param {Array|string} color
+                * @return {Array}
+                */
                getRGB: function ( color ) {
                        /*jshint boss:true */
                        var result;
                        return $.colorUtil.colors[$.trim(color).toLowerCase()];
                },
 
-               // Some named colors to work with
-               // From Interface by Stefan Petre
-               // http://interface.eyecon.ro/
+               /**
+                * Named color map
+                *
+                * Based on Interface by Stefan Petre
+                * <http://interface.eyecon.ro/>
+                *
+                * @property {Object}
+                */
                colors: {
                        aqua: [0,255,255],
                        azure: [240,255,255],
                },
 
                /**
-                * http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
-                * Converts an RGB color value to HSL. Conversion formula
-                * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
-                * Assumes r, g, and b are contained in the set [0, 255] and
-                * returns h, s, and l in the set [0, 1].
+                * Convert an RGB color value to HSL.
                 *
-                * @param       Number  R               The red color value
-                * @param       Number  G               The green color value
-                * @param       Number  B               The blue color value
-                * @return      Array                   The HSL representation
+                * Conversion formula based on
+                * <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
+                *
+                * Adapted from <https://en.wikipedia.org/wiki/HSL_color_space>.
+                *
+                * Assumes `r`, `g`, and `b` are contained in the set `[0, 255]` and
+                * returns `h`, `s`, and `l` in the set `[0, 1]`.
+                *
+                * @param {number} r The red color value
+                * @param {number} g The green color value
+                * @param {number} b The blue color value
+                * @return {number[]} The HSL representation
                 */
-               rgbToHsl: function ( R, G, B ) {
+               rgbToHsl: function ( r, g, b ) {
+                       r = r / 255;
+                       g = g / 255;
+                       b = b / 255;
+
                        var d,
-                               r = R / 255,
-                               g = G / 255,
-                               b = B / 255,
-                               max = Math.max( r, g, b ), min = Math.min( r, g, b ),
+                               max = Math.max( r, g, b ),
+                               min = Math.min( r, g, b ),
                                h,
                                s,
                                l = (max + min) / 2;
                },
 
                /**
-                * http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
-                * Converts an HSL color value to RGB. Conversion formula
-                * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
-                * Assumes h, s, and l are contained in the set [0, 1] and
-                * returns r, g, and b in the set [0, 255].
+                * Convert an HSL color value to RGB.
+                *
+                * Conversion formula based on
+                * <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
+                *
+                * Adapted from <https://en.wikipedia.org/wiki/HSL_color_space>.
+                *
+                * Assumes `h`, `s`, and `l` are contained in the set `[0, 1]` and
+                * returns `r`, `g`, and `b` in the set `[0, 255]`.
                 *
-                * @param       Number  h               The hue
-                * @param       Number  s               The saturation
-                * @param       Number  l               The lightness
-                * @return      Array                   The RGB representation
+                * @param {number} h The hue
+                * @param {number} s The saturation
+                * @param {number} l The lightness
+                * @return {number[]} The RGB representation
                 */
                hslToRgb: function ( h, s, l ) {
                        var r, g, b, hue2rgb, q, p;
                },
 
                /**
-                * Get's a brighter or darker rgb() value string.
+                * Get a brighter or darker rgb() value string.
                 *
-                * @author Krinkle
+                * Usage:
                 *
-                * @example     getCSSColorMod( 'red', +0.1 )
-                * @example     getCSSColorMod( 'rgb(200,50,50)', -0.2 )
+                *     $.colorUtil.getColorBrightness( 'red', +0.1 );
+                *     // > "rgb(255,50,50)"
+                *     $.colorUtil.getColorBrightness( 'rgb(200,50,50)', -0.2 );
+                *     // > "rgb(118,29,29)"
                 *
-                * @param       Mixed   currentColor current value in css
-                * @param       Number  mod wanted brightness modification between -1 and 1
-                * @return      String 'rgb(r,g,b)'
+                * @param {Mixed} currentColor Current value in css
+                * @param {number} mod Wanted brightness modification between -1 and 1
+                * @return {string} Like `'rgb(r,g,b)'`
                 */
                getColorBrightness: function ( currentColor, mod ) {
                        var rgbArr = $.colorUtil.getRGB( currentColor ),
index 56fc32d..de745c3 100644 (file)
@@ -1,14 +1,5 @@
 /**
- * Utility to stack stuff in an overlay fixed on the bottom of the page.
- *
- * Usage:
- * <code>
- *     var hovzer = $.getFootHovzer();
- *     hovzer.$.append( $myCollection );
- *     hovzer.update();
- * </code>
- *
- * @author Timo Tijhof, 2012
+ * @class jQuery.plugin.footHovzer
  */
 ( function ( $ ) {
        var $hovzer, footHovzer, prevHeight, newHeight;
                return $hovzer;
        }
 
+       /**
+        * Utility to stack stuff in an overlay fixed on the bottom of the page.
+        *
+        * Usage:
+        *
+        *     var hovzer = $.getFootHovzer();
+        *     hovzer.$.append( $myCollection );
+        *     hovzer.update();
+        *
+        * @static
+        * @inheritable
+        * @return {jQuery.footHovzer}
+        */
+       $.getFootHovzer = function () {
+               footHovzer.$ = getHovzer();
+               return footHovzer;
+       };
+
+       /**
+        * @private
+        * @class jQuery.footHovzer
+        */
        footHovzer = {
+
+               /**
+                * @property {jQuery} $ The stack container
+                */
+
+               /**
+                * Update dimensions of stack to account for changes in the subtree.
+                */
                update: function () {
                        var $body;
 
                        $body = $( 'body' );
                        if ( prevHeight === undefined ) {
-                               prevHeight = getHovzer().outerHeight( /*includeMargin=*/true );
+                               prevHeight = getHovzer().outerHeight( /* includeMargin = */ true );
                                $body.css( 'paddingBottom', '+=' + prevHeight + 'px' );
                        } else {
                                newHeight = getHovzer().outerHeight( true );
@@ -37,9 +58,9 @@
                }
        };
 
-       $.getFootHovzer = function () {
-               footHovzer.$ = getHovzer();
-               return footHovzer;
-       };
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.footHovzer
+        */
 
 }( jQuery ) );
index 25b806b..c44831c 100644 (file)
@@ -1,7 +1,24 @@
 /**
- * Utility to get all attributes of an element directy as an object.
+ * @class jQuery.plugin.getAttrs
+ */
+
+/**
+ * Get the attributes of an element directy as a plain object.
+ *
+ * If there are more elements in the collection, like most jQuery get/read methods,
+ * this method will use the first element in the collection.
+ *
+ * In IE6, the `attributes` map of a node includes *all* allowed attributes
+ * for an element (including those not set). Those will have values like
+ * `undefined`, `null`, `0`, `false`, `""` or `"inherit"`.
  *
- * @author Timo Tijhof, 2011
+ * However there may be attributes genuinely set to one of those values, and there
+ * is no way to distinguish between attributes set to that and those not set and
+ * it being the default. If you need them, set `all` to `true`. They are filtered out
+ * by default.
+ *
+ * @param {boolean} [all=false]
+ * @return {Object}
  */
 jQuery.fn.getAttrs = function ( all ) {
        var map = this[0].attributes,
@@ -10,10 +27,6 @@ jQuery.fn.getAttrs = function ( all ) {
                i, v;
 
        for ( i = 0; i < len; i++ ) {
-               // IE6 includes *all* allowed attributes for thew element (including those
-               // not set). Those have values like undefined, null, 0, false, "" or "inherit".
-               // However there may be genuine attributes set to that. If you need them,
-               // set all to true. They are excluded by default.
                v = map[i].nodeValue;
                if ( all || ( v && v !== 'inherit' ) ) {
                        attrs[ map[i].nodeName ] = v;
@@ -22,3 +35,8 @@ jQuery.fn.getAttrs = function ( all ) {
 
        return attrs;
 };
+
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.getAttrs
+ */
index eb29db9..71b083b 100644 (file)
@@ -1,21 +1,27 @@
 /**
- * Responsive images based on 'srcset' and 'window.devicePixelRatio' emulation where needed.
+ * Responsive images based on `srcset` and `window.devicePixelRatio` emulation where needed.
  *
- * Call $().hidpi() on a document or part of a document to replace image srcs in that section.
+ * Call `.hidpi()` on a document or part of a document to proces image srcsets within that section.
  *
- * $.devicePixelRatio() can be used to supplement window.devicePixelRatio with support on
- * some additional browsers.
+ * `$.devicePixelRatio()` can be used as a substitute for `window.devicePixelRatio`.
+ * It provides a familiar interface to retrieve the pixel ratio for browsers that don't
+ * implement `window.devicePixelRatio` but do have a different way of getting it.
+ *
+ * @class jQuery.plugin.hidpi
  */
 ( function ( $ ) {
 
 /**
- * Detect reported or approximate device pixel ratio.
- * 1.0 means 1 CSS pixel is 1 hardware pixel
- * 2.0 means 1 CSS pixel is 2 hardware pixels
- * etc
+ * Get reported or approximate device pixel ratio.
+ *
+ * - 1.0 means 1 CSS pixel is 1 hardware pixel
+ * - 2.0 means 1 CSS pixel is 2 hardware pixels
+ * - etc.
  *
- * Uses window.devicePixelRatio if available, or CSS media queries on IE.
+ * Uses `window.devicePixelRatio` if available, or CSS media queries on IE.
  *
+ * @static
+ * @inheritable
  * @return {number} Device pixel ratio
  */
 $.devicePixelRatio = function () {
@@ -51,6 +57,7 @@ $.devicePixelRatio = function () {
  * native srcset support.
  *
  * @return {jQuery} This selection
+ * @chainable
  */
 $.fn.hidpi = function () {
        var $target = this,
@@ -81,9 +88,11 @@ $.fn.hidpi = function () {
  *
  * Exposed for testing.
  *
+ * @private
+ * @static
  * @param {number} devicePixelRatio
  * @param {string} srcset
- * @return {mixed} null or the matching src string
+ * @return {Mixed} null or the matching src string
  */
 $.matchSrcSet = function ( devicePixelRatio, srcset ) {
        var candidates,
@@ -112,4 +121,9 @@ $.matchSrcSet = function ( devicePixelRatio, srcset ) {
        return selectedSrc;
 };
 
+/**
+ * @class jQuery
+ * @mixins jQuery.plugin.hidpi
+ */
+
 }( jQuery ) );
index 01fde4c..c3fd626 100644 (file)
@@ -1,27 +1,22 @@
 /**
  * jQuery makeCollapsible
  *
- * This will enable collapsible-functionality on all passed elements.
- * - Will prevent binding twice to the same element.
- * - Initial state is expanded by default, this can be overriden by adding class
- *   "mw-collapsed" to the "mw-collapsible" element.
- * - Elements made collapsible have jQuery data "mw-made-collapsible" set to true.
- * - The inner content is wrapped in a "div.mw-collapsible-content" (except for tables and lists).
+ * Dual licensed:
+ * - CC BY 3.0 <http://creativecommons.org/licenses/by/3.0>
+ * - GPL2 <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
  *
- * @author Krinkle, 2011-2012
- *
- * Dual license:
- * @license CC BY 3.0 <http://creativecommons.org/licenses/by/3.0>
- * @license GPL2 <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
+ * @class jQuery.plugin.makeCollapsible
  */
 ( function ( $, mw ) {
+
        /**
         * Handler for a click on a collapsible toggler.
         *
+        * @private
         * @param {jQuery} $collapsible
         * @param {string} action The action this function will take ('expand' or 'collapse').
-        * @param {jQuery|null} [optional] $defaultToggle
-        * @param {Object|undefined} options
+        * @param {jQuery|null} [$defaultToggle]
+        * @param {Object|undefined} [options]
         */
        function toggleElement( $collapsible, action, $defaultToggle, options ) {
                var $collapsibleContent, $containers, hookCallback;
        }
 
        /**
-        * Handles clicking/keypressing on the collapsible element toggle and other
+        * Handle clicking/keypressing on the collapsible element toggle and other
         * situations where a collapsible element is toggled (e.g. the initial
         * toggle for collapsed ones).
         *
+        * @private
         * @param {jQuery} $toggle the clickable toggle itself
         * @param {jQuery} $collapsible the collapsible element
         * @param {jQuery.Event|null} e either the event or null if unavailable
        }
 
        /**
-        * Make any element collapsible.
+        * Enable collapsible-functionality on all elements in the collection.
+        *
+        * - Will prevent binding twice to the same element.
+        * - Initial state is expanded by default, this can be overriden by adding class
+        *   "mw-collapsed" to the "mw-collapsible" element.
+        * - Elements made collapsible have jQuery data "mw-made-collapsible" set to true.
+        * - The inner content is wrapped in a "div.mw-collapsible-content" (except for tables and lists).
         *
-        * Supported options:
-        * - collapseText: text to be used for the toggler when clicking it would
-        *   collapse the element. Default: the 'data-collapsetext' attribute of
-        *   the collapsible element or the content of 'collapsible-collapse'
-        *   message.
-        * - expandText: text to be used for the toggler when clicking it would
-        *   expand the element. Default: the 'data-expandtext' attribute of
-        *   the collapsible element or the content of 'collapsible-expand'
-        *   message.
-        * - collapsed: boolean, whether to collapse immediately. By default
+        * @param {Object} [options]
+        * @param {string} [options.collapseText] Text used for the toggler, when clicking it would
+        *   collapse the element. Default: the 'data-collapsetext' attribute of the
+        *   collapsible element or the content of 'collapsible-collapse' message.
+        * @param {string} [options.expandText] Text used for the toggler, when clicking it would
+        *   expand the element. Default: the 'data-expandtext' attribute of the
+        *   collapsible element or the content of 'collapsible-expand' message.
+        * @param {boolean} [options.collapsed] Whether to collapse immediately. By default
         *   collapse only if the elements has the 'mw-collapsible' class.
-        * - $customTogglers: jQuerified list of elements to be used as togglers
+        * @param {jQuery} [options.$customTogglers] Elements to be used as togglers
         *   for this collapsible element. By default, if the collapsible element
         *   has an id attribute like 'mw-customcollapsible-XXX', elements with a
         *   *class* of 'mw-customtoggle-XXX' are made togglers for it.
-        * - plainMode: boolean, whether to use a "plain mode" when making the
+        * @param {boolean} [options.plainMode=false] Whether to use a "plain mode" when making the
         *   element collapsible - that is, hide entire tables and lists (instead
         *   of hiding only all rows but first of tables, and hiding each list
         *   item separately for lists) and don't wrap other elements in
         *   div.mw-collapsible-content. May only be used with custom togglers.
+        * @return {jQuery}
+        * @chainable
         */
        $.fn.makeCollapsible = function ( options ) {
                if ( options === undefined ) {
                        }
                } );
        };
+
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.makeCollapsible
+        */
+
 }( jQuery, mediaWiki ) );
index cdae0ba..46cc8f2 100644 (file)
@@ -1,12 +1,12 @@
 /**
- * jQuery tabIndex
+ * @class jQuery.plugin.tabIndex
  */
 ( function ( $ ) {
 
        /**
-        * Finds the lowerst tabindex in use within a selection
+        * Find the lowest tabindex in use within a selection.
         *
-        * @return number Lowest tabindex on the page
+        * @return {number} Lowest tabindex on the page
         */
        $.fn.firstTabIndex = function () {
                var minTabIndex = null;
@@ -29,9 +29,9 @@
        };
 
        /**
-        * Finds the highest tabindex in use within a selection
+        * Find the highest tabindex in use within a selection.
         *
-        * @return number Highest tabindex on the page
+        * @return {number} Highest tabindex on the page
         */
        $.fn.lastTabIndex = function () {
                var maxTabIndex = null;
@@ -49,4 +49,9 @@
                return maxTabIndex;
        };
 
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.tabIndex
+        */
+
 }( jQuery ) );
index 49518fa..042db91 100644 (file)
@@ -70,7 +70,7 @@
                                var retval, range,
                                        el = this.get( 0 );
 
-                               if ( $( el ).is( ':hidden' ) ) {
+                               if ( !el || $( el ).is( ':hidden' ) ) {
                                        retval = '';
                                } else if ( document.selection && document.selection.createRange ) {
                                        activateElementOnIE( el );
                                                // Range containing text after the selection
                                                postRange;
 
-                                       if ( document.selection && document.selection.createRange ) {
+                                       if ( e && document.selection && document.selection.createRange ) {
                                                // IE doesn't properly report non-selected caret position through
                                                // the selection ranges when textarea isn't focused. This can
                                                // lead to saving a bogus empty selection, which then screws up
                                                } while ( ( !preFinished || !periFinished || !postFinished ) );
                                                caretPos = rawPreText.replace( /\r\n/g, '\n' ).length;
                                                endPos = caretPos + rawPeriText.replace( /\r\n/g, '\n' ).length;
-                                       } else if ( e.selectionStart || e.selectionStart === 0 ) {
+                                       } else if ( e && ( e.selectionStart || e.selectionStart === 0 ) ) {
                                                // Firefox support
                                                caretPos = e.selectionStart;
                                                endPos = e.selectionEnd;
index 4c2fc3a..6b212c2 100644 (file)
@@ -1,9 +1,10 @@
-/**
+/*!
  * Live edit preview.
  */
 ( function ( mw, $ ) {
 
        /**
+        * @ignore
         * @param {jQuery.Event} e
         */
        function doLivePreview( e ) {
index 2a02d87..8aa5a1f 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * JavaScript for History action
  */
 jQuery( function ( $ ) {
@@ -7,6 +7,7 @@ jQuery( function ( $ ) {
                $lis = $( '#pagehistory > li' );
 
        /**
+        * @ignore
         * @context {Element} input
         * @param e {jQuery.Event}
         */
index 727a525..2ded40c 100644 (file)
@@ -1,5 +1,5 @@
-/**
- * This module enables double-click-to-edit functionality.
+/*!
+ * Enables double-click-to-edit functionality.
  */
 ( function ( mw, $ ) {
        $( function () {
index 21f40c5..712cf29 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Exif metadata display for MediaWiki file uploads
  *
  * Add an expand/collapse link and collapse by default if set to
index 93befe3..ada101e 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * JavaScript to enable right click edit functionality.
  * When the user right-clicks in a heading, it will open the
  * edit screen.
index fd77025..5b9afcf 100644 (file)
         */
        mw.language = {
                /**
-                * Language-related data (keyed by language, contains instances of mw.Map). Loaded dynamically
-                * (see ResourceLoaderLanguageDataModule in PHP docs, aka mediawiki.language.data module).
+                * Language-related data (keyed by language, contains instances of mw.Map).
+                * Loaded dynamically (see ResourceLoaderLanguageDataModule class in PHP, registered
+                * as mediawiki.language.data on the client).
                 *
                 * To set data:
                 *
                 *     // Override, extend or create the language data object of 'nl'
                 *     mw.language.setData( 'nl', 'myKey', 'My value' );
                 *
-                *     // Set multiple values at once
+                *     // Set multiple key/values pairs at once
                 *     mw.language.setData( 'nl', { foo: 'X', bar: 'Y' } );
                 *
                 * To get GrammarForms data for language 'nl':
@@ -47,8 +48,8 @@
                 *
                 * @param {string} langCode
                 * @param {string} dataKey
-                * @return {Mixed} Value stored in the mw.Map (or `undefined` if there is no map for the specified
-                *  langCode).
+                * @return {Mixed} Value stored in the mw.Map (or `undefined` if there is no map for the
+                *  specified langCode)
                 */
                getData: function ( langCode, dataKey ) {
                        var langData = mw.language.data;
@@ -64,8 +65,8 @@
                 * Creates the data mw.Map if there isn't one for the specified language already.
                 *
                 * @param {string} langCode
-                * @param {string|Object} dataKey Key or object of key/values.
-                * @param {Mixed} value Value for dataKey, ignored if dataKey is an object.
+                * @param {string|Object} dataKey Key or object of key/values
+                * @param {Mixed} [value] Value for dataKey, omit if dataKey is an object
                 */
                setData: function ( langCode, dataKey, value ) {
                        var langData = mw.language.data;
index f92d372..e7c962f 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Show gallery captions when focused. Copied directly from jquery.mw-jump.js.
  * Also Dynamically resize images to justify them.
  */
                                                }
                                        }
                                }
-                       } )();
+                       }() );
                } );
        } );
-} )( jQuery, mediaWiki );
+}( jQuery, mediaWiki ) );
index 50301bd..4819be0 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Change multi-page image navigation so that the current page display can be changed
  * without a page reload. Currently, the only image formats that can be multi-page images are
  * PDF and DjVu files
index 5fb14dd..1fe0e26 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * Animate patrol links to use asynchronous API requests to
  * patrol pages, rather than navigating to a different URI.
  *
index f7a7eae..78b0b33 100644 (file)
@@ -31,6 +31,9 @@
        margin: 0;
        .box-sizing(border-box);
 
+       // Disable weird iOS styling
+       -webkit-appearance: none;
+
        // IE6/IE7 hack
        // http://stackoverflow.com/a/5838575/365238
        *display: inline;
index f6154ee..0f00d04 100644 (file)
@@ -471,7 +471,7 @@ var mw = ( function ( $, undefined ) {
                 *
                 * This was reserved for future use but never ended up being used.
                 *
-                * @deprecated since 1.22: Let deprecated identifiers keep their original name
+                * @deprecated since 1.22 Let deprecated identifiers keep their original name
                 *  and use mw.log#deprecate to create an access container for tracking.
                 * @property
                 */
@@ -538,7 +538,7 @@ var mw = ( function ( $, undefined ) {
                         */
                        log.warn = function () {
                                var console = window.console;
-                               if ( console && console.warn ) {
+                               if ( console && console.warn && console.warn.apply ) {
                                        console.warn.apply( console, arguments );
                                        if ( console.trace ) {
                                                console.trace();
@@ -786,7 +786,7 @@ var mw = ( function ( $, undefined ) {
                                                        try {
                                                                styleEl.styleSheet.cssText += cssText; // IE
                                                        } catch ( e ) {
-                                                               log( 'addEmbeddedCSS fail', e );
+                                                               log( 'Stylesheet error', e );
                                                        }
                                                } else {
                                                        styleEl.appendChild( document.createTextNode( String( cssText ) ) );
@@ -2025,7 +2025,9 @@ var mw = ( function ( $, undefined ) {
                                                                mw.loader.store.items = data.items;
                                                                return;
                                                        }
-                                               } catch ( e ) {}
+                                               } catch ( e ) {
+                                                       log( 'Storage error', e );
+                                               }
 
                                                if ( raw === undefined ) {
                                                        // localStorage failed; disable store
@@ -2102,6 +2104,7 @@ var mw = ( function ( $, undefined ) {
                                                                log( 'Detected malformed function stringification (bug 57567)' );
                                                        }
                                                } catch ( e ) {
+                                                       log( 'Storage error', e );
                                                        return;
                                                }
 
@@ -2172,7 +2175,9 @@ var mw = ( function ( $, undefined ) {
                                                                localStorage.removeItem( key );
                                                                data = JSON.stringify( mw.loader.store );
                                                                localStorage.setItem( key, data );
-                                                       } catch ( e ) {}
+                                                       } catch ( e ) {
+                                                               log( 'Storage error', e );
+                                                       }
                                                }
 
                                                return function () {
index 8344111..0cf897a 100644 (file)
@@ -90,7 +90,7 @@
 
                /**
                 * @inheritdoc #getName
-                * @deprecated since 1.20 use #getName instead
+                * @deprecated since 1.20 Use #getName instead
                 */
                name: function () {
                        return user.getName();
 
                /**
                 * @inheritdoc #isAnon
-                * @deprecated since 1.20 use #isAnon instead
+                * @deprecated since 1.20 Use #isAnon instead
                 */
                anonymous: function () {
                        return user.isAnon();
index a5bc7d9..f09d03c 100644 (file)
@@ -57,7 +57,7 @@
 
                                // Make sure we don't unset util.$content if it was preset and we don't find anything
                                return util.$content;
-                       } )();
+                       }() );
                },
 
                /* Main body */
                        return null;
                },
 
-               /**
-                * @property {string}
-                * Access key prefix.
-                */
-               tooltipAccessKeyPrefix: ( function () {
-                       var profile = $.client.profile();
-
-                       // Opera on any platform
-                       if ( profile.name === 'opera' ) {
-                               return 'shift-esc-';
-                       }
-
-                       // Chrome on any platform
-                       if ( profile.name === 'chrome' ) {
-                               if ( profile.platform === 'mac' ) {
-                                       // Chrome on Mac
-                                       return 'ctrl-option-';
-                               }
-                               // Chrome on Windows or Linux
-                               // (both alt- and alt-shift work, but alt with E, D, F etc does not
-                               // work since they are browser shortcuts)
-                               return 'alt-shift-';
-                       }
-
-                       // Non-Windows Safari with webkit_version > 526
-                       if ( profile.platform !== 'win'
-                               && profile.name === 'safari'
-                               && profile.layoutVersion > 526
-                       ) {
-                               return 'ctrl-alt-';
-                       }
-
-                       // Firefox 14+ on Mac
-                       if ( profile.platform === 'mac'
-                               && profile.name === 'firefox'
-                               && profile.versionNumber >= 14
-                       ) {
-                               return 'ctrl-option-';
-                       }
-
-                       // Safari/Konqueror on any platform, or any browser on Mac
-                       // (but not Safari on Windows)
-                       if ( !( profile.platform === 'win' && profile.name === 'safari' )
-                               && ( profile.name === 'safari'
-                               || profile.platform === 'mac'
-                               || profile.name === 'konqueror' )
-                       ) {
-                               return 'ctrl-';
-                       }
-
-                       // Firefox/Iceweasel 2.x and later
-                       if ( ( profile.name === 'firefox' || profile.name === 'iceweasel' )
-                               && profile.versionBase > '1' ) {
-                               return 'alt-shift-';
-                       }
-
-                       return 'alt-';
-               } )(),
-
-               /**
-                * @property {RegExp}
-                * Regex to match accesskey tooltips.
-                *
-                * Should match:
-                *
-                * - "ctrl-option-"
-                * - "alt-shift-"
-                * - "ctrl-alt-"
-                * - "ctrl-"
-                *
-                * The accesskey is matched in group $6.
-                */
-               tooltipAccessKeyRegexp: /\[(ctrl-)?(option-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
-
                /**
                 * Add the appropriate prefix to the accesskey shown in the tooltip.
                 *
                                $nodes = $( $nodes );
                        }
 
-                       $nodes.attr( 'title', function ( i, val ) {
-                               if ( val && util.tooltipAccessKeyRegexp.test( val ) ) {
-                                       return val.replace( util.tooltipAccessKeyRegexp,
-                                               '[' + util.tooltipAccessKeyPrefix + '$6]' );
-                               }
-                               return val;
-                       } );
+                       $nodes.updateTooltipAccessKeys();
                },
 
                /*
                                $item.attr( 'id', id );
                        }
 
-                       if ( tooltip ) {
-                               // Trim any existing accesskey hint and the trailing space
-                               tooltip = $.trim( tooltip.replace( util.tooltipAccessKeyRegexp, '' ) );
-                               if ( accesskey ) {
-                                       tooltip += ' [' + accesskey + ']';
-                               }
-                               $link.attr( 'title', tooltip );
-                               if ( accesskey ) {
-                                       util.updateTooltipAccessKeys( $link );
-                               }
-                       }
-
                        if ( accesskey ) {
                                $link.attr( 'accesskey', accesskey );
                        }
 
+                       if ( tooltip ) {
+                               $link.attr( 'title', tooltip ).updateTooltipAccessKeys();
+                       }
+
                        if ( nextnode ) {
                                if ( nextnode.nodeType || typeof nextnode === 'string' ) {
                                        // nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
 
                },
 
-               /**
-                * Add a little box at the top of the screen to inform the user of
-                * something, replacing any previous message.
-                * Calling with no arguments, with an empty string or null will hide the message
-                *
-                * @param {Mixed} message The DOM-element, jQuery object or HTML-string to be put inside the message box.
-                * to allow CSS/JS to hide different boxes. null = no class used.
-                * @deprecated since 1.20 Use mw#notify
-                */
-               jsMessage: function ( message ) {
-                       if ( !arguments.length || message === '' || message === null ) {
-                               return true;
-                       }
-                       if ( typeof message !== 'object' ) {
-                               message = $.parseHTML( message );
-                       }
-                       mw.notify( message, { autoHide: true, tag: 'legacy' } );
-                       return true;
-               },
-
                /**
                 * Validate a string as representing a valid e-mail address
                 * according to HTML5 specification. Please note the specification
         */
        mw.log.deprecate( util, 'wikiGetlink', util.getUrl, 'Use mw.util.getUrl instead.' );
 
+       /**
+        * @property {string} tooltipAccessKeyPrefix
+        * Access key prefix. Might be wrong for browsers implementing the accessKeyLabel property.
+        * @deprecated since 1.24 Use the module jquery.accessKeyLabel instead.
+        */
+       mw.log.deprecate( util, 'tooltipAccessKeyPrefix', $.fn.updateTooltipAccessKeys.getAccessKeyPrefix(), 'Use jquery.accessKeyLabel instead.' );
+
+       /**
+        * @property {RegExp} tooltipAccessKeyRegexp
+        * Regex to match accesskey tooltips.
+        *
+        * Should match:
+        *
+        * - "ctrl-option-"
+        * - "alt-shift-"
+        * - "ctrl-alt-"
+        * - "ctrl-"
+        *
+        * The accesskey is matched in group $6.
+        *
+        * Will probably not work for browsers implementing the accessKeyLabel property.
+        *
+        * @deprecated since 1.24 Use the module jquery.accessKeyLabel instead.
+        */
+       mw.log.deprecate( util, 'tooltipAccessKeyRegexp', /\[(ctrl-)?(option-)?(alt-)?(shift-)?(esc-)?(.)\]$/, 'Use jquery.accessKeyLabel instead.' );
+
+       /**
+        * @method jsMessage
+        * Add a little box at the top of the screen to inform the user of
+        * something, replacing any previous message.
+        * Calling with no arguments, with an empty string or null will hide the message
+        *
+        * @param {Mixed} message The DOM-element, jQuery object or HTML-string to be put inside the message box.
+        * to allow CSS/JS to hide different boxes. null = no class used.
+        * @deprecated since 1.20 Use mw#notify
+        */
+       mw.log.deprecate( util, 'jsMessage', function ( message ) {
+               if ( !arguments.length || message === '' || message === null ) {
+                       return true;
+               }
+               if ( typeof message !== 'object' ) {
+                       message = $.parseHTML( message );
+               }
+               mw.notify( message, { autoHide: true, tag: 'legacy' } );
+               return true;
+       }, 'Use mw.notify instead.' );
+
        mw.util = util;
 
 }( mediaWiki, jQuery ) );
index 3b53468..ad500ea 100644 (file)
@@ -31,9 +31,10 @@ if ( !defined( 'MEDIAWIKI' ) ) {
  * @ingroup Skins
  */
 class SkinCologneBlue extends SkinTemplate {
-       var $skinname = 'cologneblue', $stylename = 'cologneblue',
-               $template = 'CologneBlueTemplate';
-       var $useHeadElement = true;
+       public $skinname = 'cologneblue';
+       public $stylename = 'cologneblue';
+       public $template = 'CologneBlueTemplate';
+       public $useHeadElement = true;
 
        /**
         * @param OutputPage $out
@@ -155,7 +156,11 @@ class CologneBlueTemplate extends BaseTemplate {
                        $navlink['text'] = wfMessage( $message )->escaped();
                }
 
-               return $this->makeListItem( $key, $this->processNavlinkForDocument( $navlink ), array( 'tag' => 'span' ) );
+               return $this->makeListItem(
+                       $key,
+                       $this->processNavlinkForDocument( $navlink ),
+                       array( 'tag' => 'span' )
+               );
        }
 
        function bottomLinks() {
@@ -170,10 +175,22 @@ class CologneBlueTemplate extends BaseTemplate {
 
                        $editLinkMessage = $this->getSkin()->getTitle()->exists() ? 'editthispage' : 'create-this-page';
                        $element[] = $this->processBottomLink( 'edit', $content_nav['views']['edit'], $editLinkMessage );
-                       $element[] = $this->processBottomLink( 'viewsource', $content_nav['views']['viewsource'], 'viewsource' );
-
-                       $element[] = $this->processBottomLink( 'watch', $content_nav['actions']['watch'], 'watchthispage' );
-                       $element[] = $this->processBottomLink( 'unwatch', $content_nav['actions']['unwatch'], 'unwatchthispage' );
+                       $element[] = $this->processBottomLink(
+                               'viewsource',
+                               $content_nav['views']['viewsource'],
+                               'viewsource'
+                       );
+
+                       $element[] = $this->processBottomLink(
+                               'watch',
+                               $content_nav['actions']['watch'],
+                               'watchthispage'
+                       );
+                       $element[] = $this->processBottomLink(
+                               'unwatch',
+                               $content_nav['actions']['unwatch'],
+                               'unwatchthispage'
+                       );
 
                        $element[] = $this->talkLink();
 
@@ -190,11 +207,27 @@ class CologneBlueTemplate extends BaseTemplate {
                        // Second row. Privileged actions.
                        $element = array();
 
-                       $element[] = $this->processBottomLink( 'delete', $content_nav['actions']['delete'], 'deletethispage' );
-                       $element[] = $this->processBottomLink( 'undelete', $content_nav['actions']['undelete'], 'undeletethispage' );
-
-                       $element[] = $this->processBottomLink( 'protect', $content_nav['actions']['protect'], 'protectthispage' );
-                       $element[] = $this->processBottomLink( 'unprotect', $content_nav['actions']['unprotect'], 'unprotectthispage' );
+                       $element[] = $this->processBottomLink(
+                               'delete',
+                               $content_nav['actions']['delete'],
+                               'deletethispage'
+                       );
+                       $element[] = $this->processBottomLink(
+                               'undelete',
+                               $content_nav['actions']['undelete'],
+                               'undeletethispage'
+                       );
+
+                       $element[] = $this->processBottomLink(
+                               'protect',
+                               $content_nav['actions']['protect'],
+                               'protectthispage'
+                       );
+                       $element[] = $this->processBottomLink(
+                               'unprotect',
+                               $content_nav['actions']['unprotect'],
+                               'unprotectthispage'
+                       );
 
                        $element[] = $this->processBottomLink( 'move', $content_nav['actions']['move'], 'movethispage' );
 
@@ -241,8 +274,9 @@ class CologneBlueTemplate extends BaseTemplate {
                        $message = $companionTitle->isTalkPage() ? 'talkpage' : 'articlepage';
                }
 
-               // Obviously this can't be reasonable and just return the key for talk namespace, only for content ones.
-               // Thus we have to mangle it in exactly the same way SkinTemplate does. (bug 40805)
+               // Obviously this can't be reasonable and just return the key for talk
+               // namespace, only for content ones. Thus we have to mangle it in
+               // exactly the same way SkinTemplate does. (bug 40805)
                $key = $companionTitle->getNamespaceKey( '' );
                if ( $companionTitle->isTalkPage() ) {
                        $key = ( $key == 'main' ? 'talk' : $key . "_talk" );
@@ -250,17 +284,19 @@ class CologneBlueTemplate extends BaseTemplate {
 
                // Use the regular navigational link, but replace its text. Everything else stays unmodified.
                $namespacesLinks = $this->data['content_navigation']['namespaces'];
+
                return $this->processBottomLink( $message, $namespacesLinks[$key], $message );
        }
 
        /**
         * Takes a navigational link generated by SkinTemplate in whichever way
-        * and mangles attributes unsuitable for repeated use. In particular, this modifies the ids
-        * and removes the accesskeys. This is necessary to be able to use the same navlink twice,
-        * e.g. in sidebar and in footer.
+        * and mangles attributes unsuitable for repeated use. In particular, this
+        * modifies the ids and removes the accesskeys. This is necessary to be
+        * able to use the same navlink twice, e.g. in sidebar and in footer.
         *
         * @param array $navlink Navigational link generated by SkinTemplate
-        * @param mixed $idPrefix Prefix to add to id of this navlink. If false, id is removed entirely. Default is 'cb-'.
+        * @param mixed $idPrefix Prefix to add to id of this navlink. If false, id
+        *   is removed entirely. Default is 'cb-'.
         */
        function processNavlinkForDocument( $navlink, $idPrefix = 'cb-' ) {
                if ( $navlink['id'] ) {
@@ -283,42 +319,66 @@ class CologneBlueTemplate extends BaseTemplate {
         */
        function beforeContent() {
                ob_start();
-?>
-<div id="content">
-       <div id="topbar">
-               <p id="sitetitle" role="banner">
-                       <a href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>">
-                               <?php echo wfMessage( 'sitetitle' )->escaped() ?>
-                       </a>
-               </p>
-               <p id="sitesub"><?php echo wfMessage( 'sitesubtitle' )->escaped() ?></p>
-               <div id="linkcollection" role="navigation">
-                       <div id="langlinks"><?php echo str_replace( '<br />', '', $this->otherLanguages() ) ?></div>
-                       <?php echo $this->getSkin()->getCategories() ?>
-                       <div id="titlelinks"><?php echo $this->pageTitleLinks() ?></div>
-                       <?php if ( $this->data['newtalk'] ) { ?>
-                       <div class="usermessage"><strong><?php echo $this->data['newtalk'] ?></strong></div>
-                       <?php } ?>
+               ?>
+               <div id="content">
+               <div id="topbar">
+                       <p id="sitetitle" role="banner">
+                               <a href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>">
+                                       <?php echo wfMessage( 'sitetitle' )->escaped() ?>
+                               </a>
+                       </p>
+
+                       <p id="sitesub"><?php echo wfMessage( 'sitesubtitle' )->escaped() ?></p>
+
+                       <div id="linkcollection" role="navigation">
+                               <div id="langlinks"><?php echo str_replace( '<br />', '', $this->otherLanguages() ) ?></div>
+                               <?php echo $this->getSkin()->getCategories() ?>
+                               <div id="titlelinks"><?php echo $this->pageTitleLinks() ?></div>
+                               <?php
+                               if ( $this->data['newtalk'] ) {
+                                       ?>
+                                       <div class="usermessage"><strong><?php echo $this->data['newtalk'] ?></strong></div>
+                               <?php
+                               }
+                               ?>
+                       </div>
                </div>
-       </div>
-       <div id="article" class="mw-body" role="main">
-               <?php if ( $this->getSkin()->getSiteNotice() ) { ?>
-               <div id="siteNotice"><?php echo $this->getSkin()->getSiteNotice() ?></div>
-               <?php } ?>
+               <div id="article" class="mw-body" role="main">
+               <?php
+               if ( $this->getSkin()->getSiteNotice() ) {
+                       ?>
+                       <div id="siteNotice"><?php echo $this->getSkin()->getSiteNotice() ?></div>
+               <?php
+               }
+               ?>
                <h1 id="firstHeading" lang="<?php
-                       $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
-                       $this->text( 'pageLanguage' );
+               $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+               $this->text( 'pageLanguage' );
                ?>"><span dir="auto"><?php echo $this->data['title'] ?></span></h1>
-               <?php if ( $this->translator->translate( 'tagline' ) ) { ?>
-               <p class="tagline"><?php echo htmlspecialchars( $this->translator->translate( 'tagline' ) ) ?></p>
-               <?php } ?>
-               <?php if ( $this->getSkin()->getOutput()->getSubtitle() ) { ?>
-               <p class="subtitle"><?php echo $this->getSkin()->getOutput()->getSubtitle() ?></p>
-               <?php } ?>
-               <?php if ( $this->getSkin()->subPageSubtitle() ) { ?>
-               <p class="subpages"><?php echo $this->getSkin()->subPageSubtitle() ?></p>
-               <?php } ?>
-<?php
+               <?php
+               if ( $this->translator->translate( 'tagline' ) ) {
+                       ?>
+                       <p class="tagline"><?php
+                               echo htmlspecialchars( $this->translator->translate( 'tagline' ) )
+                               ?></p>
+               <?php
+               }
+               ?>
+               <?php
+               if ( $this->getSkin()->getOutput()->getSubtitle() ) {
+                       ?>
+                       <p class="subtitle"><?php echo $this->getSkin()->getOutput()->getSubtitle() ?></p>
+               <?php
+               }
+               ?>
+               <?php
+               if ( $this->getSkin()->subPageSubtitle() ) {
+                       ?>
+                       <p class="subpages"><?php echo $this->getSkin()->subPageSubtitle() ?></p>
+               <?php
+               }
+               ?>
+               <?php
                $s = ob_get_contents();
                ob_end_clean();
 
@@ -330,45 +390,47 @@ class CologneBlueTemplate extends BaseTemplate {
         */
        function afterContent() {
                ob_start();
-?>
-       </div>
-       <div id="footer">
-               <div id="footer-navigation" role="navigation">
-<?php
-               // Page-related links
-               echo $this->bottomLinks();
-               echo "\n<br />";
-
-               // Footer and second searchbox
-               echo $this->getSkin()->getLanguage()->pipeList( array(
-                       $this->getSkin()->mainPageLink(),
-                       $this->getSkin()->aboutLink(),
-                       $this->searchForm( 'footer' )
-               ) );
-?>
+               ?>
                </div>
-               <div id="footer-info" role="contentinfo">
-<?php
-               // Standard footer info
-               $footlinks = $this->getFooterLinks();
-               if ( $footlinks['info'] ) {
-                       foreach ( $footlinks['info'] as $item ) {
-                               echo $this->data[$item] . ' ';
-                       }
-               }
-?>
+               <div id="footer">
+                       <div id="footer-navigation" role="navigation">
+                               <?php
+                               // Page-related links
+                               echo $this->bottomLinks();
+                               echo "\n<br />";
+
+                               // Footer and second searchbox
+                               echo $this->getSkin()->getLanguage()->pipeList( array(
+                                       $this->getSkin()->mainPageLink(),
+                                       $this->getSkin()->aboutLink(),
+                                       $this->searchForm( 'footer' )
+                               ) );
+                               ?>
+                       </div>
+                       <div id="footer-info" role="contentinfo">
+                               <?php
+                               // Standard footer info
+                               $footlinks = $this->getFooterLinks();
+                               if ( $footlinks['info'] ) {
+                                       foreach ( $footlinks['info'] as $item ) {
+                                               echo $this->data[$item] . ' ';
+                                       }
+                               }
+                               ?>
+                       </div>
                </div>
-       </div>
-</div>
-<div id="mw-navigation">
-       <h2><?php echo wfMessage( 'navigation-heading' )->escaped() ?></h2>
-       <div id="toplinks" role="navigation">
-               <p id="syslinks"><?php echo $this->sysLinks() ?></p>
-               <p id="variantlinks"><?php echo $this->variantLinks() ?></p>
-       </div>
-       <?php echo $this->quickBar() ?>
-</div>
-<?php
+               </div>
+               <div id="mw-navigation">
+                       <h2><?php echo wfMessage( 'navigation-heading' )->escaped() ?></h2>
+
+                       <div id="toplinks" role="navigation">
+                               <p id="syslinks"><?php echo $this->sysLinks() ?></p>
+
+                               <p id="variantlinks"><?php echo $this->variantLinks() ?></p>
+                       </div>
+                       <?php echo $this->quickBar() ?>
+               </div>
+               <?php
                $s = ob_get_contents();
                ob_end_clean();
 
@@ -414,9 +476,10 @@ class CologneBlueTemplate extends BaseTemplate {
         */
        function sidebarAdditions( $bar ) {
                // "This page" and "Edit" menus
-               // We need to do some massaging here... we reuse all of the items, except for $...['views']['view'],
-               // as $...['namespaces']['main'] and $...['namespaces']['talk'] together serve the same purpose.
-               // We also don't use $...['variants'], these are displayed in the top menu.
+               // We need to do some massaging here... we reuse all of the items,
+               // except for $...['views']['view'], as $...['namespaces']['main'] and
+               // $...['namespaces']['talk'] together serve the same purpose. We also
+               // don't use $...['variants'], these are displayed in the top menu.
                $content_navigation = $this->data['content_navigation'];
                $qbpageoptions = array_merge(
                        $content_navigation['namespaces'],
@@ -513,7 +576,11 @@ class CologneBlueTemplate extends BaseTemplate {
                foreach ( $bar as $heading => $data ) {
                        $portletId = Sanitizer::escapeId( "p-$heading" );
                        $headingMsg = wfMessage( $idToMessage[$heading] ? $idToMessage[$heading] : $heading );
-                       $headingHTML = "<h3>" . ( $headingMsg->exists() ? $headingMsg->escaped() : htmlspecialchars( $heading ) ) . "</h3>";
+                       $headingHTML = "<h3>";
+                       $headingHTML .= $headingMsg->exists()
+                               ? $headingMsg->escaped()
+                               : htmlspecialchars( $heading );
+                       $headingHTML .= "</h3>";
                        $listHTML = "";
 
                        if ( is_array( $data ) ) {
@@ -534,13 +601,15 @@ class CologneBlueTemplate extends BaseTemplate {
 
                        if ( $listHTML ) {
                                $role = ( $heading == 'search' ) ? 'search' : 'navigation';
-                               $s .= "<div class=\"portlet\" id=\"$portletId\" role=\"$role\">\n$headingHTML\n$listHTML\n</div>\n";
+                               $s .= "<div class=\"portlet\" id=\"$portletId\" "
+                                       . "role=\"$role\">\n$headingHTML\n$listHTML\n</div>\n";
                        }
 
                        $s .= $this->renderAfterPortlet( $heading );
                }
 
                $s .= "</div>\n";
+
                return $s;
        }
 
@@ -553,19 +622,25 @@ class CologneBlueTemplate extends BaseTemplate {
 
                $search = $this->getSkin()->getRequest()->getText( 'search' );
                $action = $this->data['searchaction'];
-               $s = "<form id=\"searchform-" . htmlspecialchars( $which ) . "\" method=\"get\" class=\"inline\" action=\"$action\">";
+               $s = "<form id=\"searchform-" . htmlspecialchars( $which )
+                       . "\" method=\"get\" class=\"inline\" action=\"$action\">";
                if ( $which == 'footer' ) {
                        $s .= wfMessage( 'qbfind' )->text() . ": ";
                }
 
-               $s .= $this->makeSearchInput( array( 'class' => 'mw-searchInput', 'type' => 'text', 'size' => '14' ) );
+               $s .= $this->makeSearchInput( array(
+                       'class' => 'mw-searchInput',
+                       'type' => 'text',
+                       'size' => '14'
+               ) );
                $s .= ( $which == 'footer' ? " " : "<br />" );
                $s .= $this->makeSearchButton( 'go', array( 'class' => 'searchButton' ) );
 
                if ( $wgUseTwoButtonsSearchForm ) {
                        $s .= $this->makeSearchButton( 'fulltext', array( 'class' => 'searchButton' ) );
                } else {
-                       $s .= '<div><a href="' . $action . '" rel="search">' . wfMessage( 'powersearch-legend' )->escaped() . "</a></div>\n";
+                       $s .= '<div><a href="' . $action . '" rel="search">'
+                               . wfMessage( 'powersearch-legend' )->escaped() . "</a></div>\n";
                }
 
                $s .= '</form>';
index 81c0f51..d1d11c3 100644 (file)
@@ -32,8 +32,10 @@ if ( !defined( 'MEDIAWIKI' ) ) {
  * @ingroup Skins
  */
 class SkinModern extends SkinTemplate {
-       var $skinname = 'modern', $stylename = 'modern',
-               $template = 'ModernTemplate', $useHeadElement = true;
+       public $skinname = 'modern';
+       public $stylename = 'modern';
+       public $template = 'ModernTemplate';
+       public $useHeadElement = true;
 
        /**
         * @param OutputPage $out
@@ -63,107 +65,143 @@ class ModernTemplate extends MonoBookTemplate {
                wfSuppressWarnings();
 
                $this->html( 'headelement' );
-?>
-
-       <!-- heading -->
-       <div id="mw_header"><h1 id="firstHeading" lang="<?php
-               $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
-               $this->text( 'pageLanguage' );
-       ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1></div>
-
-       <div id="mw_main">
-       <div id="mw_contentwrapper">
-       <!-- navigation portlet -->
-<?php $this->cactions(); ?>
-
-       <!-- content -->
-       <div id="mw_content" role="main">
-       <!-- contentholder does nothing by default, but it allows users to style the text inside
-            the content area without affecting the meaning of 'em' in #mw_content, which is used
-            for the margins -->
-       <div id="mw_contentholder" class="mw-body">
-               <div class='mw-topboxes'>
-                       <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
-                       <div class="mw-topbox" id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
-                       <?php if ( $this->data['newtalk'] ) {
-                               ?><div class="usermessage mw-topbox"><?php $this->html( 'newtalk' ) ?></div>
-                       <?php } ?>
-                       <?php if ( $this->data['sitenotice'] ) {
-                               ?><div class="mw-topbox" id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
-                       <?php } ?>
-               </div>
-
-               <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
-
-               <?php if ( $this->data['undelete'] ) { ?><div id="contentSub2"><?php $this->html( 'undelete' ) ?></div><?php } ?>
-               <div id="jump-to-nav"><?php $this->msg( 'jumpto' ) ?> <a href="#mw_portlets"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div>
-
-               <?php $this->html( 'bodytext' ) ?>
-               <div class='mw_clear'></div>
-               <?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?>
-               <?php $this->html( 'dataAfterContent' ) ?>
-       </div><!-- mw_contentholder -->
-       </div><!-- mw_content -->
-       </div><!-- mw_contentwrapper -->
-
-       <div id="mw_portlets"<?php $this->html( "userlangattributes" ) ?>>
-       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
-
-       <!-- portlets -->
-       <?php $this->renderPortals( $this->data['sidebar'] ); ?>
-
-       </div><!-- mw_portlets -->
-
-
-       </div><!-- main -->
-
-       <div class="mw_clear"></div>
-
-       <!-- personal portlet -->
-       <div class="portlet" id="p-personal" role="navigation">
-               <h3><?php $this->msg( 'personaltools' ) ?></h3>
-               <div class="pBody">
-                       <ul>
-<?php          foreach ( $this->getPersonalTools() as $key => $item ) { ?>
-                               <?php echo $this->makeListItem( $key, $item ); ?>
-
-<?php          } ?>
-                       </ul>
+               ?>
+
+               <!-- heading -->
+               <div id="mw_header"><h1 id="firstHeading" lang="<?php
+                       $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+                       $this->text( 'pageLanguage' );
+                       ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1></div>
+
+               <div id="mw_main">
+                       <div id="mw_contentwrapper">
+                               <!-- navigation portlet -->
+                               <?php $this->cactions(); ?>
+
+                               <!-- content -->
+                               <div id="mw_content" role="main">
+                                       <!-- contentholder does nothing by default, but it allows users to style the text inside
+                                                the content area without affecting the meaning of 'em' in #mw_content, which is used
+                                                for the margins -->
+                                       <div id="mw_contentholder" class="mw-body">
+                                               <div class='mw-topboxes'>
+                                                       <div id="mw-js-message"
+                                                               style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
+                                                       <div class="mw-topbox" id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+                                                       <?php
+                                                       if ( $this->data['newtalk'] ) {
+                                                               ?>
+                                                               <div class="usermessage mw-topbox"><?php $this->html( 'newtalk' ) ?></div>
+                                                       <?php
+                                                       }
+                                                       ?>
+                                                       <?php
+                                                       if ( $this->data['sitenotice'] ) {
+                                                               ?>
+                                                               <div class="mw-topbox" id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </div>
+
+                                               <div id="contentSub"<?php
+                                               $this->html( 'userlangattributes' )
+                                               ?>><?php
+                                                       $this->html( 'subtitle' )
+                                                       ?></div>
+
+                                               <?php
+                                               if ( $this->data['undelete'] ) {
+                                                       ?>
+                                                       <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div><?php
+                                               }
+                                               ?>
+                                               <div id="jump-to-nav"><?php $this->msg( 'jumpto' ) ?>
+                                                       <a href="#mw_portlets"><?php
+                                                               $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' )
+                                                       ?>
+                                                       <a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a>
+                                               </div>
+
+                                               <?php $this->html( 'bodytext' ) ?>
+                                               <div class='mw_clear'></div>
+                                               <?php
+                                               if ( $this->data['catlinks'] ) {
+                                                       $this->html( 'catlinks' );
+                                               }
+                                               ?>
+                                               <?php $this->html( 'dataAfterContent' ) ?>
+                                       </div><!-- mw_contentholder -->
+                               </div><!-- mw_content -->
+                       </div><!-- mw_contentwrapper -->
+
+                       <div id="mw_portlets"<?php $this->html( "userlangattributes" ) ?>>
+                               <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+
+                               <!-- portlets -->
+                               <?php $this->renderPortals( $this->data['sidebar'] ); ?>
+
+                       </div><!-- mw_portlets -->
+
+
+               </div><!-- main -->
+
+               <div class="mw_clear"></div>
+
+               <!-- personal portlet -->
+               <div class="portlet" id="p-personal" role="navigation">
+                       <h3><?php $this->msg( 'personaltools' ) ?></h3>
+
+                       <div class="pBody">
+                               <ul>
+                                       <?php
+                                       foreach ( $this->getPersonalTools() as $key => $item ) {
+                                               ?>
+                                               <?php echo $this->makeListItem( $key, $item ); ?>
+
+                                       <?php
+                                       }
+                                       ?>
+                               </ul>
+                       </div>
                </div>
-       </div>
 
 
-       <!-- footer -->
-       <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
+               <!-- footer -->
+               <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
                        <ul id="f-list">
-<?php
-               foreach ( $this->getFooterLinks( "flat" ) as $aLink ) {
-                       if ( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
-?>                             <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
-<?php          }
-               }
-?>
+                               <?php
+                               foreach ( $this->getFooterLinks( "flat" ) as $aLink ) {
+                                       if ( isset( $this->data[$aLink] ) && $this->data[$aLink] ) {
+                                               ?>
+                                               <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
+                                       <?php
+                                       }
+                               }
+                               ?>
                        </ul>
-<?php
-               foreach ( $this->getFooterIcons( "nocopyright" ) as $blockName => $footerIcons ) { ?>
-                       <div id="mw_<?php echo htmlspecialchars( $blockName ); ?>">
-<?php
-                       foreach ( $footerIcons as $icon ) { ?>
-                               <?php echo $this->getSkin()->makeFooterIcon( $icon, 'withoutImage' ); ?>
+                       <?php
+                       foreach ( $this->getFooterIcons( "nocopyright" ) as $blockName => $footerIcons ) {
+                               ?>
+                               <div id="mw_<?php echo htmlspecialchars( $blockName ); ?>">
+                                       <?php
+                                       foreach ( $footerIcons as $icon ) {
+                                               ?>
+                                               <?php echo $this->getSkin()->makeFooterIcon( $icon, 'withoutImage' ); ?>
+
+                                       <?php
+                                       } ?>
+                               </div>
+                       <?php
+                       }
+                       ?>
+               </div>
 
-<?php
-                       } ?>
-                       </div>
-<?php
-               }
-?>
-       </div>
+               <?php $this->printTrail(); ?>
 
-       <?php $this->printTrail(); ?>
-</body></html>
-<?php
-       wfRestoreWarnings();
+       </body>
+</html>
+               <?php
+               wfRestoreWarnings();
        } // end of execute() method
 } // end of class
-
-
index fe6a25f..5c44938 100644 (file)
@@ -36,8 +36,10 @@ if ( !defined( 'MEDIAWIKI' ) ) {
  */
 class SkinMonoBook extends SkinTemplate {
        /** Using monobook. */
-       var $skinname = 'monobook', $stylename = 'monobook',
-               $template = 'MonoBookTemplate', $useHeadElement = true;
+       public $skinname = 'monobook';
+       public $stylename = 'monobook';
+       public $template = 'MonoBookTemplate';
+       public $useHeadElement = true;
 
        /**
         * @param OutputPage $out
@@ -50,7 +52,6 @@ class SkinMonoBook extends SkinTemplate {
                // TODO: Migrate all of these
                $out->addStyle( 'monobook/IE60Fixes.css', 'screen', 'IE 6' );
                $out->addStyle( 'monobook/IE70Fixes.css', 'screen', 'IE 7' );
-
        }
 }
 
@@ -73,96 +74,144 @@ class MonoBookTemplate extends BaseTemplate {
                wfSuppressWarnings();
 
                $this->html( 'headelement' );
-?><div id="globalWrapper">
-<div id="column-content"><div id="content" class="mw-body-primary" role="main">
-       <a id="top"></a>
-       <?php if ( $this->data['sitenotice'] ) { ?><div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div><?php } ?>
-
-       <h1 id="firstHeading" class="firstHeading" lang="<?php
-               $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
-               $this->text( 'pageLanguage' );
-       ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
-       <div id="bodyContent" class="mw-body">
-               <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
-               <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
-<?php if ( $this->data['undelete'] ) { ?>
-               <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
-<?php } ?><?php if ( $this->data['newtalk'] ) { ?>
-               <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
-<?php } ?>
-               <div id="jump-to-nav" class="mw-jump"><?php $this->msg( 'jumpto' ) ?> <a href="#column-one"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?><a href="#searchInput"><?php $this->msg( 'jumptosearch' ) ?></a></div>
-
-               <!-- start content -->
-<?php $this->html( 'bodytext' ) ?>
-               <?php if ( $this->data['catlinks'] ) { $this->html( 'catlinks' ); } ?>
-               <!-- end content -->
-               <?php if ( $this->data['dataAfterContent'] ) { $this->html( 'dataAfterContent' ); } ?>
-               <div class="visualClear"></div>
-       </div>
-</div></div>
-<div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
-       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
-<?php $this->cactions(); ?>
-       <div class="portlet" id="p-personal" role="navigation">
-               <h3><?php $this->msg( 'personaltools' ) ?></h3>
-               <div class="pBody">
-                       <ul<?php $this->html( 'userlangattributes' ) ?>>
-<?php          foreach ( $this->getPersonalTools() as $key => $item ) { ?>
-                               <?php echo $this->makeListItem( $key, $item ); ?>
-
-<?php          } ?>
-                       </ul>
+               ?><div id="globalWrapper">
+               <div id="column-content">
+                       <div id="content" class="mw-body-primary" role="main">
+                               <a id="top"></a>
+                               <?php
+                               if ( $this->data['sitenotice'] ) {
+                                       ?>
+                                       <div id="siteNotice"><?php
+                                       $this->html( 'sitenotice' )
+                                       ?></div><?php
+                               }
+                               ?>
+
+                               <h1 id="firstHeading" class="firstHeading" lang="<?php
+                               $this->data['pageLanguage'] =
+                                       $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+                               $this->text( 'pageLanguage' );
+                               ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
+
+                               <div id="bodyContent" class="mw-body">
+                                       <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+                                       <div id="contentSub"<?php
+                                       $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' )
+                                               ?></div>
+                                       <?php if ( $this->data['undelete'] ) { ?>
+                                               <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+                                       <?php
+}
+                                       ?><?php
+                                       if ( $this->data['newtalk'] ) {
+                                               ?>
+                                               <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+                                       <?php
+                                       }
+                                       ?>
+                                       <div id="jump-to-nav" class="mw-jump"><?php
+                                               $this->msg( 'jumpto' )
+                                               ?> <a href="#column-one"><?php
+                                                       $this->msg( 'jumptonavigation' )
+                                                       ?></a><?php
+                                               $this->msg( 'comma-separator' )
+                                               ?><a href="#searchInput"><?php
+                                                       $this->msg( 'jumptosearch' )
+                                                       ?></a></div>
+
+                                       <!-- start content -->
+                                       <?php $this->html( 'bodytext' ) ?>
+                                       <?php
+                                       if ( $this->data['catlinks'] ) {
+                                               $this->html( 'catlinks' );
+                                       }
+                                       ?>
+                                       <!-- end content -->
+                                       <?php
+                                       if ( $this->data['dataAfterContent'] ) {
+                                               $this->html( 'dataAfterContent'
+                                               );
+                                       }
+                                       ?>
+                                       <div class="visualClear"></div>
+                               </div>
+                       </div>
                </div>
-       </div>
-       <div class="portlet" id="p-logo" role="banner">
-<?php
-                       echo Html::element( 'a', array(
-                               'href' => $this->data['nav_urls']['mainpage']['href'],
-                               'style' => "background-image: url({$this->data['logopath']});" )
-                               + Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
-
-       </div>
-<?php
-       $this->renderPortals( $this->data['sidebar'] );
-?>
-</div><!-- end of the left (by default at least) column -->
-<div class="visualClear"></div>
-<?php
-       $validFooterIcons = $this->getFooterIcons( "icononly" );
-       $validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
+               <div id="column-one"<?php $this->html( 'userlangattributes' ) ?>>
+                       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+                       <?php $this->cactions(); ?>
+                       <div class="portlet" id="p-personal" role="navigation">
+                               <h3><?php $this->msg( 'personaltools' ) ?></h3>
+
+                               <div class="pBody">
+                                       <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                               <?php foreach ( $this->getPersonalTools() as $key => $item ) { ?>
+                                                       <?php echo $this->makeListItem( $key, $item ); ?>
+
+                                               <?php
+}
+                                               ?>
+                                       </ul>
+                               </div>
+                       </div>
+                       <div class="portlet" id="p-logo" role="banner">
+                               <?php
+                               echo Html::element( 'a', array(
+                                               'href' => $this->data['nav_urls']['mainpage']['href'],
+                                               'style' => "background-image: url({$this->data['logopath']});" )
+                                       + Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ); ?>
+
+                       </div>
+                       <?php
+                       $this->renderPortals( $this->data['sidebar'] );
+                       ?>
+               </div><!-- end of the left (by default at least) column -->
+               <div class="visualClear"></div>
+               <?php
+               $validFooterIcons = $this->getFooterIcons( "icononly" );
+               $validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
+
+               if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) {
+                       ?>
+                       <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
+                       <?php
+                       $footerEnd = '</div>';
+               } else {
+                       $footerEnd = '';
+               }
 
-       if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) { ?>
-<div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
-<?php
-               $footerEnd = '</div>';
-       } else {
-               $footerEnd = '';
-       }
-       foreach ( $validFooterIcons as $blockName => $footerIcons ) { ?>
-       <div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
-<?php foreach ( $footerIcons as $icon ) { ?>
-               <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
+               foreach ( $validFooterIcons as $blockName => $footerIcons ) {
+                       ?>
+                       <div id="f-<?php echo htmlspecialchars( $blockName ); ?>ico">
+                               <?php foreach ( $footerIcons as $icon ) { ?>
+                                       <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
 
-<?php }
-?>
-       </div>
-<?php }
+                               <?php
+}
+                               ?>
+                       </div>
+               <?php
+               }
 
                if ( count( $validFooterLinks ) > 0 ) {
-?>     <ul id="f-list">
-<?php
-                       foreach ( $validFooterLinks as $aLink ) { ?>
-               <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
-<?php
-                       }
-?>
-       </ul>
-<?php  }
-echo $footerEnd;
-?>
+                       ?>
+                       <ul id="f-list">
+                               <?php
+                               foreach ( $validFooterLinks as $aLink ) {
+                                       ?>
+                                       <li id="<?php echo $aLink ?>"><?php $this->html( $aLink ) ?></li>
+                               <?php
+                               }
+                               ?>
+                       </ul>
+               <?php
+               }
 
-</div>
-<?php
+               echo $footerEnd;
+               ?>
+
+               </div>
+               <?php
                $this->printTrail();
                echo Html::closeElement( 'body' );
                echo Html::closeElement( 'html' );
@@ -204,28 +253,41 @@ echo $footerEnd;
 
        function searchBox() {
                global $wgUseTwoButtonsSearchForm;
-?>
-       <div id="p-search" class="portlet" role="search">
-               <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
-               <div id="searchBody" class="pBody">
-                       <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
-                               <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
-                               <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
-
-                               <?php echo $this->makeSearchButton( "go", array( "id" => "searchGoButton", "class" => "searchButton" ) );
-                               if ( $wgUseTwoButtonsSearchForm ) { ?>&#160;
-                               <?php echo $this->makeSearchButton( "fulltext", array( "id" => "mw-searchButton", "class" => "searchButton" ) );
-                               } else { ?>
-
-                               <div><a href="<?php $this->text( 'searchaction' ) ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
-                               } ?>
-
-                       </form>
-
-                       <?php $this->renderAfterPortlet( 'search' ); ?>
+               ?>
+               <div id="p-search" class="portlet" role="search">
+                       <h3><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
+
+                       <div id="searchBody" class="pBody">
+                               <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+                                       <input type='hidden' name="title" value="<?php $this->text( 'searchtitle' ) ?>"/>
+                                       <?php echo $this->makeSearchInput( array( "id" => "searchInput" ) ); ?>
+
+                                       <?php
+                                       echo $this->makeSearchButton(
+                                               "go",
+                                               array( "id" => "searchGoButton", "class" => "searchButton" )
+                                       );
+
+                                       if ( $wgUseTwoButtonsSearchForm ) {
+                                               ?>&#160;
+                                               <?php echo $this->makeSearchButton(
+                                                       "fulltext",
+                                                       array( "id" => "mw-searchButton", "class" => "searchButton" )
+                                               );
+                                       } else {
+                                               ?>
+
+                                               <div><a href="<?php
+                                               $this->text( 'searchaction' )
+                                               ?>" rel="search"><?php $this->msg( 'powersearch-legend' ) ?></a></div><?php
+                                       } ?>
+
+                               </form>
+
+                               <?php $this->renderAfterPortlet( 'search' ); ?>
+                       </div>
                </div>
-       </div>
-<?php
+       <?php
        }
 
        /**
@@ -233,63 +295,70 @@ echo $footerEnd;
         * Shared between MonoBook and Modern
         */
        function cactions() {
-?>
-       <div id="p-cactions" class="portlet" role="navigation">
-               <h3><?php $this->msg( 'views' ) ?></h3>
-               <div class="pBody">
-                       <ul><?php
-                               foreach ( $this->data['content_actions'] as $key => $tab ) {
-                                       echo '
+               ?>
+               <div id="p-cactions" class="portlet" role="navigation">
+                       <h3><?php $this->msg( 'views' ) ?></h3>
+
+                       <div class="pBody">
+                               <ul><?php
+                                       foreach ( $this->data['content_actions'] as $key => $tab ) {
+                                               echo '
                                ' . $this->makeListItem( $key, $tab );
-                               } ?>
+                                       } ?>
 
-                       </ul>
-<?php          $this->renderAfterPortlet( 'cactions' ); ?>
+                               </ul>
+                               <?php $this->renderAfterPortlet( 'cactions' ); ?>
+                       </div>
                </div>
-       </div>
-<?php
+       <?php
        }
+
        /*************************************************************************************************/
        function toolbox() {
-?>
-       <div class="portlet" id="p-tb" role="navigation">
-               <h3><?php $this->msg( 'toolbox' ) ?></h3>
-               <div class="pBody">
-                       <ul>
-<?php
-               foreach ( $this->getToolbox() as $key => $tbitem ) { ?>
-                               <?php echo $this->makeListItem( $key, $tbitem ); ?>
-
-<?php
-               }
-               wfRunHooks( 'MonoBookTemplateToolboxEnd', array( &$this ) );
-               wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) );
-?>
-                       </ul>
-<?php          $this->renderAfterPortlet( 'tb' ); ?>
+               ?>
+               <div class="portlet" id="p-tb" role="navigation">
+                       <h3><?php $this->msg( 'toolbox' ) ?></h3>
+
+                       <div class="pBody">
+                               <ul>
+                                       <?php
+                                       foreach ( $this->getToolbox() as $key => $tbitem ) {
+                                               ?>
+                                               <?php echo $this->makeListItem( $key, $tbitem ); ?>
+
+                                       <?php
+                                       }
+                                       wfRunHooks( 'MonoBookTemplateToolboxEnd', array( &$this ) );
+                                       wfRunHooks( 'SkinTemplateToolboxEnd', array( &$this, true ) );
+                                       ?>
+                               </ul>
+                               <?php $this->renderAfterPortlet( 'tb' ); ?>
+                       </div>
                </div>
-       </div>
-<?php
+       <?php
        }
 
        /*************************************************************************************************/
        function languageBox() {
                if ( $this->data['language_urls'] !== false ) {
-?>
-       <div id="p-lang" class="portlet" role="navigation">
-               <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
-               <div class="pBody">
-                       <ul>
-<?php          foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
-                               <?php echo $this->makeListItem( $key, $langlink ); ?>
-
-<?php          } ?>
-                       </ul>
+                       ?>
+                       <div id="p-lang" class="portlet" role="navigation">
+                               <h3<?php $this->html( 'userlangattributes' ) ?>><?php $this->msg( 'otherlanguages' ) ?></h3>
 
-<?php          $this->renderAfterPortlet( 'lang' ); ?>
-               </div>
-       </div>
-<?php
+                               <div class="pBody">
+                                       <ul>
+                                               <?php foreach ( $this->data['language_urls'] as $key => $langlink ) { ?>
+                                                       <?php echo $this->makeListItem( $key, $langlink ); ?>
+
+                                               <?php
+}
+                                               ?>
+                                       </ul>
+
+                                       <?php $this->renderAfterPortlet( 'lang' ); ?>
+                               </div>
+                       </div>
+               <?php
                }
        }
 
@@ -299,34 +368,45 @@ echo $footerEnd;
         * @param array|string $cont
         */
        function customBox( $bar, $cont ) {
-               $portletAttribs = array( 'class' => 'generated-sidebar portlet', 'id' => Sanitizer::escapeId( "p-$bar" ), 'role' => 'navigation' );
+               $portletAttribs = array(
+                       'class' => 'generated-sidebar portlet',
+                       'id' => Sanitizer::escapeId( "p-$bar" ),
+                       'role' => 'navigation'
+               );
+
                $tooltip = Linker::titleAttrib( "p-$bar" );
                if ( $tooltip !== false ) {
                        $portletAttribs['title'] = $tooltip;
                }
                echo '  ' . Html::openElement( 'div', $portletAttribs );
                $msgObj = wfMessage( $bar );
-?>
+               ?>
 
                <h3><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $bar ); ?></h3>
                <div class='pBody'>
-<?php   if ( is_array( $cont ) ) { ?>
-                       <ul>
-<?php                  foreach ( $cont as $key => $val ) { ?>
-                               <?php echo $this->makeListItem( $key, $val ); ?>
-
-<?php                  } ?>
-                       </ul>
-<?php   } else {
-                       # allow raw HTML block to be defined by extensions
-                       print $cont;
-               }
+                       <?php
+                       if ( is_array( $cont ) ) {
+                               ?>
+                               <ul>
+                                       <?php
+                                       foreach ( $cont as $key => $val ) {
+                                               ?>
+                                               <?php echo $this->makeListItem( $key, $val ); ?>
+
+                                       <?php
+                                       }
+                                       ?>
+                               </ul>
+                       <?php
+                       } else {
+                               # allow raw HTML block to be defined by extensions
+                               print $cont;
+                       }
 
-               $this->renderAfterPortlet( $bar );
-?>
+                       $this->renderAfterPortlet( $bar );
+                       ?>
                </div>
-       </div>
-<?php
+               </div>
+       <?php
        }
-
 } // end of class
index 8ede82a..ee61272 100644 (file)
@@ -32,12 +32,13 @@ if ( !defined( 'MEDIAWIKI' ) ) {
  * @ingroup Skins
  */
 class SkinVector extends SkinTemplate {
+       public $useHeadElement = true;
+       public $skinname = 'vector';
+       public $stylename = 'vector';
+       public $template = 'VectorTemplate';
 
        protected static $bodyClasses = array( 'vector-animateLayout' );
 
-       var $skinname = 'vector', $stylename = 'vector',
-               $template = 'VectorTemplate', $useHeadElement = true;
-
        /**
         * Initializes output page and sets up skin-specific parameters
         * @param OutputPage $out Object to initialize
@@ -92,7 +93,6 @@ class SkinVector extends SkinTemplate {
  * @ingroup Skins
  */
 class VectorTemplate extends BaseTemplate {
-
        /* Functions */
 
        /**
@@ -105,7 +105,10 @@ class VectorTemplate extends BaseTemplate {
                $nav = $this->data['content_navigation'];
 
                if ( $wgVectorUseIconWatch ) {
-                       $mode = $this->getSkin()->getUser()->isWatched( $this->getSkin()->getRelevantTitle() ) ? 'unwatch' : 'watch';
+                       $mode = $this->getSkin()->getUser()->isWatched( $this->getSkin()->getRelevantTitle() )
+                               ? 'unwatch'
+                               : 'watch';
+
                        if ( isset( $nav['actions'][$mode] ) ) {
                                $nav['views'][$mode] = $nav['actions'][$mode];
                                $nav['views'][$mode]['class'] = rtrim( 'icon ' . $nav['views'][$mode]['class'], ' ' );
@@ -154,54 +157,95 @@ class VectorTemplate extends BaseTemplate {
                }
                // Output HTML Page
                $this->html( 'headelement' );
-?>
+               ?>
                <div id="mw-page-base" class="noprint"></div>
                <div id="mw-head-base" class="noprint"></div>
                <div id="content" class="mw-body" role="main">
                        <a id="top"></a>
+
                        <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
-                       <?php if ( $this->data['sitenotice'] ) { ?>
-                       <div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
-                       <?php } ?>
+                       <?php
+                       if ( $this->data['sitenotice'] ) {
+                               ?>
+                               <div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
+                       <?php
+                       }
+                       ?>
                        <h1 id="firstHeading" class="firstHeading" lang="<?php
-                               $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
-                               $this->text( 'pageLanguage' );
+                       $this->data['pageLanguage'] =
+                               $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+                       $this->text( 'pageLanguage' );
                        ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
                        <?php $this->html( 'prebodyhtml' ) ?>
-                       <div id="bodyContent">
-                               <?php if ( $this->data['isarticle'] ) { ?>
-                               <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
-                               <?php } ?>
-                               <div id="contentSub"<?php $this->html( 'userlangattributes' ) ?>><?php $this->html( 'subtitle' ) ?></div>
-                               <?php if ( $this->data['undelete'] ) { ?>
-                               <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
-                               <?php } ?>
-                               <?php if ( $this->data['newtalk'] ) { ?>
-                               <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
-                               <?php } ?>
+                       <div id="bodyContent" class="mw-body-content">
+                               <?php
+                               if ( $this->data['isarticle'] ) {
+                                       ?>
+                                       <div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
+                               <?php
+                               }
+                               ?>
+                               <div id="contentSub"<?php
+                               $this->html( 'userlangattributes' )
+                               ?>><?php $this->html( 'subtitle' ) ?></div>
+                               <?php
+                               if ( $this->data['undelete'] ) {
+                                       ?>
+                                       <div id="contentSub2"><?php $this->html( 'undelete' ) ?></div>
+                               <?php
+                               }
+                               ?>
+                               <?php
+                               if ( $this->data['newtalk'] ) {
+                                       ?>
+                                       <div class="usermessage"><?php $this->html( 'newtalk' ) ?></div>
+                               <?php
+                               }
+                               ?>
                                <div id="jump-to-nav" class="mw-jump">
                                        <?php $this->msg( 'jumpto' ) ?>
-                                       <a href="#mw-navigation"><?php $this->msg( 'jumptonavigation' ) ?></a><?php $this->msg( 'comma-separator' ) ?>
+                                       <a href="#mw-navigation"><?php
+                                               $this->msg( 'jumptonavigation' )
+                                               ?></a><?php
+                                       $this->msg( 'comma-separator' )
+                                       ?>
                                        <a href="#p-search"><?php $this->msg( 'jumptosearch' ) ?></a>
                                </div>
                                <?php $this->html( 'bodycontent' ) ?>
-                               <?php if ( $this->data['printfooter'] ) { ?>
-                               <div class="printfooter">
-                               <?php $this->html( 'printfooter' ); ?>
-                               </div>
-                               <?php } ?>
-                               <?php if ( $this->data['catlinks'] ) { ?>
-                               <?php $this->html( 'catlinks' ); ?>
-                               <?php } ?>
-                               <?php if ( $this->data['dataAfterContent'] ) { ?>
-                               <?php $this->html( 'dataAfterContent' ); ?>
-                               <?php } ?>
+                               <?php
+                               if ( $this->data['printfooter'] ) {
+                                       ?>
+                                       <div class="printfooter">
+                                               <?php $this->html( 'printfooter' ); ?>
+                                       </div>
+                               <?php
+                               }
+                               ?>
+                               <?php
+                               if ( $this->data['catlinks'] ) {
+                                       ?>
+                                       <?php
+                                       $this->html( 'catlinks' );
+                                       ?>
+                               <?php
+                               }
+                               ?>
+                               <?php
+                               if ( $this->data['dataAfterContent'] ) {
+                                       ?>
+                                       <?php
+                                       $this->html( 'dataAfterContent' );
+                                       ?>
+                               <?php
+                               }
+                               ?>
                                <div class="visualClear"></div>
                                <?php $this->html( 'debughtml' ); ?>
                        </div>
                </div>
                <div id="mw-navigation">
                        <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+
                        <div id="mw-head">
                                <?php $this->renderNavigation( 'PERSONAL' ); ?>
                                <div id="left-navigation">
@@ -212,38 +256,74 @@ class VectorTemplate extends BaseTemplate {
                                </div>
                        </div>
                        <div id="mw-panel">
-                                       <div id="p-logo" role="banner"><a style="background-image: url(<?php $this->text( 'logopath' ) ?>);" href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>" <?php echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ) ?>></a></div>
+                               <div id="p-logo" role="banner"><a style="background-image: url(<?php
+                                       $this->text( 'logopath' )
+                                       ?>);" href="<?php
+                                       echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] )
+                                       ?>" <?php
+                                       echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) )
+                                       ?>></a></div>
                                <?php $this->renderPortals( $this->data['sidebar'] ); ?>
                        </div>
                </div>
                <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
-                       <?php foreach ( $this->getFooterLinks() as $category => $links ) { ?>
-                               <ul id="footer-<?php echo $category ?>">
-                                       <?php foreach ( $links as $link ) { ?>
-                                               <li id="footer-<?php echo $category ?>-<?php echo $link ?>"><?php $this->html( $link ) ?></li>
-                                       <?php } ?>
+                       <?php
+                       foreach ( $this->getFooterLinks() as $category => $links ) {
+                               ?>
+                               <ul id="footer-<?php
+                               echo $category
+                               ?>">
+                                       <?php
+                                       foreach ( $links as $link ) {
+                                               ?>
+                                               <li id="footer-<?php
+                                               echo $category
+                                               ?>-<?php
+                                               echo $link
+                                               ?>"><?php
+                                                       $this->html( $link )
+                                                       ?></li>
+                                       <?php
+                                       }
+                                       ?>
                                </ul>
-                       <?php } ?>
+                       <?php
+                       }
+                       ?>
                        <?php $footericons = $this->getFooterIcons( "icononly" );
-                       if ( count( $footericons ) > 0 ) { ?>
+                       if ( count( $footericons ) > 0 ) {
+                               ?>
                                <ul id="footer-icons" class="noprint">
-<?php                  foreach ( $footericons as $blockName => $footerIcons ) { ?>
-                                       <li id="footer-<?php echo htmlspecialchars( $blockName ); ?>ico">
-<?php                          foreach ( $footerIcons as $icon ) { ?>
-                                               <?php echo $this->getSkin()->makeFooterIcon( $icon ); ?>
-
-<?php                          } ?>
-                                       </li>
-<?php                  } ?>
+                                       <?php
+                                       foreach ( $footericons as $blockName => $footerIcons ) {
+                                               ?>
+                                               <li id="footer-<?php
+                                               echo htmlspecialchars( $blockName ); ?>ico">
+                                                       <?php
+                                                       foreach ( $footerIcons as $icon ) {
+                                                               ?>
+                                                               <?php
+                                                               echo $this->getSkin()->makeFooterIcon( $icon );
+                                                               ?>
+
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </li>
+                                       <?php
+                                       }
+                                       ?>
                                </ul>
-                       <?php } ?>
+                       <?php
+                       }
+                       ?>
                        <div style="clear:both"></div>
                </div>
                <?php $this->printTrail(); ?>
 
        </body>
 </html>
-<?php
+       <?php
        }
 
        /**
@@ -281,7 +361,7 @@ class VectorTemplate extends BaseTemplate {
                                        break;
                                default:
                                        $this->renderPortal( $name, $content );
-                               break;
+                                       break;
                        }
                }
        }
@@ -298,34 +378,48 @@ class VectorTemplate extends BaseTemplate {
                }
                $msgObj = wfMessage( $msg );
                ?>
-<div class="portal" role="navigation" id='<?php echo Sanitizer::escapeId( "p-$name" ) ?>'<?php echo Linker::tooltip( 'p-' . $name ) ?> aria-labelledby='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'>
-       <h3<?php $this->html( 'userlangattributes' ) ?> id='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'><?php echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg ); ?></h3>
-       <div class="body">
-<?php
-               if ( is_array( $content ) ) { ?>
-               <ul>
-<?php
-                       foreach ( $content as $key => $val ) { ?>
-                       <?php echo $this->makeListItem( $key, $val ); ?>
+               <div class="portal" role="navigation" id='<?php
+               echo Sanitizer::escapeId( "p-$name" )
+               ?>'<?php
+               echo Linker::tooltip( 'p-' . $name )
+               ?> aria-labelledby='<?php echo Sanitizer::escapeId( "p-$name-label" ) ?>'>
+                       <h3<?php
+                       $this->html( 'userlangattributes' )
+                       ?> id='<?php
+                       echo Sanitizer::escapeId( "p-$name-label" )
+                       ?>'><?php
+                               echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg );
+                               ?></h3>
 
-<?php
-                       }
-                       if ( $hook !== null ) {
-                               wfRunHooks( $hook, array( &$this, true ) );
-                       }
-                       ?>
-               </ul>
-<?php
-               } else { ?>
-               <?php
-                       echo $content; /* Allow raw HTML block to be defined by extensions */
-               }
+                       <div class="body">
+                               <?php
+                               if ( is_array( $content ) ) {
+                                       ?>
+                                       <ul>
+                                               <?php
+                                               foreach ( $content as $key => $val ) {
+                                                       ?>
+                                                       <?php echo $this->makeListItem( $key, $val ); ?>
 
-               $this->renderAfterPortlet( $name );
-               ?>
-       </div>
-</div>
-<?php
+                                               <?php
+                                               }
+                                               if ( $hook !== null ) {
+                                                       wfRunHooks( $hook, array( &$this, true ) );
+                                               }
+                                               ?>
+                                       </ul>
+                               <?php
+                               } else {
+                                       ?>
+                                       <?php
+                                       echo $content; /* Allow raw HTML block to be defined by extensions */
+                               }
+
+                               $this->renderAfterPortlet( $name );
+                               ?>
+                       </div>
+               </div>
+       <?php
        }
 
        /**
@@ -341,7 +435,7 @@ class VectorTemplate extends BaseTemplate {
                // flexible arguments
                if ( !is_array( $elements ) ) {
                        $elements = array( $elements );
-               // If there's a series of elements, reverse them when in RTL mode
+                       // If there's a series of elements, reverse them when in RTL mode
                } elseif ( $this->data['rtl'] ) {
                        $elements = array_reverse( $elements );
                }
@@ -349,114 +443,219 @@ class VectorTemplate extends BaseTemplate {
                foreach ( $elements as $name => $element ) {
                        switch ( $element ) {
                                case 'NAMESPACES':
-?>
-<div id="p-namespaces" role="navigation" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-namespaces-label">
-       <h3 id="p-namespaces-label"><?php $this->msg( 'namespaces' ) ?></h3>
-       <ul<?php $this->html( 'userlangattributes' ) ?>>
-               <?php foreach ( $this->data['namespace_urls'] as $link ) { ?>
-                       <li <?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></span></li>
-               <?php } ?>
-       </ul>
-</div>
-<?php
-                               break;
+                                       ?>
+                                       <div id="p-namespaces" role="navigation" class="vectorTabs<?php
+                                       if ( count( $this->data['namespace_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-namespaces-label">
+                                               <h3 id="p-namespaces-label"><?php $this->msg( 'namespaces' ) ?></h3>
+                                               <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                                       <?php
+                                                       foreach ( $this->data['namespace_urls'] as $link ) {
+                                                               ?>
+                                                               <li <?php
+                                                               echo $link['attributes']
+                                                               ?>><span><a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key']
+                                                                               ?>><?php
+                                                                                       echo htmlspecialchars( $link['text'] )
+                                                                                       ?></a></span></li>
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </ul>
+                                       </div>
+                                       <?php
+                                       break;
                                case 'VARIANTS':
-?>
-<div id="p-variants" role="navigation" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-variants-label">
-       <h3 id="mw-vector-current-variant">
-       <?php foreach ( $this->data['variant_urls'] as $link ) { ?>
-               <?php if ( stripos( $link['attributes'], 'selected' ) !== false ) { ?>
-                       <?php echo htmlspecialchars( $link['text'] ) ?>
-               <?php } ?>
-       <?php } ?>
-       </h3>
-       <h3 id="p-variants-label"><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
-       <div class="menu">
-               <ul>
-                       <?php foreach ( $this->data['variant_urls'] as $link ) { ?>
-                               <li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" lang="<?php echo htmlspecialchars( $link['lang'] ) ?>" hreflang="<?php echo htmlspecialchars( $link['hreflang'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li>
-                       <?php } ?>
-               </ul>
-       </div>
-</div>
-<?php
-                               break;
+                                       ?>
+                                       <div id="p-variants" role="navigation" class="vectorMenu<?php
+                                       if ( count( $this->data['variant_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-variants-label">
+                                               <h3 id="mw-vector-current-variant">
+                                                       <?php
+                                                       foreach ( $this->data['variant_urls'] as $link ) {
+                                                               ?>
+                                                               <?php
+                                                               if ( stripos( $link['attributes'], 'selected' ) !== false ) {
+                                                                       ?>
+                                                                       <?php
+                                                                       echo htmlspecialchars( $link['text'] )
+                                                                       ?>
+                                                               <?php
+                                                               }
+                                                               ?>
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </h3>
+
+                                               <h3 id="p-variants-label"><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
+
+                                               <div class="menu">
+                                                       <ul>
+                                                               <?php
+                                                               foreach ( $this->data['variant_urls'] as $link ) {
+                                                                       ?>
+                                                                       <li<?php
+                                                                       echo $link['attributes']
+                                                                       ?>><a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" lang="<?php
+                                                                               echo htmlspecialchars( $link['lang'] )
+                                                                               ?>" hreflang="<?php
+                                                                               echo htmlspecialchars( $link['hreflang'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key']
+                                                                               ?>><?php
+                                                                                       echo htmlspecialchars( $link['text'] )
+                                                                                       ?></a></li>
+                                                               <?php
+                                                               }
+                                                               ?>
+                                                       </ul>
+                                               </div>
+                                       </div>
+                                       <?php
+                                       break;
                                case 'VIEWS':
-?>
-<div id="p-views" role="navigation" class="vectorTabs<?php if ( count( $this->data['view_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-views-label">
-       <h3 id="p-views-label"><?php $this->msg( 'views' ) ?></h3>
-       <ul<?php $this->html( 'userlangattributes' ) ?>>
-               <?php foreach ( $this->data['view_urls'] as $link ) { ?>
-                       <li<?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php
-                               // $link['text'] can be undefined - bug 27764
-                               if ( array_key_exists( 'text', $link ) ) {
-                                       echo array_key_exists( 'img', $link ) ? '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />' : htmlspecialchars( $link['text'] );
-                               }
-                               ?></a></span></li>
-               <?php } ?>
-       </ul>
-</div>
-<?php
-                               break;
+                                       ?>
+                                       <div id="p-views" role="navigation" class="vectorTabs<?php
+                                       if ( count( $this->data['view_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-views-label">
+                                               <h3 id="p-views-label"><?php $this->msg( 'views' ) ?></h3>
+                                               <ul<?php
+                                               $this->html( 'userlangattributes' )
+                                               ?>>
+                                                       <?php
+                                                       foreach ( $this->data['view_urls'] as $link ) {
+                                                               ?>
+                                                               <li<?php
+                                                               echo $link['attributes']
+                                                               ?>><span><a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key']
+                                                                               ?>><?php
+                                                                                       // $link['text'] can be undefined - bug 27764
+                                                                                       if ( array_key_exists( 'text', $link ) ) {
+                                                                                               echo array_key_exists( 'img', $link )
+                                                                                                       ? '<img src="' . $link['img'] . '" alt="' . $link['text'] . '" />'
+                                                                                                       : htmlspecialchars( $link['text'] );
+                                                                                       }
+                                                                                       ?></a></span></li>
+                                                       <?php
+                                                       }
+                                                       ?>
+                                               </ul>
+                                       </div>
+                                       <?php
+                                       break;
                                case 'ACTIONS':
-?>
-<div id="p-cactions" role="navigation" class="vectorMenu<?php if ( count( $this->data['action_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-cactions-label">
-       <h3 id="p-cactions-label"><span><?php $this->msg( 'actions' ) ?></span><a href="#"></a></h3>
-       <div class="menu">
-               <ul<?php $this->html( 'userlangattributes' ) ?>>
-                       <?php foreach ( $this->data['action_urls'] as $link ) { ?>
-                               <li<?php echo $link['attributes'] ?>><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></li>
-                       <?php } ?>
-               </ul>
-       </div>
-</div>
-<?php
-                               break;
+                                       ?>
+                                       <div id="p-cactions" role="navigation" class="vectorMenu<?php
+                                       if ( count( $this->data['action_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
+                                       }
+                                       ?>" aria-labelledby="p-cactions-label">
+                                               <h3 id="p-cactions-label"><span><?php $this->msg( 'actions' ) ?></span><a href="#"></a></h3>
+
+                                               <div class="menu">
+                                                       <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                                               <?php
+                                                               foreach ( $this->data['action_urls'] as $link ) {
+                                                                       ?>
+                                                                       <li<?php
+                                                                       echo $link['attributes']
+                                                                       ?>>
+                                                                               <a href="<?php
+                                                                               echo htmlspecialchars( $link['href'] )
+                                                                               ?>" <?php
+                                                                               echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] )
+                                                                                       ?></a>
+                                                                       </li>
+                                                               <?php
+                                                               }
+                                                               ?>
+                                                       </ul>
+                                               </div>
+                                       </div>
+                                       <?php
+                                       break;
                                case 'PERSONAL':
-?>
-<div id="p-personal" role="navigation" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>" aria-labelledby="p-personal-label">
-       <h3 id="p-personal-label"><?php $this->msg( 'personaltools' ) ?></h3>
-       <ul<?php $this->html( 'userlangattributes' ) ?>>
-<?php
-                                       $personalTools = $this->getPersonalTools();
-                                       foreach ( $personalTools as $key => $item ) {
-                                               echo $this->makeListItem( $key, $item );
+                                       ?>
+                                       <div id="p-personal" role="navigation" class="<?php
+                                       if ( count( $this->data['personal_urls'] ) == 0 ) {
+                                               echo ' emptyPortlet';
                                        }
-?>
-       </ul>
-</div>
-<?php
-                               break;
+                                       ?>" aria-labelledby="p-personal-label">
+                                               <h3 id="p-personal-label"><?php $this->msg( 'personaltools' ) ?></h3>
+                                               <ul<?php $this->html( 'userlangattributes' ) ?>>
+                                                       <?php
+                                                       $personalTools = $this->getPersonalTools();
+                                                       foreach ( $personalTools as $key => $item ) {
+                                                               echo $this->makeListItem( $key, $item );
+                                                       }
+                                                       ?>
+                                               </ul>
+                                       </div>
+                                       <?php
+                                       break;
                                case 'SEARCH':
-?>
-<div id="p-search" role="search">
-       <h3<?php $this->html( 'userlangattributes' ) ?>><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
-       <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
-               <?php if ( $wgVectorUseSimpleSearch ) { ?>
-                       <div id="simpleSearch">
-               <?php } else { ?>
-                       <div>
-               <?php } ?>
-                       <?php
-                       echo $this->makeSearchInput( array( 'id' => 'searchInput' ) );
-                       echo Html::hidden( 'title', $this->get( 'searchtitle' ) );
-                       // We construct two buttons (for 'go' and 'fulltext' search modes), but only one will be
-                       // visible and actionable at a time (they are overlaid on top of each other in CSS).
-                       // * Browsers will use the 'fulltext' one by default (as it's the first in tree-order), which
-                       //   is desirable when they are unable to show search suggestions (either due to being broken
-                       //   or having JavaScript turned off).
-                       // * The mediawiki.searchSuggest module, after doing tests for the broken browsers, removes
-                       //   the 'fulltext' button and handles 'fulltext' search itself; this will reveal the 'go'
-                       //   button and cause it to be used.
-                       echo $this->makeSearchButton( 'fulltext', array( 'id' => 'mw-searchButton', 'class' => 'searchButton mw-fallbackSearchButton' ) );
-                       echo $this->makeSearchButton( 'go', array( 'id' => 'searchButton', 'class' => 'searchButton' ) );
-                       ?>
-               </div>
-       </form>
-</div>
-<?php
+                                       ?>
+                                       <div id="p-search" role="search">
+                                               <h3<?php $this->html( 'userlangattributes' ) ?>>
+                                                       <label for="searchInput"><?php $this->msg( 'search' ) ?></label>
+                                               </h3>
 
-                               break;
+                                               <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
+                                                       <?php
+                                                       if ($wgVectorUseSimpleSearch) {
+                                                       ?>
+                                                       <div id="simpleSearch">
+                                                               <?php
+                                                       } else {
+                                                       ?>
+                                                               <div>
+                                                                       <?php
+                                                       }
+                                                       ?>
+                                                       <?php
+                                                       echo $this->makeSearchInput( array( 'id' => 'searchInput' ) );
+                                                       echo Html::hidden( 'title', $this->get( 'searchtitle' ) );
+                                                       // We construct two buttons (for 'go' and 'fulltext' search modes),
+                                                       // but only one will be visible and actionable at a time (they are
+                                                       // overlaid on top of each other in CSS).
+                                                       // * Browsers will use the 'fulltext' one by default (as it's the
+                                                       //   first in tree-order), which is desirable when they are unable
+                                                       //   to show search suggestions (either due to being broken or
+                                                       //   having JavaScript turned off).
+                                                       // * The mediawiki.searchSuggest module, after doing tests for the
+                                                       //   broken browsers, removes the 'fulltext' button and handles
+                                                       //   'fulltext' search itself; this will reveal the 'go' button and
+                                                       //   cause it to be used.
+                                                       echo $this->makeSearchButton(
+                                                               'fulltext',
+                                                               array( 'id' => 'mw-searchButton', 'class' => 'searchButton mw-fallbackSearchButton' )
+                                                       );
+                                                       echo $this->makeSearchButton(
+                                                               'go',
+                                                               array( 'id' => 'searchButton', 'class' => 'searchButton' )
+                                                       );
+                                                       ?>
+                                                               </div>
+                                               </form>
+                                       </div>
+                                       <?php
+
+                                       break;
                        }
                }
        }
index ef9cf8f..5882396 100644 (file)
@@ -85,8 +85,6 @@ textarea {
        font-size: 9pt;
 }
 
-
-
 #quickbar {
        font-family: Verdana, Arial, sans-serif;
        font-size: 8pt;
@@ -197,10 +195,19 @@ input.mw-searchInput {
 }
 
 /* Directionality-specific styles */
-#quickbar { position: absolute; left: 4px; }
-#article { margin-left: 148px; margin-right: 4px; }
-#footer { margin-left: 152px; }
+#quickbar {
+       position: absolute;
+       left: 4px;
+}
 
+#article {
+       margin-left: 148px;
+       margin-right: 4px;
+}
+
+#footer {
+       margin-left: 152px;
+}
 
 #sitetitle, #sitesub, #toplinks, #linkcollection {
        margin-top: 0;
@@ -212,6 +219,7 @@ input.mw-searchInput {
        text-transform: uppercase;
        height: 32pt;
 }
+
 #sitetitle {
        padding-left: 8px;
        font-family: Times, serif;
@@ -220,14 +228,16 @@ input.mw-searchInput {
        line-height: 32pt;
        background-color: #6688AA;
 }
+
 #sitetitle a, #toplinks a {
        color: white;
        text-decoration: none;
 }
+
 /* Bring #sitetitle to top. Otherwise #toplinks is overlaid over it, making the link unclickable. */
 #sitetitle a {
        position: relative;
-       z-index: 10
+       z-index: 10;
 }
 
 #toplinks {
@@ -238,9 +248,11 @@ input.mw-searchInput {
        width: 100%;
        font-size: 8pt;
 }
+
 #toplinks a {
        font-size: 10pt;
 }
+
 #toplinks p {
        position: absolute;
        right: 0;
@@ -248,9 +260,11 @@ input.mw-searchInput {
        width: 100%;
        text-align: right;
 }
+
 #toplinks #syslinks {
        bottom: 0;
 }
+
 #toplinks #variantlinks {
        bottom: 12pt;
 }
@@ -271,6 +285,7 @@ input.mw-searchInput {
        text-align: right;
        padding-left: 140px;
 }
+
 /* Override text justification (user preference), see bug 31990 */
 #linkcollection * {
        text-align: right;
index 41d20fb..4157b55 100644 (file)
@@ -45,6 +45,7 @@ table#toc,
 table.toc {
        border-collapse: collapse;
 }
+
 /* Remove additional paddings inside table-cells that are not present in <div>s */
 table#toc td,
 table.toc td {
@@ -59,12 +60,14 @@ table.toc td {
        font-size: 100%;
        font-weight: bold;
 }
+
 #toc #toctitle,
 .toc #toctitle,
 #toc .toctitle,
 .toc .toctitle {
        text-align: center;
 }
+
 #toc ul,
 .toc ul {
        list-style-type: none;
@@ -73,10 +76,12 @@ table.toc td {
        padding: 0;
        text-align: left;
 }
+
 #toc ul ul,
 .toc ul ul {
        margin: 0 0 0 2em;
 }
+
 #toc .toctoggle,
 .toc .toctoggle {
        font-size: 94%;
@@ -101,18 +106,27 @@ table.toc td {
        margin: 0 0 .5em .5em;
        border: 0;
 }
-div.floatright p { font-style: italic; }
+
+div.floatright p {
+       font-style: italic;
+}
+
 /* @noflip */div.floatleft, table.floatleft {
        margin: 0 .5em .5em 0;
        border: 0;
 }
-div.floatleft p { font-style: italic; }
+
+div.floatleft p {
+       font-style: italic;
+}
+
 /* Thumbnails */
 div.thumb {
        margin-bottom: .5em;
        width: auto;
        background-color: transparent;
 }
+
 div.thumbinner {
        border: 1px solid #ccc;
        padding: 3px !important;
@@ -121,31 +135,38 @@ div.thumbinner {
        text-align: center;
        overflow: hidden;
 }
+
 html .thumbimage {
        border: 1px solid #ccc;
 }
+
 html .thumbcaption {
        border: none;
        line-height: 1.4em;
        padding: 3px !important;
        font-size: 94%;
 }
+
 div.magnify {
        border: none !important;
        background: none !important;
        margin-left: 3px;
 }
+
 div.magnify a, div.magnify img {
        display: block;
        border: none !important;
        background: none !important;
 }
+
 /* @noflip */div.tright {
        margin: .5em 0 1.3em 1.4em;
 }
+
 /* @noflip */div.tleft {
        margin: .5em 1.4em 1.3em 0;
 }
+
 img.thumbborder {
        border: 1px solid #dddddd;
 }
index ad7942a..7b2cc40 100644 (file)
@@ -12,21 +12,27 @@ a {
        color: #0645ad;
        background: none;
 }
+
 a:visited {
        color: #0b0080;
 }
+
 a:active {
        color: #faa700;
 }
+
 a:hover, a:focus {
        text-decoration: underline;
 }
+
 a.stub {
        color: #772233;
 }
+
 a.new, #p-personal a.new {
        color: #ba0000;
 }
+
 a.new:visited, #p-personal a.new:visited {
        color: #a55858;
 }
@@ -36,9 +42,11 @@ a.new:visited, #p-personal a.new:visited {
 .mw-body a.extiw:active {
        color: #36b;
 }
+
 .mw-body a.extiw:visited {
        color: #636;
 }
+
 .mw-body a.extiw:active {
        color: #b63;
 }
@@ -47,9 +55,11 @@ a.new:visited, #p-personal a.new:visited {
 .mw-body a.external {
        color: #36b;
 }
+
 .mw-body a.external:visited {
        color: #636; /* bug 3112 */
 }
+
 .mw-body a.external:active {
        color: #b63;
 }
@@ -59,6 +69,7 @@ img {
        border: none;
        vertical-align: middle;
 }
+
 hr {
        height: 1px;
        color: #aaa;
@@ -83,12 +94,15 @@ h6 {
        padding-bottom: .17em;
        border-bottom: 1px solid #aaa;
 }
+
 h1 {
        font-size: 188%;
 }
+
 h2 {
        font-size: 150%;
 }
+
 h3,
 h4,
 h5,
@@ -96,15 +110,19 @@ h6 {
        border-bottom: none;
        font-weight: bold;
 }
+
 h3 {
        font-size: 132%;
 }
+
 h4 {
        font-size: 116%;
 }
+
 h5 {
        font-size: 108%;
 }
+
 h6 {
        font-size: 100%;
 }
@@ -114,6 +132,7 @@ h1,
 h2 {
        margin-bottom: .6em;
 }
+
 h3,
 h4,
 h5 {
@@ -124,6 +143,7 @@ p {
        margin: .4em 0 .5em 0;
        line-height: 1.5em;
 }
+
 p img {
        margin: 0;
 }
@@ -134,23 +154,28 @@ ul {
        margin: .3em 0 0 1.6em;
        padding: 0;
 }
+
 ol {
        line-height: 1.5em;
        margin: .3em 0 0 3.2em;
        padding: 0;
        list-style-image: none;
 }
+
 li {
        margin-bottom: .1em;
 }
+
 dt {
        font-weight: bold;
        margin-bottom: .1em;
 }
+
 dl {
        margin-top: .2em;
        margin-bottom: .5em;
 }
+
 dd {
        line-height: 1.5em;
        margin-left: 1.6em;
@@ -170,9 +195,11 @@ pre, code, tt, kbd, samp, .mw-code {
         */
        font-family: monospace, Courier;
 }
+
 code {
        background-color: #f9f9f9;
 }
+
 pre, .mw-code {
        padding: 1em;
        border: 1px solid #ddd;
@@ -192,18 +219,22 @@ fieldset {
        padding: 0 1em 1em;
        line-height: 1.5em;
 }
+
 fieldset.nested {
        margin: 0 0 0.5em 0;
        padding: 0 0.5em 0.5em;
 }
+
 legend {
        padding: .5em;
        font-size: 95%;
 }
+
 form {
        border: none;
        margin: 0;
 }
+
 textarea {
        width: 100%;
        padding: .1em;
@@ -212,6 +243,7 @@ textarea {
        -webkit-box-sizing: border-box;
        box-sizing: border-box;
 }
+
 select {
        vertical-align: top;
 }
@@ -221,15 +253,17 @@ select {
        width: 100%;
        text-align: center;
 }
+
 *.center * {
        margin-left: auto;
        margin-right: auto;
 }
+
 /* Small for tables and similar */
 .small {
        font-size: 94%;
 }
+
 table.small {
        font-size: 100%;
 }
-
index 7eca070..733fd11 100644 (file)
@@ -32,6 +32,7 @@
        text-align: center;
        margin: 0;
 }
+
 #localNotice {
        margin-bottom: 0.9em;
 }
 #siteSub {
        display: none;
 }
+
 #jump-to-nav {
        /* Negate #contentSub's margin and replicate it so that the jump to links don't affect the spacing */
        margin-top: -1.4em;
-       margin-bottom: 1.4em
+       margin-bottom: 1.4em;
 }
+
 #contentSub, #contentSub2 {
        font-size: 84%;
        line-height: 1.2em;
@@ -62,7 +65,7 @@
        color: #545454;
        width: auto;
 }
+
 span.subpages {
        display: block;
 }
-
index f0ea2e9..b64ceb0 100644 (file)
@@ -32,18 +32,22 @@ div.floatright {
        position: relative;
        margin: 0.5em 0 0.8em 1.4em;
 }
+
 div.floatright p {
        font-style: italic;
 }
+
 div.floatleft {
        float: left;
        clear: left;
        position: relative;
        margin: 0.5em 1.4em 0.8em 0;
 }
+
 div.floatleft p {
        font-style: italic;
 }
+
 div.center {
        text-align: center;
 }
@@ -56,17 +60,20 @@ div.thumb {
        margin-bottom: 0.8em;
        background-color: transparent;
 }
+
 div.thumbinner {
-       border:1px solid #cccccc;
+       border: 1px solid #cccccc;
        padding: 3px !important;
        background-color: White;
        font-size: 94%;
        text-align: center;
        overflow: hidden;
 }
+
 html .thumbimage {
        border: 1px solid #cccccc;
 }
+
 html .thumbcaption {
        border: none;
        text-align: left;
@@ -78,18 +85,21 @@ html .thumbcaption {
 div.magnify {
        display: none;
 }
+
 /* @noflip */
 div.tright {
        float: right;
        clear: right;
        margin: 0.5em 0 0.8em 1.4em;
 }
+
 /* @noflip */
 div.tleft {
        float: left;
        clear: left;
        margin: 0.5em 1.4em 0.8em 0;
 }
+
 img.thumbborder {
        border: 1px solid #dddddd;
 }
@@ -151,9 +161,10 @@ ul {
        margin: 0 !important;
        direction: ltr;
 }
+
 #footer {
-       background : white;
-       color : black;
+       background: white;
+       color: black;
        margin-top: 1em;
        border-top: 1px solid #AAA;
        direction: ltr;
@@ -307,26 +318,32 @@ div.gallerytext {
 table.diff {
        background: white;
 }
+
 td.diff-otitle {
        background: #ffffff;
 }
+
 td.diff-ntitle {
        background: #ffffff;
 }
+
 td.diff-addedline {
        background: #ccffcc;
        font-size: smaller;
        border: solid 2px black;
 }
+
 td.diff-deletedline {
        background: #ffffaa;
        font-size: smaller;
        border: dotted 2px black;
 }
+
 td.diff-context {
        background: #eeeeee;
        font-size: smaller;
 }
+
 .diffchange {
        color: silver;
        font-weight: bold;
@@ -344,12 +361,14 @@ table.mw_metadata {
        background: white;
        border-collapse: collapse;
 }
+
 table.wikitable > tr > th, table.wikitable > tr > td,
 table.wikitable > * > tr > th, table.wikitable > * > tr > td,
 .mw_metadata th, .mw_metadata td {
        border: 1px #aaa solid;
        padding: 0.2em;
 }
+
 table.wikitable > tr > th,
 table.wikitable > * > tr > th,
 .mw_metadata th {
@@ -357,6 +376,7 @@ table.wikitable > * > tr > th,
        background: white;
        font-weight: bold;
 }
+
 table.wikitable > caption,
 .mw_metadata caption {
        font-weight: bold;
@@ -370,9 +390,11 @@ a.sortheader {
 .wikitable, .thumb, img {
        page-break-inside: avoid;
 }
+
 h2, h3, h4, h5, h6 {
        page-break-after: avoid;
 }
+
 p {
        widows: 3;
        orphans: 3;
index d81218e..ecd10fa 100644 (file)
@@ -54,4 +54,3 @@ td, h3, p, h1, pre {
 .dent {
        margin-left: 64px;
 }
-
index d646273..e1f7a83 100644 (file)
@@ -6,26 +6,32 @@
 .config-section {
        margin-top: 2em;
 }
+
 .config-block {
        margin-top: 2em;
        display: block;
 
 }
+
 .config-block-label {
        display: block;
        margin-bottom: .2em;
 }
+
 .config-block-label label, .config-label {
        font-weight: bold;
        padding-right: .5em;
        padding-top: .2em;
 }
+
 .config-block-elements {
        margin-left: 2em;
 }
+
 .config-block-elements li {
        list-style: none;
 }
+
 .config-input {
        clear: left;
        zoom: 100%; /* IE hack */
        font-size: 110%;
        color: green;
 }
+
 .success-box {
        font-size: 130%;
 }
index 9439663..dc0453d 100644 (file)
@@ -32,55 +32,104 @@ rss:before {
 feed:before {
        content: "This Atom feed is meant to be read in a syndicated news reader, and isn't ideal for a web browser.";
 }
+
 rss:before, feed:before {
        color: red;
        text-align: center;
        line-height: 2em;
 }
 
-channel>title,
-item>title,
-feed>title,
-entry>title {
+channel > title,
+item > title,
+feed > title,
+entry > title {
        font-weight: bold;
        border-bottom: solid 1px #aaa;
        margin-left: -0.5em;
 }
-channel>title, feed>title {
+
+channel > title, feed > title {
        font-size: larger;
 }
-item>title, entry>title {
+
+item > title, entry > title {
        font-size: large;
 }
+
 item, entry {
        margin-top: 1em;
        margin-left: 2em;
 }
 
-item>description, entry>summary {
+item > description, entry > summary {
        white-space: pre;
        overflow: auto;
        background: #f8f8ff;
 }
 
-pubDate:before { content: "Date: " }
-link:before { content: "Link: " }
-author:before, creator:before { content: "Author: " }
-description:before { content: "Description: " }
-id:before { content: "Id: " }
-
-generator:before { content: "Generator: " }
-language:before { content: "Language: " }
-lastBuildDate:before { content: "Updated: " }
-comments:before { content: "Comments page: " }
-
-tagline:before { content: "Tagline: " }
-issued:before { content: "Issued: " }
-created:before { content: "Created: " }
-modified:before { content: "Modified: " }
-updated:before { content: "Updated: " }
-summary:before { content: "Summary: " }
-comment:before { content: "Comment: " }
+pubDate:before {
+       content: "Date: ";
+}
+
+link:before {
+       content: "Link: ";
+}
+
+author:before, creator:before {
+       content: "Author: ";
+}
+
+description:before {
+       content: "Description: ";
+}
+
+id:before {
+       content: "Id: ";
+}
+
+generator:before {
+       content: "Generator: ";
+}
+
+language:before {
+       content: "Language: ";
+}
+
+lastBuildDate:before {
+       content: "Updated: ";
+}
+
+comments:before {
+       content: "Comments page: ";
+}
+
+tagline:before {
+       content: "Tagline: ";
+}
+
+issued:before {
+       content: "Issued: ";
+}
+
+created:before {
+       content: "Created: ";
+}
+
+modified:before {
+       content: "Modified: ";
+}
+
+updated:before {
+       content: "Updated: ";
+}
+
+summary:before {
+       content: "Summary: ";
+}
+
+comment:before {
+       content: "Comment: ";
+}
 
 pubDate:before, link:before, author:before, description:before,
 language:before, generator:before, lastBuildDate:before, comments:before,
index eea8b8e..250f15c 100644 (file)
@@ -8,19 +8,40 @@
  * http://www.w3.org/TR/CSS21/sample.html to make sure the editsection links scale right
  */
 
-h1 { font-size: 2em; }
-h2 { font-size: 1.5em; }
-h3 { font-size: 1.17em; }
-h4 { font-size: 1.11em; }
-h5 { font-size: 1.05em; }
-h6 { font-size: 1em; }
+h1 {
+       font-size: 2em;
+}
+
+h2 {
+       font-size: 1.5em;
+}
+
+h3 {
+       font-size: 1.17em;
+}
+
+h4 {
+       font-size: 1.11em;
+}
+
+h5 {
+       font-size: 1.05em;
+}
+
+h6 {
+       font-size: 1em;
+}
+
 h1, h2, h3, h4, h5, h6 {
        font-weight: bolder;
 }
 
 /* Now the custom parts */
 
-#footer { clear: both }
+#footer {
+       clear: both;
+}
+
 /* images */
 /* @noflip */
 div.floatright {
@@ -62,6 +83,7 @@ div.thumb {
        border-color: white;
        width: auto;
 }
+
 div.thumbinner {
        border: 1px solid #ccc;
        padding: 3px !important;
@@ -70,9 +92,11 @@ div.thumbinner {
        text-align: center;
        overflow: hidden;
 }
+
 html .thumbimage {
        border: 1px solid #ccc;
 }
+
 html .thumbcaption {
        border: none;
        text-align: left;
@@ -80,24 +104,28 @@ html .thumbcaption {
        padding: 3px !important;
        font-size: 94%;
 }
+
 div.magnify {
        float: right;
        border: none !important;
        background: none !important;
        margin-left: 3px;
 }
+
 div.magnify a,
 div.magnify img {
        display: block;
        border: none !important;
        background: none !important;
 }
+
 /* @noflip */
 div.tright {
        clear: right;
        float: right;
        border-width: .5em 0 .8em 1.4em;
 }
+
 /* @noflip */
 div.tleft {
        float: left;
@@ -105,15 +133,20 @@ div.tleft {
        margin-right: .5em;
        border-width: .5em 1.4em .8em 0;
 }
+
 img.thumbborder {
        border: 1px solid #dddddd;
 }
 
 /* Page history styling */
 /* the auto-generated edit comments */
-.autocomment { color: #4b4b4b; }
+.autocomment {
+       color: #4b4b4b;
+}
 
-img { border: none; }
+img {
+       border: none;
+}
 
 #toc,
 .toc {
@@ -132,16 +165,19 @@ img { border: none; }
 
        padding: 7px;
 }
+
 /* CSS for backwards-compatibility with cached page renders and creative uses in wikitext */
 table#toc,
 table.toc {
        border-collapse: collapse;
 }
+
 /* Remove additional paddings inside table-cells that are not present in <div>s */
 table#toc td,
 table.toc td {
        padding: 0;
 }
+
 #toc h2,
 .toc h2 {
        display: inline;
@@ -150,6 +186,7 @@ table.toc td {
        font-size: 100%;
        font-weight: bold;
 }
+
 #toc ul,
 .toc ul {
        list-style-type: none;
@@ -157,10 +194,12 @@ table.toc td {
        padding: 0;
        text-align: left;
 }
+
 #toc ul ul,
 .toc ul ul {
        margin: 0 0 0 2em;
 }
+
 #toc .toctoggle,
 .toc .toctoggle {
        font-size: 94%;
@@ -177,31 +216,38 @@ table.toc td {
        margin: 1em 1em 1em 1em;
        width: 13em;
 }
+
 #preftoc li {
        border: 1px solid White;
 }
+
 #preftoc li.selected {
-       background-color:#f9f9f9;
-       border:1px dashed #aaaaaa;
+       background-color: #f9f9f9;
+       border: 1px dashed #aaaaaa;
 }
+
 #preftoc a,
 #preftoc a:active {
        display: block;
        color: #005189;
 }
+
 .mw-prefs-buttons {
        clear: left;
        float: left;
        margin-top: 1em;
 }
+
 div.htmlform-tip {
        font-size: 94%;
        margin-top: 0.4em;
        color: #666;
 }
+
 fieldset.prefsection {
        margin-top: 1em;
 }
+
 fieldset.operaprefsection {
        margin-left: 15em;
 }
@@ -211,6 +257,7 @@ fieldset.operaprefsection {
        width: 100%;
        text-align: center;
 }
+
 *.center * {
        margin-left: auto;
        margin-right: auto;
@@ -220,6 +267,7 @@ fieldset.operaprefsection {
 .small {
        font-size: 94%;
 }
+
 table.small {
        font-size: 100%;
 }
@@ -231,18 +279,22 @@ table.small {
        padding: 5px;
        font-size: 95%;
 }
+
 #siteNotice {
        border: 1px solid #aaaaaa;
        padding-left: 0.5em;
        padding-right: 0.5em;
 }
+
 .redirectText {
        font-size: 150%;
        margin: 5px;
 }
+
 .sharedUploadNotice {
        font-style: italic;
 }
+
 span.unpatrolled {
        font-weight: bold;
        color: red;
@@ -269,6 +321,7 @@ span.changedby {
        text-align: center;
        color: #cc0000;
 }
+
 .editExternally {
        border-style: solid;
        border-width: 1px;
@@ -280,6 +333,7 @@ span.changedby {
        font-size: small;
        text-align: center;
 }
+
 .editExternallyHelp {
        font-style: italic;
        color: gray;
@@ -299,9 +353,11 @@ table.mw_metadata {
 table.mw_metadata caption {
        font-weight: bold;
 }
+
 table.mw_metadata th {
        font-weight: normal;
 }
+
 table.mw_metadata td {
        padding: 0.1em;
 }
@@ -310,23 +366,28 @@ table.mw_metadata {
        border: none;
        border-collapse: collapse;
 }
+
 table.mw_metadata td,
 table.mw_metadata th {
        border: 1px solid #aaaaaa;
        padding-left: 4px;
        padding-right: 4px;
 }
+
 table.mw_metadata th {
        background-color: #f9f9f9;
 }
+
 table.mw_metadata td {
        background-color: #fcfcfc;
 }
+
 table.mw_metadata td.spacer {
        background: inherit;
        border-top: none;
        border-bottom: none;
 }
+
 table.collapsed tr.collapsable {
        display: none;
 }
@@ -388,21 +449,26 @@ table.multipageimage td {
 .TablePager_nav a {
        text-decoration: none;
 }
+
 .TablePager {
        border-collapse: collapse;
 }
+
 .TablePager,
 .TablePager td,
 .TablePager th {
        border: 0.15em solid #777777;
        padding: 0 0.15em 0 0.15em;
 }
+
 .TablePager th {
        background-color: #eeeeff;
 }
+
 .TablePager td {
        background-color: #ffffff;
 }
+
 .TablePager tr:hover td {
        background-color: #eeeeff;
 }
@@ -411,12 +477,15 @@ table.multipageimage td {
 .imagelist th {
        white-space: nowrap;
 }
+
 .imagelist .TablePager_col_links {
        background-color: #eeeeff;
 }
+
 .imagelist .TablePager_col_img_description {
        white-space: normal;
 }
+
 .imagelist th.TablePager_sort {
        background-color: #ccccff;
 }
@@ -430,6 +499,7 @@ table.multipageimage td {
        background-color: #ccc;
        padding: 0.1em;
 }
+
 .MediaTransformError td {
        text-align: center;
        vertical-align: middle;
@@ -445,6 +515,7 @@ body {
        unicode-bidi: embed;
        background-color: #ffffec;
 }
+
 body.ns-0 {
        background-color: white;
 }
@@ -461,6 +532,7 @@ body.ns-0 {
 html > body.rtl div#article ul {
        display: table;
 }
+
 /* @noflip */
 html > body.rtl div#bodyContent ul#filetoc {
        display: block;
index 6b052b3..ac7f407 100644 (file)
@@ -14,6 +14,7 @@
        /* @noflip */
        direction: ltr;
 }
+
 .mw-content-rtl {
        /* @noflip */
        direction: rtl;
@@ -25,6 +26,7 @@
        /* @noflip */
        direction: ltr;
 }
+
 .sitedir-rtl textarea,
 .sitedir-rtl input {
        /* @noflip */
@@ -52,6 +54,7 @@ input[dir="ltr"] {
        /* @noflip */
        direction: ltr;
 }
+
 textarea[dir="rtl"],
 input[dir="rtl"] {
        /* @noflip */
@@ -69,9 +72,11 @@ abbr[title],
 .mw-plusminus-pos {
        color: #006400; /* dark green */
 }
+
 .mw-plusminus-neg {
        color: #8b0000; /* dark red */
 }
+
 .mw-plusminus-null {
        color: #aaa; /* gray */
 }
@@ -100,9 +105,11 @@ span.changedby {
        direction: ltr;
        unicode-bidi: embed;
 }
+
 img.tex {
        vertical-align: middle;
 }
+
 span.texhtml {
        font-family: serif;
 }
@@ -145,9 +152,11 @@ table.filehistory th,
 table.filehistory td {
        vertical-align: top;
 }
+
 table.filehistory th {
        text-align: left;
 }
+
 table.filehistory td.mw-imagepage-filesize,
 table.filehistory th.mw-imagepage-filesize {
        white-space: nowrap;
@@ -200,9 +209,11 @@ div.patrollink {
 td.mw-label {
        text-align: right;
 }
+
 td.mw-input {
        text-align: left;
 }
+
 td.mw-submit {
        text-align: left;
 }
@@ -210,12 +221,15 @@ td.mw-submit {
 td.mw-label {
        vertical-align: top;
 }
+
 .prefsection td.mw-label {
        width: 20%;
 }
+
 .prefsection table {
        width: 100%;
 }
+
 .prefsection table.mw-htmlform-matrix {
        width: auto;
 }
@@ -284,14 +298,17 @@ input#wpSummary {
 .mw-content-ltr .thumbcaption {
        text-align: left;
 }
+
 /* @noflip */
 .mw-content-rtl .thumbcaption {
        text-align: right;
 }
+
 /* @noflip */
 .mw-content-ltr .magnify {
        float: right;
 }
+
 /* @noflip */
 .mw-content-rtl .magnify {
        float: left;
@@ -307,6 +324,7 @@ input#wpSummary {
         */
        text-align: left;
 }
+
 .catlinks ul {
        display: inline;
        margin: 0;
@@ -336,12 +354,14 @@ input#wpSummary {
 .catlinks li a.mw-redirect {
        font-style: italic;
 }
+
 /**
  * Hidden categories
  */
 .mw-hidden-cats-hidden {
        display: none;
 }
+
 .catlinks-allhidden {
        display: none;
 }
@@ -370,8 +390,8 @@ p.mw-revdel-editreasons {
        border-style: solid;
        border-color: #AAAAAA;
        border-width: 1px;
-       z-index:99;
-       font-size:95%;
+       z-index: 99;
+       font-size: 95%;
 }
 
 table.os-suggest-results {
@@ -389,6 +409,7 @@ table.os-suggest-results {
        color: black;
        padding: 2px;
 }
+
 .os-suggest-result-hl,
 .os-suggest-result-hl-webkit {
        background-color: #4C59A6;
@@ -400,6 +421,7 @@ table.os-suggest-results {
        left: 1ex;
        font-size: 65%;
 }
+
 .os-suggest-toggle-def {
        position: absolute;
        top: 0;
@@ -414,16 +436,20 @@ table.os-suggest-results {
 .autocomment {
        color: gray;
 }
+
 #pagehistory .history-user {
        margin-left: 0.4em;
        margin-right: 0.2em;
 }
+
 #pagehistory span.minor {
        font-weight: bold;
 }
+
 #pagehistory li {
        border: 1px solid white;
 }
+
 #pagehistory li.selected {
        background-color: #f9f9f9;
        border: 1px dashed #aaa;
@@ -457,6 +483,7 @@ div.mw-warning-with-logexcerpt {
        border: 2px solid #2F6FAB;
        clear: both;
 }
+
 div.mw-warning-with-logexcerpt ul li {
        font-size: 90%;
 }
@@ -466,6 +493,7 @@ span.mw-revdelundel-link,
 strong.mw-revdelundel-link {
        font-size: 90%;
 }
+
 span.mw-revdelundel-hidden,
 input.mw-revdelundel-hidden {
        visibility: hidden;
@@ -504,6 +532,7 @@ a.feedlink {
        background: none !important;
        padding: 0 !important;
 }
+
 /* External URLs should always be treated as LTR (bug 4330) */
 /* @noflip */ .rtl a.external.free,
 .rtl a.external.autonumber {
@@ -522,6 +551,7 @@ table.wikitable {
        border-collapse: collapse;
        color: black;
 }
+
 table.wikitable > tr > th,
 table.wikitable > tr > td,
 table.wikitable > * > tr > th,
@@ -529,11 +559,13 @@ table.wikitable > * > tr > td {
        border: 1px #aaa solid;
        padding: 0.2em;
 }
+
 table.wikitable > tr > th,
 table.wikitable > * > tr > th {
        background-color: #f2f2f2;
        text-align: center;
 }
+
 table.wikitable > caption {
        font-weight: bold;
 }
@@ -553,12 +585,15 @@ table.collapsed tr.collapsable {
 .success {
        font-size: larger;
 }
+
 .error {
        color: #cc0000;
 }
+
 .warning {
        color: #705000;
 }
+
 .success {
        color: #009000;
 }
@@ -574,6 +609,7 @@ table.collapsed tr.collapsable {
        zoom: 1;
        *display: inline;
 }
+
 .errorbox h2,
 .warningbox h2,
 .successbox h2 {
@@ -584,16 +620,19 @@ table.collapsed tr.collapsable {
        margin: 0 .5em 0 0;
        border: none;
 }
+
 .errorbox {
        color: #cc0000;
        border-color: #fac5c5;
        background-color: #fae3e3;
 }
+
 .warningbox {
        color: #705000;
        border-color: #fde29b;
        background-color: #fdf1d1;
 }
+
 .successbox {
        color: #009000;
        border-color: #b7fdb5;
@@ -642,23 +681,26 @@ table.collapsed tr.collapsable {
 .mw-datatable {
        border-collapse: collapse;
 }
+
 .mw-datatable,
 .mw-datatable td,
 .mw-datatable th {
        border: 1px solid #aaaaaa;
        padding: 0 0.15em 0 0.15em;
 }
+
 .mw-datatable th {
        background-color: #ddddff;
 }
+
 .mw-datatable td {
        background-color: #ffffff;
 }
+
 .mw-datatable tr:hover td {
        background-color: #eeeeff;
 }
 
-
 /**
  * TablePager tables generated by the TablePager PHP class
  * in MediaWiki (e.g. Special:ListFiles).
@@ -666,13 +708,16 @@ table.collapsed tr.collapsable {
 .TablePager {
        min-width: 80%;
 }
+
 .TablePager_nav {
        margin: 0 auto;
 }
+
 .TablePager_nav td {
        padding: 3px;
        text-align: center;
 }
+
 .TablePager_nav a {
        text-decoration: none;
 }
@@ -681,12 +726,15 @@ table.collapsed tr.collapsable {
 .imagelist th {
        white-space: nowrap;
 }
+
 .imagelist .TablePager_col_links {
        background-color: #eeeeff;
 }
+
 .imagelist .TablePager_col_img_description {
        white-space: normal;
 }
+
 .imagelist th.TablePager_sort {
        background-color: #ccccff;
 }
@@ -765,30 +813,35 @@ table.mw_metadata ul.metadata-langlist {
        margin: 0.3em 0 0 1.6em;
        padding: 0;
 }
+
 .mw-content-rtl ul,
 .mw-content-ltr .mw-content-rtl ul {
        /* @noflip */
        margin: 0.3em 1.6em 0 0;
        padding: 0;
 }
+
 .mw-content-ltr ol,
 .mw-content-rtl .mw-content-ltr ol {
        /* @noflip */
        margin: 0.3em 0 0 3.2em;
        padding: 0;
 }
+
 .mw-content-rtl ol,
 .mw-content-ltr .mw-content-rtl ol {
        /* @noflip */
        margin: 0.3em 3.2em 0 0;
        padding: 0;
 }
+
 /* @noflip */
 .mw-content-ltr dd,
 .mw-content-rtl .mw-content-ltr dd {
        margin-left: 1.6em;
        margin-right: 0;
 }
+
 /* @noflip */
 .mw-content-rtl dd,
 .mw-content-ltr .mw-content-rtl dd {
@@ -861,6 +914,7 @@ ul.mw-gallery-packed-hover li.gallerybox div.thumb {
        background-color: transparent;
        border: none;
 }
+
 ul.mw-gallery-packed li.gallerybox div.thumb img,
 ul.mw-gallery-packed-overlay li.gallerybox div.thumb img,
 ul.mw-gallery-packed-hover li.gallerybox div.thumb img {
@@ -869,7 +923,7 @@ ul.mw-gallery-packed-hover li.gallerybox div.thumb img {
 
 ul.mw-gallery-packed-hover li.gallerybox,
 ul.mw-gallery-packed-overlay li.gallerybox {
-       position:relative;
+       position: relative;
 }
 
 ul.mw-gallery-packed-hover div.gallerytextwrapper {
@@ -880,7 +934,7 @@ ul.mw-gallery-packed-hover div.gallerytextwrapper {
 ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper,
 ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper,
 ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper {
-       position:absolute;
+       position: absolute;
        background: white;
        background: rgba(255, 255, 255, 0.8);
        padding: 5px 10px;
@@ -941,6 +995,7 @@ h1:lang(ta),
 h1:lang(te) {
        line-height: 1.6em !important;
 }
+
 h2:lang(anp), h3:lang(anp), h4:lang(anp), h5:lang(anp), h6:lang(anp),
 h2:lang(as), h3:lang(as), h4:lang(as), h5:lang(as), h6:lang(as),
 h2:lang(bho), h3:lang(bho), h4:lang(bho), h5:lang(bho), h6:lang(bho),
@@ -1009,18 +1064,21 @@ ol:lang(or) li {
 .mw-content-rtl .mw-content-ltr #toc ul {
        text-align: left;
 }
+
 /* @noflip */ .mw-content-rtl .toc ul,
 .mw-content-rtl #toc ul,
 .mw-content-ltr .mw-content-rtl .toc ul,
 .mw-content-ltr .mw-content-rtl #toc ul {
        text-align: right;
 }
+
 /* @noflip */ .mw-content-ltr .toc ul ul,
 .mw-content-ltr #toc ul ul,
 .mw-content-rtl .mw-content-ltr .toc ul ul,
 .mw-content-rtl .mw-content-ltr #toc ul ul {
        margin: 0 0 0 2em;
 }
+
 /* @noflip */ .mw-content-rtl .toc ul ul,
 .mw-content-rtl #toc ul ul,
 .mw-content-ltr .mw-content-rtl .toc ul ul,
@@ -1050,17 +1108,20 @@ ol:lang(or) li {
        text-decoration: underline;
        color: #0645ad;
 }
+
 .mw-help-field-hint:hover {
        /* @embed */
        background-image: url(images/help-question-hover.gif);
 }
+
 .mw-help-field-data {
        display: block;
        background-color: #d6f3ff;
-       padding:5px 8px 4px 8px;
+       padding: 5px 8px 4px 8px;
        border: 1px solid #5dc9f4;
        margin-left: 20px;
 }
+
 .tipsy {
        padding: 5px 5px 10px;
        font-size: 12px;
@@ -1068,6 +1129,7 @@ ol:lang(or) li {
        z-index: 100000;
        overflow: visible;
 }
+
 .tipsy-inner {
        padding: 5px 8px 4px 8px;
        background-color: #d6f3ff;
@@ -1076,6 +1138,7 @@ ol:lang(or) li {
        max-width: 300px;
        text-align: left;
 }
+
 .tipsy-arrow {
        position: absolute;
        /* @embed */
@@ -1083,6 +1146,7 @@ ol:lang(or) li {
        width: 13px;
        height: 13px;
 }
+
 .tipsy-se .tipsy-arrow {
        bottom: -2px;
        right: 10px;
@@ -1104,14 +1168,17 @@ ol:lang(or) li {
        direction: ltr;
        unicode-bidi: embed;
 }
+
 /* @noflip */ .diff-contentalign-right td {
        direction: rtl;
        unicode-bidi: embed;
 }
+
 /* @noflip */ .diff-contentalign-left td {
        direction: ltr;
        unicode-bidi: embed;
 }
+
 .diff-multi,
 .diff-otitle,
 .diff-ntitle,
@@ -1135,12 +1202,14 @@ table.floatright {
        clear: right;
        float: right;
 }
+
 /* @noflip */ div.tleft,
 div.floatleft,
 table.floatleft {
        float: left;
        clear: left;
 }
+
 div.floatright,
 table.floatright,
 div.floatleft,
@@ -1203,6 +1272,7 @@ table.floatleft {
 .mw-content-rtl .mw-content-ltr .mw-editsection {
        margin-left: 1em;
 }
+
 /* @noflip */
 .mw-content-rtl .mw-editsection,
 .mw-content-ltr .mw-content-rtl .mw-editsection {
index a7ff2da..d30f554 100644 (file)
@@ -19,7 +19,6 @@ if ( mw.config.get( 'wgBreakFrames' ) ) {
 
 /**
  * User-agent sniffing.
- * To be removed in MediaWiki 1.23.
  *
  * @deprecated since 1.17 Use jquery.client instead
  */
@@ -51,8 +50,6 @@ mw.log.deprecate( win, 'ie6_bugs', false, msg );
 /**
  * DOM utilities for handling of events, text nodes and selecting elements
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.17 Use jQuery instead
  */
 msg = 'Use jQuery instead.';
@@ -104,8 +101,6 @@ $( win ).on( 'load', function () {
 /**
  * Toggle checkboxes with shift selection
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.17 Use jquery.checkboxShiftClick instead
  */
 msg = 'Use jquery.checkboxShiftClick instead.';
@@ -118,8 +113,6 @@ mw.log.deprecate( win, 'checkboxClickHandler', $.noop, msg );
 /**
  * Add a button to the default editor toolbar
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.17 Use mw.toolbar instead
  */
 mw.log.deprecate( win, 'mwEditButtons', [], 'Use mw.toolbar instead.' );
@@ -128,8 +121,6 @@ mw.log.deprecate( win, 'mwCustomEditButtons', [], 'Use mw.toolbar instead.' );
 /**
  * Spinner creation, injection and removal
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.18 Use jquery.spinner instead
  */
 mw.log.deprecate( win, 'injectSpinner', $.noop, 'Use jquery.spinner instead.' );
@@ -138,8 +129,6 @@ mw.log.deprecate( win, 'removeSpinner', $.noop, 'Use jquery.spinner instead.' );
 /**
  * Escape utilities
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.18 Use mw.html instead
  */
 mw.log.deprecate( win, 'escapeQuotes', $.noop, 'Use mw.html instead.' );
@@ -148,18 +137,23 @@ mw.log.deprecate( win, 'escapeQuotesHTML', $.noop, 'Use mw.html instead.' );
 /**
  * Display a message to the user
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.17 Use mediawiki.notify instead
  * @param {string|HTMLElement} message To be put inside the message box
  */
-mw.log.deprecate( win, 'jsMsg', mw.util.jsMessage, 'Use mediawiki.notify instead.' );
+mw.log.deprecate( win, 'jsMsg', function ( message ) {
+       if ( !arguments.length || message === '' || message === null ) {
+               return true;
+       }
+       if ( typeof message !== 'object' ) {
+               message = $.parseHTML( message );
+       }
+       mw.notify( message, { autoHide: true, tag: 'legacy' } );
+       return true;
+}, 'Use mediawiki.notify instead.' );
 
 /**
  * Misc. utilities
  *
- * To be removed in MediaWiki 1.23.
- *
  * @deprecated since 1.17 Use mediawiki.util instead
  */
 msg = 'Use mediawiki.util instead.';
index 6f73f0e..93f9fbb 100644 (file)
@@ -3,7 +3,6 @@ body {
        padding: 0 0 0 0;
        font-size: x-small;
 
-
        font-family: sans-serif;
        color: black;
        background-color: #f0f0f0;
@@ -262,7 +261,7 @@ ul {
        /* @embed */
        background: url(footer-grad.png) repeat-x 0 0;
        padding: 10px 1em 1em 1em;
-       clear:both;
+       clear: both;
        color: #444444;
 }
 
@@ -317,21 +316,27 @@ a {
        color: #003366;
        background: none;
 }
+
 a:visited {
        color: #5a3696;
 }
+
 a:active {
        color: #faa700;
 }
+
 a:hover {
        text-decoration: underline;
 }
+
 a.stub {
        color: #772233;
 }
+
 a.new {
        color: #ba0000;
 }
+
 a.new:visited {
        color: #a55858;
 }
@@ -404,34 +409,40 @@ h1, h2, h3, h4, h5, h6 {
        text-decoration: none;
        color: white;
 }
+
 #mw_content a.external {
        /* @embed */
        background: url(external.png) center right no-repeat;
        padding-right: 13px;
 }
+
 #mw_content a.external[href ^="https://"],
 .link-https {
        /* @embed */
        background: url(lock_icon.gif) center right no-repeat;
        padding-right: 16px;
 }
+
 #mw_content a.external[href ^="mailto:"],
 .link-mailto {
        /* @embed */
        background: url(mail_icon.gif) center right no-repeat;
        padding-right: 18px;
 }
+
 #mw_content a.external[href ^="news:"] {
        /* @embed */
        background: url(news_icon.png) center right no-repeat;
        padding-right: 18px;
 }
+
 #mw_content a.external[href ^="ftp://"],
 .link-ftp {
        /* @embed */
        background: url(file_icon.gif) center right no-repeat;
        padding-right: 18px;
 }
+
 #mw_content a.external[href ^="irc://"],
 #mw_content a.external[href ^="ircs://"],
 .link-irc {
@@ -451,6 +462,7 @@ h1, h2, h3, h4, h5, h6 {
        background: url(audio.png) center right no-repeat;
        padding-right: 13px;
 }
+
 #mw_content a.external[href $=".ogm"], #mw_content a.external[href $=".OGM"],
 #mw_content a.external[href $=".avi"], #mw_content a.external[href $=".AVI"],
 #mw_content a.external[href $=".mpeg"], #mw_content a.external[href $=".MPEG"],
@@ -460,6 +472,7 @@ h1, h2, h3, h4, h5, h6 {
        background: url(video.png) center right no-repeat;
        padding-right: 13px;
 }
+
 #mw_content a.external[href $=".pdf"], #mw_content a.external[href $=".PDF"],
 #mw_content a.external[href *=".pdf#"], #mw_content a.external[href *=".PDF#"],
 #mw_content a.external[href *=".pdf?"], #mw_content a.external[href *=".PDF?"],
@@ -474,13 +487,16 @@ h1, h2, h3, h4, h5, h6 {
        margin: 0 0 .5em .5em;
        border: 0;
 }
+
 div.floatright p {
        font-style: italic;
 }
+
 /* @noflip */div.floatleft, table.floatleft {
        margin: 0 .5em .5em 0;
        border: 0;
 }
+
 div.floatleft p {
        font-style: italic;
 }
@@ -490,6 +506,7 @@ div.thumb {
        margin-bottom: .5em;
        width: auto;
 }
+
 div.thumbinner {
        border: 1px solid #ccc;
        padding: 3px !important;
@@ -498,9 +515,11 @@ div.thumbinner {
        text-align: center;
        overflow: hidden;
 }
+
 html .thumbimage {
        border: 1px solid #ccc;
 }
+
 html .thumbcaption {
        border: none;
        text-align: left;
@@ -508,26 +527,32 @@ html .thumbcaption {
        padding: 3px !important;
        font-size: 94%;
 }
+
 div.magnify {
        float: right;
        border: none !important;
        background: none !important;
        margin-left: 3px;
 }
+
 div.magnify a, div.magnify img {
        display: block;
        border: none !important;
        background: none !important;
 }
+
 /* @noflip */div.tright {
        margin: .5em 0 .8em 1.4em;
 }
+
 /* @noflip */div.tleft {
        margin: .5em 1.4em .8em 0;
 }
+
 img.thumbborder {
        border: 1px solid #dddddd;
 }
+
 .mw-warning {
        border: 1px solid #aaa;
        background-color: #f9f9f9;
@@ -584,6 +609,7 @@ table.toc td {
        font-size: 100%;
        font-weight: bold;
 }
+
 #toc #toctitle,
 .toc #toctitle,
 #toc .toctitle,
@@ -634,11 +660,11 @@ table.toc td {
 #mw_content a.extiw:active {
        color: #36b;
 }
+
 #mw_content a.external {
        color: #36b;
 }
 
-
 .redirectText {
        font-size: 150%;
        margin: 5px;
@@ -679,6 +705,7 @@ span.updatedmarker {
        font-size: small;
        text-align: center;
 }
+
 .editExternallyHelp {
        font-style: italic;
        color: gray;
@@ -780,10 +807,12 @@ div.mw-lag-warn-high {
        text-align: center;
        margin: 3px auto;
 }
+
 div.mw-lag-warn-normal {
        border: 1px solid #FFCC66;
        background-color: #FFFFCC;
 }
+
 div.mw-lag-warn-high {
        font-weight: bold;
        border: 2px solid #FF0033;
@@ -794,11 +823,13 @@ div.mw-lag-warn-high {
        background-color: #ccc;
        padding: 0.1em;
 }
+
 .MediaTransformError td {
        text-align: center;
        vertical-align: middle;
        font-size: 90%;
 }
+
 ul {
        line-height: 1.5em;
        list-style-type: square;
@@ -807,19 +838,23 @@ ul {
        /* @embed */
        list-style-image: url(bullet.gif);
 }
+
 ol {
        line-height: 1.5em;
        margin: .3em 0 0 3.2em;
        padding: 0;
        list-style-image: none;
 }
+
 li {
        margin-bottom: .1em;
 }
+
 dt {
        font-weight: bold;
        margin-bottom: .1em;
 }
+
 dl {
        margin-top: .2em;
        margin-bottom: .5em;
@@ -876,6 +911,7 @@ pre, .mw-code {
        width: 100%;
        text-align: center;
 }
+
 *.center * {
        margin-left: auto;
        margin-right: auto;
index f3e4100..cd9399f 100644 (file)
@@ -6,29 +6,35 @@ div#column-content {
        margin-left: 0;
        height: 1%;
 }
+
 div#column-content div#content {
        margin-left: 12.2em;
        margin-top: 3em;
        height: 1%;
 }
+
 .rtl div#column-content div#content {
        margin-right: 12.2em;
        margin-left: 0;
 }
+
 div#column-one {
        position: absolute;
        top: 0;
        left: 0;
        z-index: 4;
 }
+
 .rtl div#column-one {
        left: auto;
        right: 0;
 }
+
 div#footer {
        margin-left: 13.6em;
        border-left: 1px solid #fabd23;
 }
+
 .rtl div#footer {
        margin-left: 0;
        margin-right: 13.6em;
@@ -59,6 +65,7 @@ div#footer {
        cursor: default;
        float: none !important;
 }
+
 #p-cactions li a {
        display: inline-block !important;
        vertical-align: top;
@@ -66,17 +73,21 @@ div#footer {
        border: solid #aaa;
        border-width: 1px 1px 0;
 }
+
 #p-cactions li.selected a {
        border-color: #fabd23;
        padding-bottom: 0.17em;
 }
+
 #p-cactions li a:hover {
        padding-bottom: 0.17em;
 }
+
 #p-navigation a {
        display: inline-block;
        width: 100%;
 }
+
 #portal-personaltools {
        padding-bottom: 0.1em;
 }
@@ -92,10 +103,12 @@ div#footer {
 #p-logo a:hover {
        cursor: pointer;
 }
+
 div.visualClear {
-       width:100%;
+       width: 100%;
        line-height: 0;
 }
+
 textarea {
        width: 96%;
 }
index e8d3a8f..42f9ce6 100644 (file)
@@ -8,12 +8,12 @@ div#column-content div#content {
        margin-top: 3em;
        height: 1%;
 }
+
 .rtl div#column-content div#content {
        margin-right: 12.2em;
        margin-left: 0;
 }
 
-
 .rtl div#column-one {
        /* For some reason it tries to inherit the padding-top into every div,
         * and I can't figure out how to get it back off.
@@ -37,13 +37,13 @@ li#pt-userpage, li#pt-anonuserpage, li#pt-login {
        padding-right: 0;
        padding-left: 16px;
 }
+
 /* the tabs */
 
 #p-cactions {
        z-index: 3;
 }
 
-
 #p-cactions li {
        padding-bottom: 0 !important;
        border: none;
@@ -59,20 +59,25 @@ li#pt-userpage, li#pt-anonuserpage, li#pt-login {
        border: solid #aaa;
        border-width: 1px 1px 0;
 }
+
 #p-cactions li.selected a {
        border-color: #fabd23;
        padding-bottom: 0.17em;
 }
+
 #p-cactions li a:hover {
        padding-bottom: 0.17em;
 }
+
 #p-navigation a {
        display: inline-block;
        width: 100%;
 }
+
 #portal-personaltools {
        padding-bottom: 0.1em;
 }
+
 textarea {
        width: 96%;
 }
@@ -85,7 +90,6 @@ div.tleft {
 }
 */
 
-
 div#footer li {
        /* Work around bug with inline <li> tags with right margins and nowrap */
        margin-right: 0;
index 4927d40..cb76ae3 100644 (file)
@@ -15,20 +15,24 @@ div#column-content {
        margin: 0 0 .6em -12.2em;
        padding: 0;
 }
+
 div#content {
        margin: 2.8em 0 0 12.2em;
        padding: 1em;
        position: relative;
        z-index: 2;
 }
+
 div#column-one {
        padding-top: 160px;
 }
+
 /* Hide, but keep accessible for screen-readers */
 #column-one h2 {
        position: absolute;
        top: -9999px;
 }
+
 div#content {
        background: white;
        color: black;
@@ -36,6 +40,7 @@ div#content {
        border-right: none;
        line-height: 1.5em;
 }
+
 /* the left column width is specified in class .portlet */
 
 /* Font size:
@@ -67,9 +72,11 @@ div#globalWrapper {
 a {
        color: #002bb8;
 }
+
 a:visited {
        color: #5a3696;
 }
+
 a.new,
 #p-personal a.new {
        color: #cc2200;
@@ -96,6 +103,7 @@ pre, .mw-code {
 #firstHeading {
        padding-top: 0;
 }
+
 /*
 ** the main content area
 */
@@ -104,9 +112,11 @@ pre, .mw-code {
        font-size: 95%;
        padding: 0 0.9em;
 }
+
 #localNotice {
        margin: 0;
 }
+
 #siteNotice p {
        margin: 0;
        padding: 0;
@@ -147,29 +157,34 @@ table.rimage {
        background: url(external-ltr.png) center right no-repeat;
        padding-right: 13px;
 }
+
 #bodyContent a.external[href ^="https://"],
 .link-https {
        /* @embed */
        background: url(lock_icon.gif) center right no-repeat;
        padding-right: 16px;
 }
+
 #bodyContent a.external[href ^="mailto:"],
 .link-mailto {
        /* @embed */
        background: url(mail_icon.gif) center right no-repeat;
        padding-right: 18px;
 }
+
 #bodyContent a.external[href ^="news:"] {
        /* @embed */
        background: url(news_icon.png) center right no-repeat;
        padding-right: 18px;
 }
+
 #bodyContent a.external[href ^="ftp://"],
 .link-ftp {
        /* @embed */
        background: url(file_icon.gif) center right no-repeat;
        padding-right: 18px;
 }
+
 #bodyContent a.external[href ^="irc://"],
 #bodyContent a.external[href ^="ircs://"],
 .link-irc {
@@ -177,6 +192,7 @@ table.rimage {
        background: url(discussionitem_icon.gif) center right no-repeat;
        padding-right: 18px;
 }
+
 #bodyContent a.external[href $=".ogg"], #bodyContent a.external[href $=".OGG"],
 #bodyContent a.external[href $=".mid"], #bodyContent a.external[href $=".MID"],
 #bodyContent a.external[href $=".midi"], #bodyContent a.external[href $=".MIDI"],
@@ -188,6 +204,7 @@ table.rimage {
        background: url(audio.png) center right no-repeat;
        padding-right: 13px;
 }
+
 #bodyContent a.external[href $=".ogm"], #bodyContent a.external[href $=".OGM"],
 #bodyContent a.external[href $=".avi"], #bodyContent a.external[href $=".AVI"],
 #bodyContent a.external[href $=".mpeg"], #bodyContent a.external[href $=".MPEG"],
@@ -197,6 +214,7 @@ table.rimage {
        background: url(video.png) center right no-repeat;
        padding-right: 13px;
 }
+
 #bodyContent a.external[href $=".pdf"], #bodyContent a.external[href $=".PDF"],
 #bodyContent a.external[href *=".pdf#"], #bodyContent a.external[href *=".PDF#"],
 #bodyContent a.external[href *=".pdf?"], #bodyContent a.external[href *=".PDF?"],
@@ -232,6 +250,7 @@ table.rimage {
        width: 11.6em;
        overflow: hidden;
 }
+
 .portlet h3 {
        background: transparent;
        padding: 0 1em 0 .5em;
@@ -242,6 +261,7 @@ table.rimage {
        font-weight: normal;
        white-space: nowrap;
 }
+
 .pBody {
        font-size: 95%;
        background-color: white;
@@ -250,16 +270,19 @@ table.rimage {
        border: 1px solid #aaa;
        padding: 0 .8em .3em .5em;
 }
+
 /* allows .pBody styles to wrap around content added via BaseTemplateAfterPortlet hook */
 .pBody:after {
        content: '';
        clear: both;
        display: block;
 }
+
 .portlet ul {
        line-height: 1.5em;
        font-size: 95%;
 }
+
 .portlet li {
        padding: 0;
        margin: 0;
@@ -278,9 +301,11 @@ table.rimage {
        width: 12em;
        overflow: visible;
 }
+
 #p-logo h3 {
        display: none;
 }
+
 #p-logo a,
 #p-logo a:hover {
        display: block;
@@ -298,28 +323,34 @@ table.rimage {
        position: relative;
        z-index: 3;
 }
+
 input.searchButton {
        margin-top: 1px;
        font-size: 95%;
 }
+
 #searchGoButton {
        padding-left: .5em;
        padding-right: .5em;
        font-weight: bold;
 }
+
 #searchInput {
        width: 10.9em;
        margin: 0;
        font-size: 95%;
 }
+
 #p-search .pBody {
        padding: .5em .4em .4em .4em;
        text-align: center;
 }
+
 #p-search #searchform div div {
        margin-top: .4em;
        font-size: 95%;
 }
+
 /*
 ** the personal toolbar
 */
@@ -329,6 +360,7 @@ input.searchButton {
        top: 0;
        z-index: 3;
 }
+
 #p-personal {
        width: 100%;
        white-space: nowrap;
@@ -339,9 +371,11 @@ input.searchButton {
        overflow: visible;
        line-height: 1.2em;
 }
+
 #p-personal h3 {
        display: none;
 }
+
 #p-personal .portlet,
 #p-personal .pBody {
        z-index: 0;
@@ -351,6 +385,7 @@ input.searchButton {
        overflow: visible;
        background: none;
 }
+
 /* this is the ul contained in the portlet */
 #p-personal ul {
        border: none;
@@ -365,6 +400,7 @@ input.searchButton {
        background: none;
        cursor: default;
 }
+
 #p-personal li {
        z-index: 0;
        border: none;
@@ -375,20 +411,24 @@ input.searchButton {
        line-height: 1.2em;
        background: none;
 }
+
 #p-personal li a {
        text-decoration: none;
        color: #005896;
        padding-bottom: .2em;
        background: none;
 }
+
 #p-personal li a:hover {
        background-color: white;
        padding-bottom: .2em;
        text-decoration: none;
 }
+
 #p-personal li.active a:hover {
        background-color: transparent;
 }
+
 /* The icon in front of the username / login link */
 li#pt-userpage,
 li#pt-anonuserpage,
@@ -397,17 +437,21 @@ li#pt-login {
        background: url(user.gif) top left no-repeat;
        padding-left: 20px;
 }
+
 #p-personal ul {
        text-transform: lowercase;
 }
+
 /* Don't lowercase username or IP addresses (IPv6) */
 li#pt-userpage,
 li#pt-anonuserpage {
        text-transform: none;
 }
+
 #p-personal li.active {
        font-weight: bold;
 }
+
 /*
 ** the page-related actions- page/talk, edit etc
 */
@@ -425,10 +469,12 @@ li#pt-anonuserpage {
        padding-left: 1em;
        font-size: 95%;
 }
+
 #p-cactions ul {
        list-style-type: none;
        list-style-image: none;
 }
+
 #p-cactions li {
        display: inline;
        border: 1px solid #aaa;
@@ -438,10 +484,12 @@ li#pt-anonuserpage {
        overflow: visible;
        background: white;
 }
+
 #p-cactions li.selected {
        border-color: #fabd23;
        font-weight: bold;
 }
+
 #p-cactions li a {
        background-color: #fbfbfb;
        color: #002bb8;
@@ -452,41 +500,51 @@ li#pt-anonuserpage {
        margin: 0;
        text-decoration: none;
 }
+
 #p-cactions li.selected a {
        z-index: 3;
        background-color: white;
 }
+
 #p-cactions .new a {
        color: #ba0000;
 }
+
 #p-cactions li a:hover {
        z-index: 3;
        text-decoration: none;
        background-color: white;
 }
+
 #p-cactions h3 {
        display: none;
 }
+
 #p-cactions li.istalk {
        margin-right: 0;
 }
+
 #p-cactions li.istalk a {
        padding-right: .5em;
 }
+
 #p-cactions #ca-addsection a {
        padding-left: .4em;
        padding-right: .4em;
 }
+
 /* offsets to distinguish the tab groups */
 li#ca-talk {
        margin-right: 1.6em;
 }
+
 li#ca-watch,
 li#ca-unwatch,
 li#ca-varlang-0,
 li#ca-print {
        margin-left: 1.6em;
 }
+
 #p-cactions .pBody {
        font-size: 1em;
        background-color: transparent;
@@ -495,6 +553,7 @@ li#ca-print {
        border: 0;
        padding: 0;
 }
+
 #p-cactions li a {
        text-transform: lowercase;
 }
@@ -517,6 +576,7 @@ li#ca-print {
 #t-ispermalink, #t-iscite {
        color: #999;
 }
+
 /*
 ** footer
 */
@@ -530,19 +590,23 @@ div#footer {
        text-align: center;
        font-size: 90%;
 }
+
 div#footer li {
        display: inline;
        margin: 0 1.3em;
 }
+
 #f-poweredbyico, #f-copyrightico {
        margin: 0 8px;
        position: relative;
        top: -2px; /* Bump it up just a tad */
 }
+
 #f-poweredbyico {
        float: right;
        height: 1%;
 }
+
 #f-copyrightico {
        float: left;
        height: 1%;
@@ -562,10 +626,12 @@ div#footer li {
        width: 100%;
        clear: both;
 }
+
 #preftoc li {
        background-color: #f0f0f0;
        color: #000;
 }
+
 #preftoc li {
        margin: 1px -2px 1px 2px;
        float: left;
@@ -579,6 +645,7 @@ div#footer li {
        list-style-image: none;
        z-index: 3;
 }
+
 #preftoc li.selected {
        font-weight: bold;
        background-color: #f9f9f9;
@@ -589,9 +656,11 @@ div#footer li {
        padding-top: 2px;
        margin-right: -3px;
 }
+
 #preftoc > li.selected {
        top: 2px;
 }
+
 #preftoc a,
 #preftoc a:active {
        display: block;
@@ -600,10 +669,12 @@ div#footer li {
        position: relative;
        text-decoration: none;
 }
+
 #preftoc li.selected a {
        cursor: default;
        text-decoration: none;
 }
+
 #preferences {
        margin: 0;
        border: 1px solid #aaa;
@@ -611,6 +682,7 @@ div#footer li {
        padding: 1.5em;
        background-color: #F9F9F9;
 }
+
 .prefsection {
        border: none;
        padding: 0;
@@ -620,12 +692,15 @@ div#footer li {
 .prefsection legend {
        font-weight: bold;
 }
+
 .prefsection table, .prefsection legend {
        background-color: #F9F9F9;
 }
+
 .mainLegend {
        display: none;
 }
+
 td.htmlform-tip {
        font-size: x-small;
        padding: .2em 2em;
@@ -694,6 +769,7 @@ span.updatedmarker {
        font-size: small;
        text-align: center;
 }
+
 .editExternallyHelp {
        font-style: italic;
        color: gray;
@@ -793,10 +869,12 @@ div.mw-lag-warn-high {
        text-align: center;
        margin: 3px auto;
 }
+
 div.mw-lag-warn-normal {
        border: 1px solid #FFCC66;
        background-color: #FFFFCC;
 }
+
 div.mw-lag-warn-high {
        font-weight: bold;
        border: 2px solid #FF0033;
@@ -807,6 +885,7 @@ div.mw-lag-warn-high {
        background-color: #ccc;
        padding: 0.1em;
 }
+
 .MediaTransformError td {
        text-align: center;
        vertical-align: middle;
index 76d1873..f70c7a4 100644 (file)
@@ -127,7 +127,9 @@ pre, .mw-code {
        vertical-align: text-bottom;
 }
 
-#bodyContent {
+/* TODO: Remove #bodyContent selector (kept for backwards compatibility with cached html) */
+#bodyContent,
+.mw-body-content {
        position: relative;
        line-height: @content-line-height;
        font-size: @content-font-size;
index 29c3269..a5eb29b 100644 (file)
@@ -34,6 +34,7 @@ $wgAutoloadClasses += array(
        'TestFileIterator' => "$testDir/testHelpers.inc",
        'TestRecorder' => "$testDir/testHelpers.inc",
        'ITestRecorder' => "$testDir/testHelpers.inc",
+       'DjVuSupport' => "$testDir/testHelpers.inc",
 
        # tests/phpunit
        'MediaWikiTestCase' => "$testDir/phpunit/MediaWikiTestCase.php",
@@ -92,6 +93,7 @@ $wgAutoloadClasses += array(
        'MockBitmapHandler' => "$testDir/phpunit/mocks/media/MockBitmapHandler.php",
        'MockImageHandler' => "$testDir/phpunit/mocks/media/MockImageHandler.php",
        'MockSvgHandler' => "$testDir/phpunit/mocks/media/MockSvgHandler.php",
+       'MockDjVuHandler' => "$testDir/phpunit/mocks/media/MockDjVuHandler.php",
 
        # tests/parser
        'NewParserTest' => "$testDir/phpunit/includes/parser/NewParserTest.php",
index 27d6bca..b4e903d 100644 (file)
@@ -64,6 +64,11 @@ class ParserTest {
         */
        private $dbClone;
 
+       /**
+        * @var DjVuSupport
+        */
+       private $djVuSupport;
+
        /**
         * @var string $oldTablePrefix Original table prefix
         */
@@ -136,6 +141,8 @@ class ParserTest {
                $this->runDisabled = isset( $options['run-disabled'] );
                $this->runParsoid = isset( $options['run-parsoid'] );
 
+               $this->djVuSupport = new DjVuSupport();
+
                $this->hooks = array();
                $this->functionHooks = array();
                self::setUp();
@@ -391,7 +398,11 @@ class ParserTest {
 
                foreach ( $filenames as $filename ) {
                        $contents = file_get_contents( $filename );
-                       preg_match_all( '/!!\s*(input|wikitext)\n(.*?)\n!!\s*(result|html|html\/\*|html\/php)/s', $contents, $matches );
+                       preg_match_all(
+                               '/!!\s*(input|wikitext)\n(.*?)\n!!\s*(result|html|html\/\*|html\/php)/s',
+                               $contents,
+                               $matches
+                       );
 
                        foreach ( $matches[1] as $match ) {
                                $dict .= $match . "\n";
@@ -545,6 +556,12 @@ class ParserTest {
                $user = $context->getUser();
                $options = ParserOptions::newFromContext( $context );
 
+               if ( isset( $opts['djvu'] ) ) {
+                       if ( !$this->djVuSupport->isEnabled() ) {
+                               return $this->showSkipped();
+                       }
+               }
+
                if ( isset( $opts['title'] ) ) {
                        $titleText = $opts['title'];
                } else {
@@ -1010,6 +1027,44 @@ class ParserTest {
                        'sha1' => wfBaseConvert( '3', 16, 36, 31 ),
                        'fileExists' => true
                ), $this->db->timestamp( '20010115123500' ), $user );
+
+               # A DjVu file
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'LoremIpsum.djvu' ) );
+               $image->recordUpload2( '', 'Upload a DjVu', 'A DjVu', array(
+                       'size' => 3249,
+                       'width' => 2480,
+                       'height' => 3508,
+                       'media_type' => MEDIATYPE_BITMAP,
+                       'mime' => 'image/vnd.djvu',
+                       'metadata' => '<?xml version="1.0" ?>
+<!DOCTYPE DjVuXML PUBLIC "-//W3C//DTD DjVuXML 1.1//EN" "pubtext/DjVuXML-s.dtd">
+<DjVuXML>
+<HEAD></HEAD>
+<BODY><OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+</BODY>
+</DjVuXML>',
+                       'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+                       'fileExists' => true
+               ), $this->db->timestamp( '20010115123600' ), $user );
        }
 
        public function teardownDatabase() {
@@ -1088,6 +1143,9 @@ class ParserTest {
                        '<?xml version="1.0" encoding="utf-8"?>' .
                        '<svg xmlns="http://www.w3.org/2000/svg"' .
                        ' version="1.1" width="240" height="180"/>' );
+               wfMkdirParents( $dir . '/5/5f', null, __METHOD__ );
+               copy( "$IP/tests/phpunit/data/media/LoremIpsum.djvu", "$dir/5/5f/LoremIpsum.djvu" );
+
                return $dir;
        }
 
@@ -1155,6 +1213,11 @@ class ParserTest {
 
                                "$dir/0/09/Bad.jpg",
 
+                               "$dir/5/5f/LoremIpsum.djvu",
+                               "$dir/thumb/5/5f/LoremIpsum.djvu/page2-2480px-LoremIpsum.djvu.jpg",
+                               "$dir/thumb/5/5f/LoremIpsum.djvu/page2-3720px-LoremIpsum.djvu.jpg",
+                               "$dir/thumb/5/5f/LoremIpsum.djvu/page2-4960px-LoremIpsum.djvu.jpg",
+
                                "$dir/f/ff/Foobar.svg",
                                "$dir/thumb/f/ff/Foobar.svg/180px-Foobar.svg.png",
                                "$dir/thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png",
@@ -1186,6 +1249,11 @@ class ParserTest {
                                "$dir/thumb/f/",
                                "$dir/0/09/",
                                "$dir/0/",
+                               "$dir/5/5f",
+                               "$dir/5",
+                               "$dir/thumb/5/5f/LoremIpsum.djvu",
+                               "$dir/thumb/5/5f",
+                               "$dir/thumb/5",
                                "$dir/thumb",
                                "$dir/math/f/a/5",
                                "$dir/math/f/a",
@@ -1279,6 +1347,19 @@ class ParserTest {
                return false;
        }
 
+       /**
+        * Print a skipped message.
+        *
+        * @return boolean
+        */
+       protected function showSkipped() {
+               if ( $this->showProgress ) {
+                       print $this->term->color( '1;33' ) . 'SKIPPED' . $this->term->reset() . "\n";
+               }
+
+               return true;
+       }
+
        /**
         * Run given strings through a diff and return the (colorized) output.
         * Requires writable /tmp directory and a 'diff' command in the PATH.
index e2bf9f6..569c165 100644 (file)
@@ -3042,6 +3042,38 @@ should be left alone
 </p>
 !! end
 
+!! test
+Definition Lists: Hacky use to indent tables, with comments (bug 63979)
+!! wikitext
+<!-- foo -->
+::{|
+|foo
+|bar
+|}<!-- bar -->
+this text
+should be left alone
+!! html/parsoid
+<!-- foo -->
+<dl><dd><dl><dd><table><tr>
+<td>foo</td>
+<td>bar</td>
+</tr></table><!-- bar --></dd></dl></dd></dl>
+<p>this text
+should be left alone</p>
+!! end
+
+!! test
+Definition Lists: Hacky use to indent tables, with comment before table
+!! wikitext
+::<!-- foo -->{|
+|foo
+|}
+!! html/parsoid
+<dl><dd><dl><dd><!-- foo --><table><tr>
+<td>foo</td>
+</tr></table></dd></dl></dd></dl>
+!! end
+
 # Bug 52473
 !! test
 Definition Lists: Hacky use to indent tables (WS-insensitive)
@@ -3645,17 +3677,22 @@ Non-bracketed: http://example.com
 </p>
 !! end
 
+# parsoid doesn't explicitly mark autonumbered links, see bug 53505
 !! test
 External links: numbered
 !! wikitext
 Numbered: [http://example.com]
 Numbered: [http://example.net]
 Numbered: [http://example.com]
-!! html
+!! html/php
 <p>Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[1]</a>
 Numbered: <a rel="nofollow" class="external autonumber" href="http://example.net">[2]</a>
 Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[3]</a>
 </p>
+!! html/parsoid
+<p>Numbered: <a rel="mw:ExtLink" href="http://example.com"></a>
+Numbered: <a rel="mw:ExtLink" href="http://example.net"></a>
+Numbered: <a rel="mw:ExtLink" href="http://example.com"></a></p>
 !!end
 
 !! test
@@ -3685,28 +3722,50 @@ http://example.com/1$2345
 </p>
 !! end
 
+# parsoid doesn't explicitly mark autonumbered links, see bug 53505
 !! test
-External links: dollar sign in URL (named)
+External links: dollar sign in URL (autonumber)
 !! wikitext
 [http://example.com/1$2345]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://example.com/1$2345">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/1$2345"></a></p>
 !!end
 
 !! test
 External links: open square bracket forbidden in URL (bug 4377)
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 http://example.com/1[2345
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://example.com/1">http://example.com/1</a>[2345
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/1">http://example.com/1</a>[2345</p>
 !! end
 
 !! test
 External links: open square bracket forbidden in URL (named) (bug 4377)
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 [http://example.com/1[2345]
+!! html/php
+<p><a rel="nofollow" class="external text" href="http://example.com/1">[2345</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/1">[2345</a></p>
+!!end
+
+# parsoid adds a space before the link name
+!! test
+External links: open square bracket forbidden in URL (named) (bug 4377)
+Parsoid variant.
+!! wikitext
+[http://example.com/1 [2345]
 !! html
 <p><a rel="nofollow" class="external text" href="http://example.com/1">[2345</a>
 </p>
@@ -3750,13 +3809,16 @@ External links: protocol-relative URL in brackets
 </p>
 !! end
 
+# parsoid doesn't explicitly mark autonumbered links, see bug 53505
 !! test
 External links: protocol-relative URL in brackets without text
 !! wikitext
 [//example.com]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="//example.com">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="//example.com"></a></p>
 !! end
 
 !! test
@@ -3882,54 +3944,95 @@ Old &amp; use: http://x&y
 External links: encoded ampersand
 !! wikitext
 Old &amp; use: http://x&amp;y
-!! html
+!! html/php
 <p>Old &amp; use: <a rel="nofollow" class="external free" href="http://x&amp;y">http://x&amp;y</a>
 </p>
+!! html/parsoid
+<p>Old <span typeof="mw:Entity">&amp;</span> use: <a rel="mw:ExtLink" href="http://x&amp;y">http://x&amp;y</a></p>
 !! end
 
 !! test
 External links: encoded equals (bug 6102)
 !! wikitext
 http://example.com/?foo&#61;bar
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://example.com/?foo=bar">http://example.com/?foo=bar</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/?foo=bar">http://example.com/?foo=bar</a></p>
 !! end
 
+##
+## Note that parsoid doesn't explicit mark autonumbered links, nor
+## does it number them.  As discussed in bug 53505, we can identify
+## autonumbered links via CSS.
+##
+
 !! test
 External links: [raw ampersand]
 !! wikitext
 Old &amp; use: [http://x&y]
-!! html
+!! html/php
 <p>Old &amp; use: <a rel="nofollow" class="external autonumber" href="http://x&amp;y">[1]</a>
 </p>
+!! html/parsoid
+<p>Old <span typeof="mw:Entity">&amp;</span> use: <a rel="mw:ExtLink" href="http://x&amp;y"></a></p>
 !! end
 
+# note that parsoid html is identical to [raw ampersand] case; so html2wt
+# mode will return the [raw ampersand] wikitext
 !! test
 External links: [encoded ampersand]
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 Old &amp; use: [http://x&amp;y]
-!! html
+!! html/php
 <p>Old &amp; use: <a rel="nofollow" class="external autonumber" href="http://x&amp;y">[1]</a>
 </p>
+!! html/parsoid
+<p>Old <span typeof="mw:Entity">&amp;</span> use: <a rel="mw:ExtLink" href="http://x&amp;y"></a></p>
 !! end
 
+!! test
+External links: [raw equals]
+!! wikitext
+[http://example.com/?foo=bar]
+!! html/php
+<p><a rel="nofollow" class="external autonumber" href="http://example.com/?foo=bar">[1]</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/?foo=bar"></a></p>
+!! end
+
+# note that parsoid html is identical to [raw equals] case; so html2wt
+# mode will return the [raw equals] wikitext
 !! test
 External links: [encoded equals] (bug 6102)
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [http://example.com/?foo&#61;bar]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://example.com/?foo=bar">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/?foo=bar"></a></p>
 !! end
 
+# xxx parsoid strips the IDN character, so the round-trip tests will
+#     obviously fail and are disabled. --cscott
 !! test
 External links: [IDN ignored character reference in hostname; strip it right off]
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [http://e&zwnj;xample.com/]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://example.com/">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/"></a></p>
 !! end
 
 # FIXME: This test (the IDN characters in the text of a link) is an inconsistency.
@@ -3949,13 +4052,19 @@ External links: [IDN ignored character reference in hostname; strip it right off
 #
 # All our love,
 # The Parsoid team.
+# xxx parsoid strips the IDN character, so the round-trip tests will
+#     obviously fail and are disabled. --cscott
 !! test
 External links: IDN ignored character reference in hostname; strip it right off
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 http://e&zwnj;xample.com/
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/">http://example.com/</a></p>
 !! end
 
 !! test
@@ -3967,13 +4076,16 @@ http://www.jpeg.org
 </p>
 !! end
 
+# parsoid doesn't explicitly mark autonumbered links, see bug 53505
 !! test
 External links: URL within URL (original bug 2)
 !! wikitext
 [http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.unausa.org/newindex.asp?place=http://www.unausa.org/programs/mun.asp"></a></p>
 !! end
 
 !! test
@@ -4122,9 +4234,11 @@ Bug 2702: Mismatched <i>, <b> and <a> tags are invalid
 Bug 4781: %26 in URL
 !! wikitext
 http://www.example.com/?title=AT%26T
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://www.example.com/?title=AT%26T">http://www.example.com/?title=AT%26T</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=AT%26T">http://www.example.com/?title=AT%26T</a></p>
 !! end
 
 # According to http://dev.w3.org/html5/spec/Overview.html#parsing-urls a plain
@@ -4133,18 +4247,22 @@ http://www.example.com/?title=AT%26T
 Bug 4781, 5267: %25 in URL
 !! wikitext
 http://www.example.com/?title=100%25_Bran
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://www.example.com/?title=100%25_Bran">http://www.example.com/?title=100%25_Bran</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=100%25_Bran">http://www.example.com/?title=100%25_Bran</a></p>
 !! end
 
 !! test
 Bug 4781, 5267: %28, %29 in URL
 !! wikitext
 http://www.example.com/?title=Ben-Hur_%281959_film%29
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">http://www.example.com/?title=Ben-Hur_%281959_film%29</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">http://www.example.com/?title=Ben-Hur_%281959_film%29</a></p>
 !! end
 
 
@@ -4152,27 +4270,33 @@ http://www.example.com/?title=Ben-Hur_%281959_film%29
 Bug 4781: %26 in autonumber URL
 !! wikitext
 [http://www.example.com/?title=AT%26T]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=AT%26T">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=AT%26T"></a></p>
 !! end
 
 !! test
 Bug 4781, 5267: %26 in autonumber URL
 !! wikitext
 [http://www.example.com/?title=100%25_Bran]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=100%25_Bran">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=100%25_Bran"></a></p>
 !! end
 
 !! test
 Bug 4781, 5267: %28, %29 in autonumber URL
 !! wikitext
 [http://www.example.com/?title=Ben-Hur_%281959_film%29]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=Ben-Hur_%281959_film%29"></a></p>
 !! end
 
 
@@ -4180,13 +4304,15 @@ Bug 4781, 5267: %28, %29 in autonumber URL
 Bug 4781: %26 in bracketed URL
 !! wikitext
 [http://www.example.com/?title=AT%26T link]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external text" href="http://www.example.com/?title=AT%26T">link</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=AT%26T">link</a></p>
 !! end
 
 !! test
-Bug 4781, 5267: %26 in bracketed URL
+Bug 4781, 5267: %25 in bracketed URL
 !! wikitext
 [http://www.example.com/?title=100%25_Bran link]
 !! html
@@ -4198,11 +4324,57 @@ Bug 4781, 5267: %26 in bracketed URL
 Bug 4781, 5267: %28, %29 in bracketed URL
 !! wikitext
 [http://www.example.com/?title=Ben-Hur_%281959_film%29 link]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external text" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">link</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://www.example.com/?title=Ben-Hur_%281959_film%29">link</a></p>
 !! end
 
+# Note that parsoid does not munge anchor text; all non-space
+# characters are valid in HTML5 ids.
+!! test
+Anchor containing a #. (bug 63430)
+!! wikitext
+[[Main Page#And#Link]]
+!! html/php
+<p><a href="/wiki/Main_Page#And.23Link" title="Main Page">Main Page#And#Link</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Main_Page#And%23Link">Main Page#And#Link</a></p>
+!! end
+
+!! test
+External link containing a period in the anchor. (bug 63947)
+!! wikitext
+[//foo.org/bar#baz. bang]
+
+[//foo.org/bar. bang]
+!! html/php
+<p><a rel="nofollow" class="external text" href="//foo.org/bar#baz.">bang</a>
+</p><p><a rel="nofollow" class="external text" href="//foo.org/bar.">bang</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="//foo.org/bar#baz.">bang</a></p>
+<p><a rel="mw:ExtLink" href="//foo.org/bar.">bang</a></p>
+!! end
+
+!! test
+External link containing a single quote. (bug 63947)
+!! wikitext
+[//foo.org/bar'baz]
+
+[//foo.org/bar'baz bang]
+!! html/php
+<p><a rel="nofollow" class="external autonumber" href="//foo.org/bar'baz">[1]</a>
+</p><p><a rel="nofollow" class="external text" href="//foo.org/bar'baz">bang</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="//foo.org/bar'baz"></a></p>
+<p><a rel="mw:ExtLink" href="//foo.org/bar'baz">bang</a></p>
+!! end
+
+
 !! test
 External link containing double-single-quotes in text '' (bug 4598 sanity check)
 !! wikitext
@@ -4265,10 +4437,14 @@ Brackets in urls
 http://example.com/index.php?foozoid%5B%5D=bar
 
 http://example.com/index.php?foozoid&#x5B;&#x5D;=bar
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a>
 </p><p><a rel="nofollow" class="external free" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://example.com/index.php?foozoid%5B%5D=bar">http://example.com/index.php?foozoid%5B%5D=bar</a></p>
+
+<p><a rel="mw:ExtLink" href="http://example.com/index.php?foozoid[]=bar">http://example.com/index.php?foozoid[]=bar</a></p>
 !! end
 
 !! test
@@ -4902,12 +5078,16 @@ Invalid attributes in table cell (bug 1830)
 !! end
 
 
+# The "|}" to close the table is missing from the input, so parsoid's
+# *2wt modes will fail.
 !! test
 Table security: embedded pipes (http://lists.wikimedia.org/mailman/htdig/wikitech-l/2006-April/022293.html)
+!! options
+parsoid=wt2html,html2html
 !! wikitext
 {|
 | |[ftp://|x||]" onmouseover="alert(document.cookie)">test
-!! html
+!! html/php
 <table>
 <tr>
 <td>[<a rel="nofollow" class="external free" href="ftp://%7Cx">ftp://%7Cx</a></td>
@@ -4916,6 +5096,10 @@ Table security: embedded pipes (http://lists.wikimedia.org/mailman/htdig/wikitec
 </tr>
 </table>
 
+!! html/parsoid
+<table><tbody>
+<tr>
+<td><a rel="mw:ExtLink" href="ftp://|x||"></a>" onmouseover="alert(document.cookie)">test</td></tr></tbody></table>
 !! end
 
 
@@ -5266,6 +5450,17 @@ Piped link with comment in link text
 </p>
 !! end
 
+!! test
+Piped link with multiple pipe characters in link text
+!! wikitext
+[[Main Page||The|Main|Page|]]
+!! html/php
+<p><a href="/wiki/Main_Page" title="Main Page">|The|Main|Page|</a>
+</p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="Main_Page">|The|Main|Page|</a></p>
+!! end
+
 !! test
 Broken link
 !! wikitext
@@ -5454,22 +5649,37 @@ Link containing }
 </p>
 !! end
 
+!! article
+7% Solution
+!! text
+Just a test of an article title containing a percent.
+!! endarticle
+
 !! test
 Link containing % (not as a hex sequence)
 !! wikitext
 [[7% Solution]]
-!! html
-<p><a href="/index.php?title=7%25_Solution&amp;action=edit&amp;redlink=1" class="new" title="7% Solution (page does not exist)">7% Solution</a>
+!! html/php
+<p><a href="/wiki/7%25_Solution" title="7% Solution">7% Solution</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./7%25_Solution">7% Solution</a></p>
 !! end
 
+# note that the parsoid HTML is identical to the previous test output,
+# so the previous test ensures that the html2wt mode will generate the
+# "not as a hex sequence" wikitext.
 !! test
 Link containing % as a single hex sequence interpreted to char
+!! options
+parsoid=wt2wt,wt2html,html2html
 !! wikitext
 [[7%25 Solution]]
-!! html
-<p><a href="/index.php?title=7%25_Solution&amp;action=edit&amp;redlink=1" class="new" title="7% Solution (page does not exist)">7% Solution</a>
+!! html/php
+<p><a href="/wiki/7%25_Solution" title="7% Solution">7% Solution</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./7%25_Solution">7% Solution</a></p>
 !!end
 
 !! test
@@ -5481,14 +5691,18 @@ Link containing % as a double hex sequence interpreted to hex sequence
 </p>
 !!end
 
+# note that parsoid does not munge anchor text; all non-space
+# characters are valid in HTML5 anchors.
 !! test
 Link containing "#<" and "#>" % as a hex sequences- these are valid section anchors
 Example for such a section: == < ==
 !! wikitext
 [[%23%3c]][[%23%3e]]
-!! html
+!! html/php
 <p><a href="#.3C">#&lt;</a><a href="#.3E">#&gt;</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Main%20Page#%3C">#&lt;</a><a rel="mw:WikiLink" href="./Main%20Page#%3E">#></a></p>
 !! end
 
 !! test
@@ -5504,9 +5718,11 @@ Link containing "<#" and ">#" as a hex sequences
 Link containing an equals sign
 !! wikitext
 [[Special:BookSources/isbn=4-00-026157-6]]
-!! html
+!! html/php
 <p><a href="/wiki/Special:BookSources/isbn%3D4-00-026157-6" title="Special:BookSources/isbn=4-00-026157-6">Special:BookSources/isbn=4-00-026157-6</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Special:BookSources/isbn=4-00-026157-6">Special:BookSources/isbn=4-00-026157-6</a></p>
 !! end
 
 !! article
@@ -5522,33 +5738,39 @@ Just a test of an article title containing a tilde.
 Link containing a tilde
 !! wikitext
 [[Foo~bar]]
-!! html
+!! html/php
 <p><a href="/wiki/Foo%7Ebar" title="Foo~bar">Foo~bar</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Foo~bar">Foo~bar</a></p>
 !! end
 
 !! test
 Link containing double-single-quotes '' (bug 4598)
 !! wikitext
 [[Lista d''e paise d''o munno]]
-!! html
+!! html/php
 <p><a href="/index.php?title=Lista_d%27%27e_paise_d%27%27o_munno&amp;action=edit&amp;redlink=1" class="new" title="Lista d''e paise d''o munno (page does not exist)">Lista d''e paise d''o munno</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Lista_d''e_paise_d''o_munno">Lista d''e paise d''o munno</a></p>
 !! end
 
 !! test
 Link containing double-single-quotes '' in text (bug 4598 sanity check)
 !! wikitext
 Some [[Link|pretty ''italics'' and stuff]]!
-!! html
+!! html/php
 <p>Some <a href="/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">pretty <i>italics</i> and stuff</a>!
 </p>
+!! html/parsoid
+<p>Some <a rel="mw:WikiLink" href="Link">pretty <i>italics</i> and stuff</a>!</p>
 !! end
 
 !! test
 Link containing double-single-quotes '' in text embedded in italics (bug 4598 sanity check)
 !! wikitext
-''Some [[Link|pretty ''italics'' and stuff]]!
+''Some [[Link|pretty ''italics'' and stuff]]!''
 !! html
 <p><i>Some <a href="/index.php?title=Link&amp;action=edit&amp;redlink=1" class="new" title="Link (page does not exist)">pretty <i>italics</i> and stuff</a>!</i>
 </p>
@@ -5564,12 +5786,17 @@ Link with double quotes in title part (literal) and alternate part (interpreted)
 [[''Pentecoste''|Pentecoste]]
 
 [[''Pentecoste''|''Pentecoste'']]
-!! html
+!! html/php
 <p><a href="/index.php?title=Special:Upload&amp;wpDestFile=Denys_Savchenko_%27%27Pentecoste%27%27.jpg" class="new" title="File:Denys Savchenko &#39;&#39;Pentecoste&#39;&#39;.jpg">File:Denys Savchenko <i>Pentecoste</i>.jpg</a>
 </p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)">''Pentecoste''</a>
 </p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)">Pentecoste</a>
 </p><p><a href="/index.php?title=%27%27Pentecoste%27%27&amp;action=edit&amp;redlink=1" class="new" title="''Pentecoste'' (page does not exist)"><i>Pentecoste</i></a>
 </p>
+!! html/parsoid
+<meta typeof="mw:Placeholder"/>
+<p><a rel="mw:WikiLink" href="''Pentecoste''">''Pentecoste''</a></p>
+<p><a rel="mw:WikiLink" href="''Pentecoste''">Pentecoste</a></p>
+<p><a rel="mw:WikiLink" href="''Pentecoste''"><i>Pentecoste</i></a></p>
 !! end
 
 !! test
@@ -5591,9 +5818,11 @@ Broken image links with HTML captions (bug 39700)
 Plain link to URL
 !! wikitext
 [[http://www.example.com]]
-!! html
+!! html/php
 <p>[<a rel="nofollow" class="external autonumber" href="http://www.example.com">[1]</a>]
 </p>
+!! html/parsoid
+<p>[<a rel="mw:ExtLink" href="http://www.example.com"></a>]</p>
 !! end
 
 !! test
@@ -5609,9 +5838,11 @@ Plain link to URL with link text
 Plain link to protocol-relative URL
 !! wikitext
 [[//www.example.com]]
-!! html
+!! html/php
 <p>[<a rel="nofollow" class="external autonumber" href="//www.example.com">[1]</a>]
 </p>
+!! html/parsoid
+<p>[<a rel="mw:ExtLink" href="//www.example.com"></a>]</p>
 !! end
 
 !! test
@@ -5651,29 +5882,36 @@ Plain link to page with question mark in title
 Piped link to URL
 !! wikitext
 Piped link to URL: [[http://www.example.com|an example URL]]
-!! html
+!! html/php
 <p>Piped link to URL: [<a rel="nofollow" class="external text" href="http://www.example.com%7Can">example URL</a>]
 </p>
+!! html/parsoid
+<p>Piped link to URL: [<a rel="mw:ExtLink" href="http://www.example.com|an">example URL</a>]</p>
 !! end
 
 !! test
 BUG 2: [[page|http://url/]] should link to page, not http://url/
 !! wikitext
 [[Main Page|http://url/]]
-!! html
+!! html/php
 <p><a href="/wiki/Main_Page" title="Main Page">http://url/</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Main_Page">http://url/</a></p>
 !! end
 
+# Parsoid does not mark self-links, by design.
 !! test
 BUG 337: Escaped self-links should be bold
 !! options
 title=[[Bug462]]
 !! wikitext
 [[Bu&#103;462]] [[Bug462]]
-!! html
+!! html/php
 <p><strong class="selflink">Bu&#103;462</strong> <strong class="selflink">Bug462</strong>
 </p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Bug462">Bug462</a> <a rel="mw:WikiLink" href="./Bug462">Bug462</a></p>
 !! end
 
 !! test
@@ -5997,8 +6235,6 @@ Different interwiki prefixes mapping to the same URL
 
 !! test
 Interwiki links that cannot be represented in wiki syntax
-!! options
-parsoid
 !! wikitext
 [[meatball:ok]]
 [[meatball:ok#foo|ok with fragment]]
@@ -6006,10 +6242,10 @@ parsoid
 [http://de.wikipedia.org/wiki/Foo?action=history has query]
 [http://de.wikipedia.org/wiki/#foo is just fragment]
 
-!! html
+!! html/parsoid
 <p><a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok">meatball:ok</a>
 <a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok#foo">ok with fragment</a>
-<a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok_as_well%3F">ok ending with ? mark</a>
+<a rel="mw:ExtLink" href="http://www.usemod.com/cgi-bin/mb.pl?ok_as_well?">ok ending with ? mark</a>
 <a rel="mw:ExtLink" href="http://de.wikipedia.org/wiki/Foo?action=history">has query</a>
 <a rel="mw:ExtLink" href="http://de.wikipedia.org/wiki/#foo">is just fragment</a></p>
 !! end
@@ -7519,7 +7755,7 @@ Magic Word: {{NUMBEROFFILES}}
 !! wikitext
 {{NUMBEROFFILES}}
 !! html
-<p>4
+<p>5
 </p>
 !! end
 
@@ -8748,7 +8984,7 @@ parsoid
 !!end
 
 !!test
-Templates: Inline Text: 1. Multiple tmeplate uses
+Templates: Inline Text: 1. Multiple template uses
 !! wikitext
 {{echo|Foo}}bar{{echo|baz}}
 !! html
@@ -9263,6 +9499,33 @@ Templates: Ugly templates: 4. newline-only template parameter inconsistency
 </p>
 !! end
 
+# Bug 64017 -- ugly wikitext with fostered content generates two template ranges that
+# have a true overlap (T1-start - T2-start - T1-end - T2-end).
+!! test
+Templates: Ugly templates: 5. Template encapsulation test: Non-trivial overlap of template ranges is properly handled
+!! wikitext
+{{echo|<table>}}
+{{echo|<div>foo}}
+{{echo|</table>}}
+!! html/parsoid
+<div about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;table>"}},"i":0}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;div>foo"}},"i":1}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;/table>"}},"i":2}}]}' data-parsoid='{"stx":"html","autoInsertedEnd":true,"pi":[[{"k":"1","spc":["","","",""]}],[{"k":"1","spc":["","","",""]}],[{"k":"1","spc":["","","",""]}]]}'>foo
+</div><table about="#mwt1" data-parsoid='{"stx":"html"}'>
+</table>
+!! end
+
+# Bug 64017 -- ugly wikitext with fostered content generates two template ranges
+# that are "identical" and generate nesting cycles in the algorithm
+!! test
+Templates: Ugly templates: 6. Template encapsulation test: Cyclical nesting of template ranges is properly handled
+!! wikitext
+{{echo|<table><tr><td><table>}}
+{{echo|<div>}}
+{{echo|</div>}}
+!! html/parsoid
+<table about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;table>&lt;tr>&lt;td>&lt;table>"}},"i":0}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;div>"}},"i":1}},"\n",{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;/div>"}},"i":2}}]}' data-parsoid='{"stx":"html","autoInsertedEnd":true,"pi":[[{"k":"1","spc":["","","",""]}],[{"k":"1","spc":["","","",""]}],[{"k":"1","spc":["","","",""]}]]}'><tbody><tr data-parsoid='{"stx":"html"}'><td data-parsoid='{"stx":"html"}'><div data-parsoid='{"stx":"html"}'>
+</div><table about="#mwt1" data-parsoid='{"stx":"html"}'>
+</table></td></tr></tbody></table>
+!! end
 
 !!test
 Parser Functions: 1. Simple example
@@ -10473,6 +10736,8 @@ parsoid=wt2html,wt2wt,html2html
 
 !! test
 Image with 'frameless' first.
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|frameless|caption]]
 
@@ -10484,10 +10749,16 @@ Image with 'frameless' first.
 </p><p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>
 </p><p><a href="/wiki/File:Foobar.jpg" class="image" title="caption"><img alt="caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>
 </p>
+!! html/parsoid
+<p><span class="mw-default-size" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a></span></p>
+<p><span class="mw-default-size" typeof="mw:Image/Frameless" data-mw='{"caption":"caption"}'><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a></span></p>
 !! end
 
 !! test
 Image with 'frame' first.
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|frame|caption]]
 [[File:Foobar.jpg|frame|frameless|caption]]
@@ -10497,10 +10768,14 @@ Image with 'frame' first.
 <div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">caption</div></div></div>
 <div class="thumb tright"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">caption</div></div></div>
 
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a><figcaption>caption</figcaption></figure><figure class="mw-default-size" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a><figcaption>caption</figcaption></figure><figure class="mw-default-size" typeof="mw:Image/Frame"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="220" width="1941"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 !! test
 Image with 'thumb' first.
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 [[File:Foobar.jpg|thumb|caption]]
 [[File:Foobar.jpg|thumb|frameless|caption]]
@@ -10510,6 +10785,8 @@ Image with 'thumb' first.
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>caption</div></div></div>
 
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure><figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>caption</figcaption></figure>
 !! end
 
 ###################
@@ -12612,27 +12889,33 @@ Attribute test: no value
 Bug 2095: link with three closing brackets
 !! wikitext
 [[Main Page]]]
-!! html
+!! html/php
 <p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>]
 </p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Main_Page">Main Page</a>]</p>
 !! end
 
 !! test
 Bug 2095: link with pipe and three closing brackets
 !! wikitext
 [[Main Page|link]]]
-!! html
+!! html/php
 <p><a href="/wiki/Main_Page" title="Main Page">link</a>]
 </p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Main_Page">link</a>]</p>
 !! end
 
 !! test
 Bug 2095: link with pipe and three closing brackets, version 2
 !! wikitext
 [[Main Page|[http://example.com/]]]
-!! html
+!! html/php
 <p><a href="/wiki/Main_Page" title="Main Page">[http://example.com/]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Main_Page">[http://example.com/]</a></p>
 !! end
 
 
@@ -13565,6 +13848,7 @@ HTML ordered list item with parameters oddity
 
 !! end
 
+# parsoid doesn't explicitly mark autonumbered links, see bug 53505
 !!test
 bug 5918: autonumbering
 !! wikitext
@@ -13577,13 +13861,19 @@ ftp://inlineftp
 [mailto:enclosed@mail.tld]
 
 mailto:inline@mail.tld
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://first/">[1]</a> <a rel="nofollow" class="external autonumber" href="http://second">[2]</a> <a rel="nofollow" class="external autonumber" href="ftp://ftp">[3]</a>
 </p><p><a rel="nofollow" class="external free" href="ftp://inlineftp">ftp://inlineftp</a>
 </p><p><a rel="nofollow" class="external text" href="mailto:enclosed@mail.tld">With target</a>
 </p><p><a rel="nofollow" class="external autonumber" href="mailto:enclosed@mail.tld">[4]</a>
 </p><p><a rel="nofollow" class="external free" href="mailto:inline@mail.tld">mailto:inline@mail.tld</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://first/"></a> <a rel="mw:ExtLink" href="http://second"></a> <a rel="mw:ExtLink" href="ftp://ftp"></a></p>
+<p><a rel="mw:ExtLink" href="ftp://inlineftp">ftp://inlineftp</a></p>
+<p><a rel="mw:ExtLink" href="mailto:enclosed@mail.tld">With target</a></p>
+<p><a rel="mw:ExtLink" href="mailto:enclosed@mail.tld"></a></p>
+<p><a rel="mw:ExtLink" href="mailto:inline@mail.tld">mailto:inline@mail.tld</a></p>
 !! end
 
 
@@ -14786,17 +15076,39 @@ xxx
 !! test
 Handling of &#x0A; in URLs
 !! wikitext
-**irc://&#x0A;a
-!! html
+** irc://&#x0A;a
+!! html/php
 <ul>
 <li><ul>
-<li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
+<li> <a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
 </li>
 </ul>
 </li>
 </ul>
 
-!!end
+!! html/parsoid
+<ul><li><ul><li> <a rel="mw:ExtLink" href="irc://
+a">irc://
+a</a></li></ul></li></ul>
+!! end
+
+!! test
+Handling of %0A in URLs
+!! wikitext
+** irc://%0Aa
+!! html/php
+<ul>
+<li><ul>
+<li> <a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
+</li>
+</ul>
+</li>
+</ul>
+
+!! html/parsoid
+<ul><li><ul><li> <a rel="mw:ExtLink" href="irc://%0Aa">irc://%0Aa</a></li></ul></li></ul>
+!! end
+
 
 # The PHP parser strips the empty tags out for giggles; parsoid doesn't.
 !! test
@@ -15136,29 +15448,39 @@ foobar.jpg
 
 !! test
 HTML Hex character encoding (spells the word "JavaScript")
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 &#x4A;&#x061;&#x0076;&#x00061;&#x000053;&#x0000063;&#114;&#x0000069;&#00000112;&#x0000000074;
-!! html
+!! html/php
 <p>&#x4a;&#x61;&#x76;&#x61;&#x53;&#x63;&#114;&#x69;&#112;&#x74;
 </p>
+!! html/parsoid
+<p><span typeof="mw:Entity">J</span><span typeof="mw:Entity">a</span><span typeof="mw:Entity">v</span><span typeof="mw:Entity">a</span><span typeof="mw:Entity">S</span><span typeof="mw:Entity">c</span><span typeof="mw:Entity">r</span><span typeof="mw:Entity">i</span><span typeof="mw:Entity">p</span><span typeof="mw:Entity">t</span></p>
 !! end
 
 !! test
 HTML Hex character encoding bogus encoding (bug 26437 regression check)
 !! wikitext
 &#xsee;&#XSEE;
-!! html
+!! html/php
 <p>&amp;#xsee;&amp;#XSEE;
 </p>
+!! html/parsoid
+<p>&amp;#xsee;&amp;#XSEE;</p>
 !! end
 
 !! test
 HTML Hex character encoding mixed case
+!! options
+parsoid=wt2html,wt2wt,html2html
 !! wikitext
 &#xEE;&#Xee;
-!! html
+!! html/php
 <p>&#xee;&#xee;
 </p>
+!! html/parsoid
+<p><span typeof="mw:Entity">î</span><span typeof="mw:Entity">î</span></p>
 !! end
 
 !! test
@@ -15305,6 +15627,17 @@ Width-sized image (using px, with preceding whitespace - test regression from r3
 </p>
 !!end
 
+!! test
+Image with page parameter
+!! options
+djvu
+!! wikitext
+[[File:LoremIpsum.djvu|page=2]]
+!! html
+<p><a href="/index.php?title=File:LoremIpsum.djvu&amp;page=2" class="image"><img alt="LoremIpsum.djvu" src="http://example.com/images/thumb/5/5f/LoremIpsum.djvu/page2-2480px-LoremIpsum.djvu.jpg" width="2480" height="3508" srcset="http://example.com/images/thumb/5/5f/LoremIpsum.djvu/page2-3720px-LoremIpsum.djvu.jpg 1.5x, http://example.com/images/thumb/5/5f/LoremIpsum.djvu/page2-4960px-LoremIpsum.djvu.jpg 2x" /></a>
+</p>
+!! end
+
 !! test
 Another italics / bold test
 !! wikitext
@@ -15351,11 +15684,13 @@ disabled
 !! test
 Images with the "|" character in the comment
 !! wikitext
-[[image:Foobar.jpg|thumb|An [http://test/?param1=|left|&param2=|x external] URL]]
-!! html
+[[File:Foobar.jpg|thumb|An [http://test/?param1=|left|&param2=|x external] URL]]
+!! html/php
 <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>An <a rel="nofollow" class="external text" href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx">external</a> URL</div></div></div>
 
-!!end
+!! html/parsoid
+<figure class="mw-default-size" typeof="mw:Image/Thumb"><a href="File:Foobar.jpg"><img resource="./File:Foobar.jpg" src="//example.com/images/3/3a/Foobar.jpg" height="25" width="220"/></a><figcaption>An <a rel="mw:ExtLink" href="http://test/?param1=|left|&amp;param2=|x">external</a> URL</figcaption></figure>
+!! end
 
 !! test
 [Before] HTML without raw HTML enabled ($wgRawHtml==false)
@@ -16626,9 +16961,11 @@ Bug 15196: localised external link numbers
 language=fa
 !! wikitext
 [http://en.wikipedia.org/]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="http://en.wikipedia.org/">[۱]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="http://en.wikipedia.org/"></a></p>
 !! end
 
 !! test
@@ -17660,9 +17997,11 @@ Special:Foobar
 Bug 34939 - Case insensitive link parsing ([HttP://])
 !! wikitext
 [HttP://MediaWiki.Org/]
-!! html
+!! html/php
 <p><a rel="nofollow" class="external autonumber" href="HttP://MediaWiki.Org/">[1]</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="HttP://MediaWiki.Org/"></a></p>
 !! end
 
 !!test
@@ -17678,9 +18017,11 @@ Bug 34939 - Case insensitive link parsing ([HttP:// title])
 Bug 34939 - Case insensitive link parsing (HttP://)
 !! wikitext
 HttP://MediaWiki.Org/
-!! html
+!! html/php
 <p><a rel="nofollow" class="external free" href="HttP://MediaWiki.Org/">HttP://MediaWiki.Org/</a>
 </p>
+!! html/parsoid
+<p><a rel="mw:ExtLink" href="HttP://MediaWiki.Org/">HttP://MediaWiki.Org/</a></p>
 !! end
 
 !!test
@@ -18141,6 +18482,16 @@ B <span about="#mwt4" class="reference" data-mw='{"name":"ref","attrs":{"group":
 <ol class="references" typeof="mw:Extension/references" about="#mwt8" data-parsoid='{"src":"&lt;references group=\"X\">\n&lt;ref name=\"b\">foo&lt;/ref>\n&lt;/references>","group":"X"}' data-mw='{"name":"references","body":{"extsrc":"&lt;ref name=\"b\">foo&lt;/ref>","html":"\n&lt;span about=\"#mwt10\" class=\"reference\" data-mw=&#39;{\"name\":\"ref\",\"body\":{\"html\":\"foo\"},\"attrs\":{\"name\":\"b\"}}&#39; rel=\"dc:references\" typeof=\"mw:Extension/ref\">&lt;a href=\"#cite_note-b-1\">[1]&lt;/a>&lt;/span>\n"},"attrs":{"group":"X"}}'><li about="#cite_note-b-3" id="cite_note-b-3" data-parsoid="{}"><span rel="mw:referencedBy" data-parsoid="{}"><a href="#cite_ref-b-3-0" data-parsoid="{}">↑</a></span> </li></ol>
 !! end
 
+!! test
+Entities in ref name
+!! options
+parsoid
+!! wikitext
+<ref name="test &amp; me">hi</ref>
+!! html
+<p data-parsoid='{}'><span about="#mwt2" class="reference" data-mw='{"name":"ref","body":{"html":"hi"},"attrs":{"name":"test &amp; me"}}' id="cite_ref-test &amp; me-1-0" rel="dc:references" typeof="mw:Extension/ref" data-parsoid='{"src":"&lt;ref name=\"test &amp;amp; me\">hi&lt;/ref>"}'><a href="#cite_note-test &amp; me-1" data-parsoid="{}">[1]</a></span></p>
+!! end
+
 # This test is wt2html only because we're permitting the serializer to produce
 # dirty diffs, normalizing the unclosed references to the self-closed version.
 !! test
 <p>b</p></div>
 !! end
 
+!! test
+Substrings resembling wikitext in hrefs should not get nowiki escapes
+!! options
+parsoid=html2wt
+!! wikitext
+[[Foo''bar''baz]]
+!! html
+<a rel="mw:WikiLink" href="./Foo''bar''baz">Foo''bar''baz</a>
+!! end
+
 #-----------------------------
 # I/B quote minimization tests
 #-----------------------------
@@ -20408,9 +20769,9 @@ Bug 54262: New entities
 !! options
 parsoid=html2wt
 !! wikitext
-foo
+&nbsp;
 !! html
-<span typeof="mw:Entity">foo</span>
+<span typeof="mw:Entity">&nbsp;</span>
 !! end
 
 ## Note that there is no wikitext output for 'unknownproperty' ##
index 1131385..53e6722 100644 (file)
@@ -4,7 +4,6 @@
  * Base class that store and restore the Language objects
  */
 abstract class MediaWikiLangTestCase extends MediaWikiTestCase {
-
        protected function setUp() {
                global $wgLanguageCode, $wgContLang;
                parent::setUp();
index c8ec411..9eeb251 100644 (file)
@@ -1,6 +1,6 @@
 <?php
-class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
 
+class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
        /**
         * @var string
         */
@@ -35,7 +35,10 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
         * @param float $time
         */
        public function addError( PHPUnit_Framework_Test $test, Exception $e, $time ) {
-               wfDebugLog( $this->logChannel, 'ERROR in ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+               wfDebugLog(
+                       $this->logChannel,
+                       'ERROR in ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e )
+               );
        }
 
        /**
@@ -45,8 +48,13 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
         * @param PHPUnit_Framework_AssertionFailedError $e
         * @param float $time
         */
-       public function addFailure( PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time ) {
-               wfDebugLog( $this->logChannel, 'FAILURE in ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+       public function addFailure( PHPUnit_Framework_Test $test,
+               PHPUnit_Framework_AssertionFailedError $e, $time
+       ) {
+               wfDebugLog(
+                       $this->logChannel,
+                       'FAILURE in ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e )
+               );
        }
 
        /**
@@ -57,7 +65,10 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
         * @param float $time
         */
        public function addIncompleteTest( PHPUnit_Framework_Test $test, Exception $e, $time ) {
-               wfDebugLog( $this->logChannel, 'Incomplete test ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+               wfDebugLog(
+                       $this->logChannel,
+                       'Incomplete test ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e )
+               );
        }
 
        /**
@@ -70,7 +81,10 @@ class MediaWikiPHPUnitTestListener implements PHPUnit_Framework_TestListener {
         * @since Method available since Release 3.0.0
         */
        public function addSkippedTest( PHPUnit_Framework_Test $test, Exception $e, $time ) {
-               wfDebugLog( $this->logChannel, 'Skipped test ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e ) );
+               wfDebugLog(
+                       $this->logChannel,
+                       'Skipped test ' . $this->getTestName( $test ) . ': ' . $this->getErrorName( $e )
+               );
        }
 
        /**
index 1c9b7fb..53b944d 100644 (file)
@@ -4,7 +4,6 @@
  * @since 1.18
  */
 abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
-
        /**
         * $called tracks whether the setUp and tearDown method has been called.
         * class extending MediaWikiTestCase usually override setUp and tearDown
@@ -254,7 +253,8 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                        $oldHex = strtoupper( dechex( $this->phpErrorLevel ) );
                        $newHex = strtoupper( dechex( $phpErrorLevel ) );
-                       $message = "PHP error_reporting setting was left dirty: was 0x$oldHex before test, 0x$newHex after test!";
+                       $message = "PHP error_reporting setting was left dirty: "
+                               . "was 0x$oldHex before test, 0x$newHex after test!";
 
                        $this->fail( $message );
                }
@@ -772,7 +772,9 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @param bool $ordered If the order of the values should match
         * @param bool $named If the keys should match
         */
-       protected function assertArrayEquals( array $expected, array $actual, $ordered = false, $named = false ) {
+       protected function assertArrayEquals( array $expected, array $actual,
+               $ordered = false, $named = false
+       ) {
                if ( !$ordered ) {
                        $this->objectAssociativeSort( $expected );
                        $this->objectAssociativeSort( $actual );
@@ -1105,5 +1107,4 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
 
                $this->assertEmpty( $errors, implode( "\n", $errors ) );
        }
-
 }
index a03e9cc..f8c4c6c 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
-
        protected static function getResourceLoaderContext() {
                $resourceLoader = new ResourceLoader();
                $request = new FauxRequest( array(
@@ -40,7 +39,6 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
 /* Stubs */
 
 class ResourceLoaderTestModule extends ResourceLoaderModule {
-
        protected $dependencies = array();
        protected $group = null;
        protected $source = 'local';
@@ -65,4 +63,5 @@ class ResourceLoaderTestModule extends ResourceLoaderModule {
        }
 }
 
-class ResourceLoaderFileModuleTestModule extends ResourceLoaderFileModule {}
+class ResourceLoaderFileModuleTestModule extends ResourceLoaderFileModule {
+}
index 84f900f..b07c013 100644 (file)
@@ -66,7 +66,9 @@ class ArticleTest extends MediaWikiTestCase {
        }
 
        /**
-        * Checks for the existence of the backwards compatibility static functions (forwarders to WikiPage class)
+        * Checks for the existence of the backwards compatibility static functions
+        * (forwarders to WikiPage class)
+        *
         * @covers Article::selectFields
         * @covers Article::onArticleCreate
         * @covers Article::onArticleDelete
index 480d7d2..b248d24 100644 (file)
@@ -72,14 +72,20 @@ class BlockTest extends MediaWikiLangTestCase {
         * @covers Block::newFromTarget
         */
        public function testINewFromTargetReturnsCorrectBlock() {
-               $this->assertTrue( $this->block->equals( Block::newFromTarget( 'UTBlockee' ) ), "newFromTarget() returns the same block as the one that was made" );
+               $this->assertTrue(
+                       $this->block->equals( Block::newFromTarget( 'UTBlockee' ) ),
+                       "newFromTarget() returns the same block as the one that was made"
+               );
        }
 
        /**
         * @covers Block::newFromID
         */
        public function testINewFromIDReturnsCorrectBlock() {
-               $this->assertTrue( $this->block->equals( Block::newFromID( $this->blockId ) ), "newFromID() returns the same block as the one that was made" );
+               $this->assertTrue(
+                       $this->block->equals( Block::newFromID( $this->blockId ) ),
+                       "newFromID() returns the same block as the one that was made"
+               );
        }
 
        /**
@@ -88,7 +94,11 @@ class BlockTest extends MediaWikiLangTestCase {
        public function testBug26425BlockTimestampDefaultsToTime() {
                // delta to stop one-off errors when things happen to go over a second mark.
                $delta = abs( $this->madeAt - $this->block->mTimestamp );
-               $this->assertLessThan( 2, $delta, "If no timestamp is specified, the block is recorded as time()" );
+               $this->assertLessThan(
+                       2,
+                       $delta,
+                       "If no timestamp is specified, the block is recorded as time()"
+               );
        }
 
        /**
@@ -101,7 +111,11 @@ class BlockTest extends MediaWikiLangTestCase {
         */
        public function testBug29116NewFromTargetWithEmptyIp( $vagueTarget ) {
                $block = Block::newFromTarget( 'UTBlockee', $vagueTarget );
-               $this->assertTrue( $this->block->equals( $block ), "newFromTarget() returns the same block as the one that was made when given empty vagueTarget param " . var_export( $vagueTarget, true ) );
+               $this->assertTrue(
+                       $this->block->equals( $block ),
+                       "newFromTarget() returns the same block as the one that was made when "
+                               . "given empty vagueTarget param " . var_export( $vagueTarget, true )
+               );
        }
 
        public static function provideBug29116Data() {
@@ -215,7 +229,11 @@ class BlockTest extends MediaWikiLangTestCase {
                $user = null; // clear
 
                $block = Block::newFromID( $res['id'] );
-               $this->assertEquals( 'UserOnForeignWiki', $block->getTarget()->getName(), 'Correct blockee name' );
+               $this->assertEquals(
+                       'UserOnForeignWiki',
+                       $block->getTarget()->getName(),
+                       'Correct blockee name'
+               );
                $this->assertEquals( '14146', $block->getTarget()->getId(), 'Correct blockee id' );
                $this->assertEquals( 'MetaWikiUser', $block->getBlocker(), 'Correct blocker name' );
                $this->assertEquals( 'MetaWikiUser', $block->getByName(), 'Correct blocker name' );
index 4da8448..3c653b4 100644 (file)
@@ -75,7 +75,8 @@ class EditPageTest extends MediaWikiLangTestCase {
         *              * wpTextbox1: the text to submit
         *              * wpSummary: the edit summary
         *              * wpEditToken: the edit token (will be inserted if not provided)
-        *              * wpEdittime: timestamp of the edit's base revision (will be inserted if not provided)
+        *              * wpEdittime: timestamp of the edit's base revision (will be inserted
+        *                if not provided)
         *              * wpStarttime: timestamp when the edit started (will be inserted if not provided)
         *              * wpSectionTitle: the section to edit
         *              * wpMinorEdit: mark as minor edit
@@ -474,8 +475,14 @@ hello
                }
 
                $starttime = wfTimestampNow();
-               $adamsTime = wfTimestamp( TS_MW, (int)wfTimestamp( TS_UNIX, $starttime ) + (int)$adamsEdit['wpStarttime'] );
-               $bertasTime = wfTimestamp( TS_MW, (int)wfTimestamp( TS_UNIX, $starttime ) + (int)$bertasEdit['wpStarttime'] );
+               $adamsTime = wfTimestamp(
+                       TS_MW,
+                       (int)wfTimestamp( TS_UNIX, $starttime ) + (int)$adamsEdit['wpStarttime']
+               );
+               $bertasTime = wfTimestamp(
+                       TS_MW,
+                       (int)wfTimestamp( TS_UNIX, $starttime ) + (int)$bertasEdit['wpStarttime']
+               );
 
                $adamsEdit['wpStarttime'] = $adamsTime;
                $bertasEdit['wpStarttime'] = $bertasTime;
index cd3364e..07c2957 100644 (file)
@@ -75,7 +75,10 @@ class ExternalStoreFOO {
                        return null;
                }
 
-               if ( $itemID !== false && is_array( $this->data[$cluster][$id] ) && isset( $this->data[$cluster][$id][$itemID] ) ) {
+               if ( $itemID !== false
+                       && is_array( $this->data[$cluster][$id] )
+                       && isset( $this->data[$cluster][$id][$itemID] )
+               ) {
                        return $this->data[$cluster][$id][$itemID];
                }
 
index 3cf7abd..4a4130e 100644 (file)
@@ -130,8 +130,16 @@ class ExtraParserTest extends MediaWikiTestCase {
         * @covers Parser::getSection
         */
        public function testGetSection() {
-               $outputText2 = $this->parser->getSection( "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2\n== Heading 3 ==\nSection 3\n", 2 );
-               $outputText1 = $this->parser->getSection( "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2\n== Heading 3 ==\nSection 3\n", 1 );
+               $outputText2 = $this->parser->getSection(
+                       "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\n"
+                               . "Section 2\n== Heading 3 ==\nSection 3\n",
+                       2
+               );
+               $outputText1 = $this->parser->getSection(
+                       "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\n"
+                               . "Section 2\n== Heading 3 ==\nSection 3\n",
+                       1
+               );
 
                $this->assertEquals( "=== Heading 2 ===\nSection 2", $outputText2 );
                $this->assertEquals( "== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2", $outputText1 );
@@ -141,7 +149,12 @@ class ExtraParserTest extends MediaWikiTestCase {
         * @covers Parser::replaceSection
         */
        public function testReplaceSection() {
-               $outputText = $this->parser->replaceSection( "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\nSection 2\n== Heading 3 ==\nSection 3\n", 1, "New section 1" );
+               $outputText = $this->parser->replaceSection(
+                       "Section 0\n== Heading 1 ==\nSection 1\n=== Heading 2 ===\n"
+                               . "Section 2\n== Heading 3 ==\nSection 3\n",
+                       1,
+                       "New section 1"
+               );
 
                $this->assertEquals( "Section 0\nNew section 1\n\n== Heading 3 ==\nSection 3", $outputText );
        }
@@ -152,7 +165,11 @@ class ExtraParserTest extends MediaWikiTestCase {
         */
        public function testGetPreloadText() {
                $title = Title::newFromText( __FUNCTION__ );
-               $outputText = $this->parser->getPreloadText( "{{Foo}}<noinclude> censored</noinclude> information <!-- is very secret -->", $title, $this->options );
+               $outputText = $this->parser->getPreloadText(
+                       "{{Foo}}<noinclude> censored</noinclude> information <!-- is very secret -->",
+                       $title,
+                       $this->options
+               );
 
                $this->assertEquals( "{{Foo}} information <!-- is very secret -->", $outputText );
        }
index 910b766..c60170f 100644 (file)
@@ -4,11 +4,11 @@
  * @covers Fallback
  */
 class FallbackTest extends MediaWikiTestCase {
-
        public function testFallbackMbstringFunctions() {
-
                if ( !extension_loaded( 'mbstring' ) ) {
-                       $this->markTestSkipped( "The mb_string functions must be installed to test the fallback functions" );
+                       $this->markTestSkipped(
+                               "The mb_string functions must be installed to test the fallback functions"
+                       );
                }
 
                $sampleUTF = "Östergötland_coat_of_arms.png";
index 3246410..745a5b4 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 class FauxRequestTest extends MediaWikiTestCase {
-
        /**
         * @covers FauxRequest::setHeader
         * @covers FauxRequest::getHeader
index 7f41cfd..4a974ba 100644 (file)
@@ -49,16 +49,32 @@ class FauxResponseTest extends MediaWikiTestCase {
                $this->assertEquals( null, $this->response->getheader( 'Location' ), 'Non-existing header' );
 
                $this->response->header( 'Location: http://localhost/' );
-               $this->assertEquals( 'http://localhost/', $this->response->getheader( 'Location' ), 'Set header' );
+               $this->assertEquals(
+                       'http://localhost/',
+                       $this->response->getheader( 'Location' ),
+                       'Set header'
+               );
 
                $this->response->header( 'Location: http://127.0.0.1/' );
-               $this->assertEquals( 'http://127.0.0.1/', $this->response->getheader( 'Location' ), 'Same header' );
+               $this->assertEquals(
+                       'http://127.0.0.1/',
+                       $this->response->getheader( 'Location' ),
+                       'Same header'
+               );
 
                $this->response->header( 'Location: http://127.0.0.2/', false );
-               $this->assertEquals( 'http://127.0.0.1/', $this->response->getheader( 'Location' ), 'Same header with override disabled' );
+               $this->assertEquals(
+                       'http://127.0.0.1/',
+                       $this->response->getheader( 'Location' ),
+                       'Same header with override disabled'
+               );
 
                $this->response->header( 'Location: http://localhost/' );
-               $this->assertEquals( 'http://localhost/', $this->response->getheader( 'LOCATION' ), 'Get header case insensitive' );
+               $this->assertEquals(
+                       'http://localhost/',
+                       $this->response->getheader( 'LOCATION' ),
+                       'Get header case insensitive'
+               );
        }
 
        /**
@@ -69,18 +85,34 @@ class FauxResponseTest extends MediaWikiTestCase {
                $this->assertEquals( 200, $this->response->getStatusCode(), 'Header with no message' );
 
                $this->response->header( 'HTTP/1.x 201' );
-               $this->assertEquals( 201, $this->response->getStatusCode(), 'Header with no message and protocol 1.x' );
+               $this->assertEquals(
+                       201,
+                       $this->response->getStatusCode(),
+                       'Header with no message and protocol 1.x'
+               );
 
                $this->response->header( 'HTTP/1.1 202 OK' );
                $this->assertEquals( 202, $this->response->getStatusCode(), 'Normal header' );
 
                $this->response->header( 'HTTP/1.x 203 OK' );
-               $this->assertEquals( 203, $this->response->getStatusCode(), 'Normal header with no message and protocol 1.x' );
+               $this->assertEquals(
+                       203,
+                       $this->response->getStatusCode(),
+                       'Normal header with no message and protocol 1.x'
+               );
 
                $this->response->header( 'HTTP/1.x 204 OK', false, 205 );
-               $this->assertEquals( 205, $this->response->getStatusCode(), 'Third parameter overrides the HTTP/... header' );
+               $this->assertEquals(
+                       205,
+                       $this->response->getStatusCode(),
+                       'Third parameter overrides the HTTP/... header'
+               );
 
                $this->response->header( 'Location: http://localhost/', false, 206 );
-               $this->assertEquals( 206, $this->response->getStatusCode(), 'Third parameter with another header' );
+               $this->assertEquals(
+                       206,
+                       $this->response->getStatusCode(),
+                       'Third parameter with another header'
+               );
        }
 }
index 4e30bdd..06b512d 100644 (file)
@@ -80,7 +80,11 @@ class GlobalTest extends MediaWikiTestCase {
        public function testExpandIRI() {
                $this->assertEquals(
                        "https://te.wikibooks.org/wiki/ఉబుంటు_వాడుకరి_మార్గదర్శని",
-                       wfExpandIRI( "https://te.wikibooks.org/wiki/%E0%B0%89%E0%B0%AC%E0%B1%81%E0%B0%82%E0%B0%9F%E0%B1%81_%E0%B0%B5%E0%B0%BE%E0%B0%A1%E0%B1%81%E0%B0%95%E0%B0%B0%E0%B0%BF_%E0%B0%AE%E0%B0%BE%E0%B0%B0%E0%B1%8D%E0%B0%97%E0%B0%A6%E0%B0%B0%E0%B1%8D%E0%B0%B6%E0%B0%A8%E0%B0%BF" ) );
+                       wfExpandIRI( "https://te.wikibooks.org/wiki/"
+                               . "%E0%B0%89%E0%B0%AC%E0%B1%81%E0%B0%82%E0%B0%9F%E0%B1%81_"
+                               . "%E0%B0%B5%E0%B0%BE%E0%B0%A1%E0%B1%81%E0%B0%95%E0%B0%B0%E0%B0%BF_"
+                               . "%E0%B0%AE%E0%B0%BE%E0%B0%B0%E0%B1%8D%E0%B0%97%E0%B0%A6%E0%B0%B0"
+                               . "%E0%B1%8D%E0%B0%B6%E0%B0%A8%E0%B0%BF" ) );
        }
 
        /**
@@ -125,11 +129,20 @@ class GlobalTest extends MediaWikiTestCase {
                        array( array( 'foo' => false ), '' ), // false test
                        array( array( 'foo' => null ), '' ), // null test
                        array( array( 'foo' => 'A&B=5+6@!"\'' ), 'foo=A%26B%3D5%2B6%40%21%22%27' ), // urlencoding test
-                       array( array( 'foo' => 'bar', 'baz' => 'is', 'asdf' => 'qwerty' ), 'foo=bar&baz=is&asdf=qwerty' ), // multi-item test
+                       array(
+                               array( 'foo' => 'bar', 'baz' => 'is', 'asdf' => 'qwerty' ),
+                               'foo=bar&baz=is&asdf=qwerty'
+                       ), // multi-item test
                        array( array( 'foo' => array( 'bar' => 'baz' ) ), 'foo%5Bbar%5D=baz' ),
-                       array( array( 'foo' => array( 'bar' => 'baz', 'qwerty' => 'asdf' ) ), 'foo%5Bbar%5D=baz&foo%5Bqwerty%5D=asdf' ),
+                       array(
+                               array( 'foo' => array( 'bar' => 'baz', 'qwerty' => 'asdf' ) ),
+                               'foo%5Bbar%5D=baz&foo%5Bqwerty%5D=asdf'
+                       ),
                        array( array( 'foo' => array( 'bar', 'baz' ) ), 'foo%5B0%5D=bar&foo%5B1%5D=baz' ),
-                       array( array( 'foo' => array( 'bar' => array( 'bar' => 'baz' ) ) ), 'foo%5Bbar%5D%5Bbar%5D=baz' ),
+                       array(
+                               array( 'foo' => array( 'bar' => array( 'bar' => 'baz' ) ) ),
+                               'foo%5Bbar%5D%5Bbar%5D=baz'
+                       ),
                );
        }
 
@@ -161,9 +174,15 @@ class GlobalTest extends MediaWikiTestCase {
                        array( 'foo=bar&qwerty=asdf', array( 'foo' => 'bar', 'qwerty' => 'asdf' ) ), // multiple value
                        array( 'foo=A%26B%3D5%2B6%40%21%22%27', array( 'foo' => 'A&B=5+6@!"\'' ) ), // urldecoding test
                        array( 'foo%5Bbar%5D=baz', array( 'foo' => array( 'bar' => 'baz' ) ) ),
-                       array( 'foo%5Bbar%5D=baz&foo%5Bqwerty%5D=asdf', array( 'foo' => array( 'bar' => 'baz', 'qwerty' => 'asdf' ) ) ),
+                       array(
+                               'foo%5Bbar%5D=baz&foo%5Bqwerty%5D=asdf',
+                               array( 'foo' => array( 'bar' => 'baz', 'qwerty' => 'asdf' ) )
+                       ),
                        array( 'foo%5B0%5D=bar&foo%5B1%5D=baz', array( 'foo' => array( 0 => 'bar', 1 => 'baz' ) ) ),
-                       array( 'foo%5Bbar%5D%5Bbar%5D=baz', array( 'foo' => array( 'bar' => array( 'bar' => 'baz' ) ) ) ),
+                       array(
+                               'foo%5Bbar%5D%5Bbar%5D=baz',
+                               array( 'foo' => array( 'bar' => array( 'bar' => 'baz' ) ) )
+                       ),
                );
        }
 
@@ -288,15 +307,24 @@ class GlobalTest extends MediaWikiTestCase {
                unlink( $wgDebugLogFile );
 
                wfDebug( "\00305This has böth UTF and control chars\003" );
-               $this->assertEquals( " 05This has böth UTF and control chars ", file_get_contents( $wgDebugLogFile ) );
+               $this->assertEquals(
+                       " 05This has böth UTF and control chars ",
+                       file_get_contents( $wgDebugLogFile )
+               );
                unlink( $wgDebugLogFile );
 
                wfDebugMem();
-               $this->assertGreaterThan( 1000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
+               $this->assertGreaterThan(
+                       1000,
+                       preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) )
+               );
                unlink( $wgDebugLogFile );
 
                wfDebugMem( true );
-               $this->assertGreaterThan( 1000000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
+               $this->assertGreaterThan(
+                       1000000,
+                       preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) )
+               );
                unlink( $wgDebugLogFile );
 
                $wgDebugLogFile = $old_log_file;
@@ -591,13 +619,48 @@ class GlobalTest extends MediaWikiTestCase {
                $protocols = array( 'HTTP' => 'http:', 'HTTPS' => 'https:', 'protocol-relative' => '' );
                foreach ( $protocols as $pDesc => $p ) {
                        $a = array_merge( $a, array(
-                               array( "$p//www.example.com", array(), false, "No matches for empty domains array, $pDesc URL" ),
-                               array( "$p//www.example.com", array( 'www.example.com' ), true, "Exact match in domains array, $pDesc URL" ),
-                               array( "$p//www.example.com", array( 'example.com' ), true, "Match without subdomain in domains array, $pDesc URL" ),
-                               array( "$p//www.example2.com", array( 'www.example.com', 'www.example2.com', 'www.example3.com' ), true, "Exact match with other domains in array, $pDesc URL" ),
-                               array( "$p//www.example2.com", array( 'example.com', 'example2.com', 'example3,com' ), true, "Match without subdomain with other domains in array, $pDesc URL" ),
-                               array( "$p//www.example4.com", array( 'example.com', 'example2.com', 'example3,com' ), false, "Domain not in array, $pDesc URL" ),
-                               array( "$p//nds-nl.wikipedia.org", array( 'nl.wikipedia.org' ), false, "Non-matching substring of domain, $pDesc URL" ),
+                               array(
+                                       "$p//www.example.com",
+                                       array(),
+                                       false,
+                                       "No matches for empty domains array, $pDesc URL"
+                               ),
+                               array(
+                                       "$p//www.example.com",
+                                       array( 'www.example.com' ),
+                                       true,
+                                       "Exact match in domains array, $pDesc URL"
+                               ),
+                               array(
+                                       "$p//www.example.com",
+                                       array( 'example.com' ),
+                                       true,
+                                       "Match without subdomain in domains array, $pDesc URL"
+                               ),
+                               array(
+                                       "$p//www.example2.com",
+                                       array( 'www.example.com', 'www.example2.com', 'www.example3.com' ),
+                                       true,
+                                       "Exact match with other domains in array, $pDesc URL"
+                               ),
+                               array(
+                                       "$p//www.example2.com",
+                                       array( 'example.com', 'example2.com', 'example3,com' ),
+                                       true,
+                                       "Match without subdomain with other domains in array, $pDesc URL"
+                               ),
+                               array(
+                                       "$p//www.example4.com",
+                                       array( 'example.com', 'example2.com', 'example3,com' ),
+                                       false,
+                                       "Domain not in array, $pDesc URL"
+                               ),
+                               array(
+                                       "$p//nds-nl.wikipedia.org",
+                                       array( 'nl.wikipedia.org' ),
+                                       false,
+                                       "Non-matching substring of domain, $pDesc URL"
+                               ),
                        ) );
                }
 
@@ -620,7 +683,9 @@ class GlobalTest extends MediaWikiTestCase {
         * @dataProvider provideWfShellMaintenanceCmdList
         * @covers ::wfShellMaintenanceCmd
         */
-       public function testWfShellMaintenanceCmd( $script, $parameters, $options, $expected, $description ) {
+       public function testWfShellMaintenanceCmd( $script, $parameters, $options,
+               $expected, $description
+       ) {
                if ( wfIsWindows() ) {
                        // Approximation that's good enough for our purposes just now
                        $expected = str_replace( "'", '"', $expected );
@@ -642,9 +707,13 @@ class GlobalTest extends MediaWikiTestCase {
                        array( 'eval.php', array( '--help', '--test', 'X' ), array( 'wrapper' => 'MWScript.php' ),
                                "'$wgPhpCli' 'MWScript.php' 'eval.php' '--help' '--test' 'X'",
                                "Called eval.php --help --test with wrapper option" ),
-                       array( 'eval.php', array( '--help', '--test', 'y' ), array( 'php' => 'php5', 'wrapper' => 'MWScript.php' ),
+                       array(
+                               'eval.php',
+                               array( '--help', '--test', 'y' ),
+                               array( 'php' => 'php5', 'wrapper' => 'MWScript.php' ),
                                "'php5' 'MWScript.php' 'eval.php' '--help' '--test' 'y'",
-                               "Called eval.php --help --test with wrapper and php option" ),
+                               "Called eval.php --help --test with wrapper and php option"
+                       ),
                );
        }
        /* @TODO many more! */
index 7da804e..79dd91d 100644 (file)
@@ -176,7 +176,13 @@ class WfBaseConvertTest extends MediaWikiTestCase {
 
        public function testPadding() {
                $number = "10101010101";
-               $this->assertSame( strlen( $number ) + 5, strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) + 5 ) ) );
-               $this->assertSame( strlen( $number ), strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) - 5 ) ) );
+               $this->assertSame(
+                       strlen( $number ) + 5,
+                       strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) + 5 ) )
+               );
+               $this->assertSame(
+                       strlen( $number ),
+                       strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) - 5 ) )
+               );
        }
 }
index 8c54804..516c1b9 100644 (file)
@@ -27,8 +27,11 @@ class WfBaseNameTest extends MediaWikiTestCase {
                        array( '/aaaa/', 'aaaa' ),
                        array( '\\aaaa\\', 'aaaa' ),
                        array( '\\aaaa\\', 'aaaa' ),
-                       array( '/mnt/upload3/wikipedia/en/thumb/8/8b/Zork_Grand_Inquisitor_box_cover.jpg/93px-Zork_Grand_Inquisitor_box_cover.jpg',
-                               '93px-Zork_Grand_Inquisitor_box_cover.jpg' ),
+                       array(
+                               '/mnt/upload3/wikipedia/en/thumb/8/8b/'
+                                       . 'Zork_Grand_Inquisitor_box_cover.jpg/93px-Zork_Grand_Inquisitor_box_cover.jpg',
+                               '93px-Zork_Grand_Inquisitor_box_cover.jpg'
+                       ),
                        array( 'C:\\Progra~1\\Wikime~1\\Wikipe~1\\VIEWER.EXE', 'VIEWER.EXE' ),
                        array( 'Östergötland_coat_of_arms.png', 'Östergötland_coat_of_arms.png' ),
                );
index b06f3d2..9effc30 100644 (file)
@@ -6,7 +6,9 @@ class WfExpandUrlTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideExpandableUrls
         */
-       public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto, $server, $canServer, $httpsMode, $message ) {
+       public function testWfExpandUrl( $fullUrl, $shortUrl, $defaultProto,
+               $server, $canServer, $httpsMode, $message
+       ) {
                // Fake $wgServer, $wgCanonicalServer and $wgRequest->getProtocol()
                $this->setMwGlobals( array(
                        'wgServer' => $server,
@@ -47,21 +49,24 @@ class WfExpandUrlTest extends MediaWikiTestCase {
                                                $retval[] = array(
                                                        'http://example.com', 'http://example.com',
                                                        $defaultProto, $server, $canServer, $httpsMode,
-                                                       "Testing fully qualified http URLs (no need to expand) ' .
-                                                       '(defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )"
+                                                       "Testing fully qualified http URLs (no need to expand) "
+                                                               . "(defaultProto: $protoDesc , wgServer: $server, "
+                                                               . "wgCanonicalServer: $canServer, current request protocol: $mode )"
                                                );
                                                $retval[] = array(
                                                        'https://example.com', 'https://example.com',
                                                        $defaultProto, $server, $canServer, $httpsMode,
-                                                       "Testing fully qualified https URLs (no need to expand) ' .
-                                                       '(defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )"
+                                                       "Testing fully qualified https URLs (no need to expand) "
+                                                               . "(defaultProto: $protoDesc , wgServer: $server, "
+                                                               . "wgCanonicalServer: $canServer, current request protocol: $mode )"
                                                );
                                                # Would be nice to support this, see fixme on wfExpandUrl()
                                                $retval[] = array(
                                                        "wiki/FooBar", 'wiki/FooBar',
                                                        $defaultProto, $server, $canServer, $httpsMode,
-                                                       "Test non-expandable relative URLs ' .
-                                                       '(defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )"
+                                                       "Test non-expandable relative URLs (defaultProto: $protoDesc, "
+                                                               . "wgServer: $server, wgCanonicalServer: $canServer, "
+                                                               . "current request protocol: $mode )"
                                                );
 
                                                // Determine expected protocol
@@ -86,14 +91,20 @@ class WfExpandUrlTest extends MediaWikiTestCase {
                                                $retval[] = array(
                                                        "$p//wikipedia.org", '//wikipedia.org',
                                                        $defaultProto, $server, $canServer, $httpsMode,
-                                                       "Test protocol-relative URL ' .
-                                                       '(defaultProto: $protoDesc, wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )"
+                                                       "Test protocol-relative URL (defaultProto: $protoDesc, "
+                                                               . "wgServer: $server, wgCanonicalServer: $canServer, "
+                                                               . "current request protocol: $mode )"
                                                );
                                                $retval[] = array(
-                                                       "$srv/wiki/FooBar", '/wiki/FooBar',
-                                                       $defaultProto, $server, $canServer, $httpsMode,
-                                                       "Testing expanding URL beginning with / ' .
-                                                       '(defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )"
+                                                       "$srv/wiki/FooBar",
+                                                       '/wiki/FooBar',
+                                                       $defaultProto,
+                                                       $server,
+                                                       $canServer,
+                                                       $httpsMode,
+                                                       "Testing expanding URL beginning with / (defaultProto: $protoDesc, "
+                                                               . "wgServer: $server, wgCanonicalServer: $canServer, "
+                                                               . "current request protocol: $mode )"
                                                );
                                        }
                                }
index 6229624..bdb3044 100644 (file)
@@ -4,7 +4,6 @@
  * @covers ::wfGetCaller
  */
 class WfGetCallerTest extends MediaWikiTestCase {
-
        public function testZero() {
                $this->assertEquals( __METHOD__, wfGetCaller( 1 ) );
        }
@@ -31,10 +30,16 @@ class WfGetCallerTest extends MediaWikiTestCase {
 
        public function testN() {
                $this->assertEquals( 'WfGetCallerTest::testN', self::intermediateFunction( 2, 0 ) );
-               $this->assertEquals( 'WfGetCallerTest::intermediateFunction', self::intermediateFunction( 1, 0 ) );
+               $this->assertEquals(
+                       'WfGetCallerTest::intermediateFunction',
+                       self::intermediateFunction( 1, 0 )
+               );
 
                for ( $i = 0; $i < 10; $i++ ) {
-                       $this->assertEquals( 'WfGetCallerTest::intermediateFunction', self::intermediateFunction( $i + 1, $i ) );
+                       $this->assertEquals(
+                               'WfGetCallerTest::intermediateFunction',
+                               self::intermediateFunction( $i + 1, $i )
+                       );
                }
        }
 }
index 5998f18..6335d11 100644 (file)
@@ -32,22 +32,52 @@ class WfTimestampTest extends MediaWikiTestCase {
                        array( '2001-01-15 12:34:56', TS_MW, '20010115123456', 'TS_DB to TS_MW' ),
                        array( '2001-01-15 12:34:56', TS_UNIX, 979562096, 'TS_DB to TS_UNIX' ),
                        array( '2001-01-15 12:34:56', TS_DB, '2001-01-15 12:34:56', 'TS_DB to TS_DB' ),
-                       array( '2001-01-15 12:34:56', TS_ISO_8601_BASIC, '20010115T123456Z', 'TS_DB to TS_ISO_8601_BASIC' ),
+                       array(
+                               '2001-01-15 12:34:56',
+                               TS_ISO_8601_BASIC,
+                               '20010115T123456Z',
+                               'TS_DB to TS_ISO_8601_BASIC'
+                       ),
 
                        # rfc2822 section 3.3
                        array( '20010115123456', TS_RFC2822, 'Mon, 15 Jan 2001 12:34:56 GMT', 'TS_MW to TS_RFC2822' ),
                        array( 'Mon, 15 Jan 2001 12:34:56 GMT', TS_MW, '20010115123456', 'TS_RFC2822 to TS_MW' ),
-                       array( ' Mon, 15 Jan 2001 12:34:56 GMT', TS_MW, '20010115123456', 'TS_RFC2822 with leading space to TS_MW' ),
-                       array( '15 Jan 2001 12:34:56 GMT', TS_MW, '20010115123456', 'TS_RFC2822 without optional day-of-week to TS_MW' ),
+                       array(
+                               ' Mon, 15 Jan 2001 12:34:56 GMT',
+                               TS_MW,
+                               '20010115123456',
+                               'TS_RFC2822 with leading space to TS_MW'
+                       ),
+                       array(
+                               '15 Jan 2001 12:34:56 GMT',
+                               TS_MW,
+                               '20010115123456',
+                               'TS_RFC2822 without optional day-of-week to TS_MW'
+                       ),
 
                        # FWS = ([*WSP CRLF] 1*WSP) / obs-FWS ; Folding white space
                        # obs-FWS = 1*WSP *(CRLF 1*WSP) ; Section 4.2
                        array( 'Mon, 15         Jan 2001 12:34:56 GMT', TS_MW, '20010115123456', 'TS_RFC2822 to TS_MW' ),
 
                        # WSP = SP / HTAB ; rfc2234
-                       array( "Mon, 15 Jan\x092001 12:34:56 GMT", TS_MW, '20010115123456', 'TS_RFC2822 with HTAB to TS_MW' ),
-                       array( "Mon, 15 Jan\x09 \x09  2001 12:34:56 GMT", TS_MW, '20010115123456', 'TS_RFC2822 with HTAB and SP to TS_MW' ),
-                       array( 'Sun, 6 Nov 94 08:49:37 GMT', TS_MW, '19941106084937', 'TS_RFC2822 with obsolete year to TS_MW' ),
+                       array(
+                               "Mon, 15 Jan\x092001 12:34:56 GMT",
+                               TS_MW,
+                               '20010115123456',
+                               'TS_RFC2822 with HTAB to TS_MW'
+                       ),
+                       array(
+                               "Mon, 15 Jan\x09 \x09  2001 12:34:56 GMT",
+                               TS_MW,
+                               '20010115123456',
+                               'TS_RFC2822 with HTAB and SP to TS_MW'
+                       ),
+                       array(
+                               'Sun, 6 Nov 94 08:49:37 GMT',
+                               TS_MW,
+                               '19941106084937',
+                               'TS_RFC2822 with obsolete year to TS_MW'
+                       ),
                );
        }
 
@@ -63,19 +93,33 @@ class WfTimestampTest extends MediaWikiTestCase {
 
        public static function provideOldTimestamps() {
                return array(
-                       array( '19011213204554', TS_RFC2822, 'Fri, 13 Dec 1901 20:45:54 GMT', 'Earliest time according to php documentation' ),
+                       array(
+                               '19011213204554',
+                               TS_RFC2822,
+                               'Fri, 13 Dec 1901 20:45:54 GMT',
+                               'Earliest time according to PHP documentation'
+                       ),
                        array( '20380119031407', TS_RFC2822, 'Tue, 19 Jan 2038 03:14:07 GMT', 'Latest 32 bit time' ),
                        array( '19011213204552', TS_UNIX, '-2147483648', 'Earliest 32 bit unix time' ),
                        array( '20380119031407', TS_UNIX, '2147483647', 'Latest 32 bit unix time' ),
                        array( '19011213204552', TS_RFC2822, 'Fri, 13 Dec 1901 20:45:52 GMT', 'Earliest 32 bit time' ),
-                       array( '19011213204551', TS_RFC2822, 'Fri, 13 Dec 1901 20:45:51 GMT', 'Earliest 32 bit time - 1' ),
+                       array(
+                               '19011213204551',
+                               TS_RFC2822,
+                               'Fri, 13 Dec 1901 20:45:51 GMT', 'Earliest 32 bit time - 1'
+                       ),
                        array( '20380119031408', TS_RFC2822, 'Tue, 19 Jan 2038 03:14:08 GMT', 'Latest 32 bit time + 1' ),
                        array( '19011212000000', TS_MW, '19011212000000', 'Convert to itself r74778#c10645' ),
                        array( '19011213204551', TS_UNIX, '-2147483649', 'Earliest 32 bit unix time - 1' ),
                        array( '20380119031408', TS_UNIX, '2147483648', 'Latest 32 bit unix time + 1' ),
                        array( '-2147483649', TS_MW, '19011213204551', '1901 negative unix time to MediaWiki' ),
                        array( '-5331871504', TS_MW, '18010115123456', '1801 negative unix time to MediaWiki' ),
-                       array( '0117-08-09 12:34:56', TS_RFC2822, 'Tue, 09 Aug 0117 12:34:56 GMT', 'Death of Roman Emperor [[Trajan]]' ),
+                       array(
+                               '0117-08-09 12:34:56',
+                               TS_RFC2822,
+                               'Tue, 09 Aug 0117 12:34:56 GMT',
+                               'Death of Roman Emperor [[Trajan]]'
+                       ),
 
                        /* @todo FIXME: 00 to 101 years are taken as being in [1970-2069] */
                        array( '-58979923200', TS_RFC2822, 'Sun, 01 Jan 0101 00:00:00 GMT', '1/1/101' ),
@@ -85,7 +129,12 @@ class WfTimestampTest extends MediaWikiTestCase {
                         * We are completely off RFC2822 requirement of year being
                         * 1900 or later.
                         */
-                       array( '-62142076800', TS_RFC2822, 'Wed, 18 Oct 0000 00:00:00 GMT', 'ISO 8601:2004 [[year 0]], also called [[1 BC]]' ),
+                       array(
+                               '-62142076800',
+                               TS_RFC2822,
+                               'Wed, 18 Oct 0000 00:00:00 GMT',
+                               'ISO 8601:2004 [[year 0]], also called [[1 BC]]'
+                       ),
                );
        }
 
@@ -106,7 +155,11 @@ class WfTimestampTest extends MediaWikiTestCase {
                        array( 'Sunday, 06-Nov-94 08:49:37 GMT', '19941106084937', 'RFC 850 date' ),
                        array( 'Sun Nov  6 08:49:37 1994', '19941106084937', "ANSI C's asctime() format" ),
                        // See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html and r77171
-                       array( 'Mon, 22 Nov 2010 14:12:42 GMT; length=52626', '20101122141242', 'Netscape extension to HTTP/1.0' ),
+                       array(
+                               'Mon, 22 Nov 2010 14:12:42 GMT; length=52626',
+                               '20101122141242',
+                               'Netscape extension to HTTP/1.0'
+                       ),
                );
        }
 
index ce6c82c..783b985 100644 (file)
@@ -62,12 +62,14 @@ class WfUrlencodeTest extends MediaWikiTestCase {
                        return $expectations;
                } elseif ( is_array( $expectations ) ) {
                        if ( !array_key_exists( $server, $expectations ) ) {
-                               throw new MWException( __METHOD__ . " expectation does not have any value for server name $server. Check the provider array.\n" );
+                               throw new MWException( __METHOD__ . " expectation does not have any "
+                                       . "value for server name $server. Check the provider array.\n" );
                        } else {
                                return $expectations[$server];
                        }
                } else {
-                       throw new MWException( __METHOD__ . " given invalid expectation for '$server'. Should be a string or an array( <http server name> => <string> ).\n" );
+                       throw new MWException( __METHOD__ . " given invalid expectation for "
+                               . "'$server'. Should be a string or an array( <http server name> => <string> ).\n" );
                }
        }
 
index 87af6c1..74d4b09 100644 (file)
@@ -13,11 +13,26 @@ class HooksTest extends MediaWikiTestCase {
                $i = new NothingClass();
 
                return array(
-                       array( 'Object and method', array( $i, 'someNonStatic' ), 'changed-nonstatic', 'changed-nonstatic' ),
+                       array(
+                               'Object and method',
+                               array( $i, 'someNonStatic' ),
+                               'changed-nonstatic',
+                               'changed-nonstatic'
+                       ),
                        array( 'Object and no method', array( $i ), 'changed-onevent', 'original' ),
-                       array( 'Object and method with data', array( $i, 'someNonStaticWithData', 'data' ), 'data', 'original' ),
+                       array(
+                               'Object and method with data',
+                               array( $i, 'someNonStaticWithData', 'data' ),
+                               'data',
+                               'original'
+                       ),
                        array( 'Object and static method', array( $i, 'someStatic' ), 'changed-static', 'original' ),
-                       array( 'Class::method static call', array( 'NothingClass::someStatic' ), 'changed-static', 'original' ),
+                       array(
+                               'Class::method static call',
+                               array( 'NothingClass::someStatic' ),
+                               'changed-static',
+                               'original'
+                       ),
                        array( 'Global function', array( 'NothingFunction' ), 'changed-func', 'original' ),
                        array( 'Global function with data', array( 'NothingFunctionData', 'data' ), 'data', 'original' ),
                        array( 'Closure', array( function ( &$foo, $bar ) {
@@ -76,17 +91,32 @@ class HooksTest extends MediaWikiTestCase {
                $b = new NothingClass();
 
                $wgHooks['MediaWikiHooksTest001'][] = $a;
-               $this->assertTrue( Hooks::isRegistered( 'MediaWikiHooksTest001' ), 'Hook registered via $wgHooks should be noticed by Hooks::isRegistered' );
+               $this->assertTrue(
+                       Hooks::isRegistered( 'MediaWikiHooksTest001' ),
+                       'Hook registered via $wgHooks should be noticed by Hooks::isRegistered'
+               );
 
                Hooks::register( 'MediaWikiHooksTest001', $b );
-               $this->assertEquals( 2, count( Hooks::getHandlers( 'MediaWikiHooksTest001' ) ), 'Hooks::getHandlers() should return hooks registered via wgHooks as well as Hooks::register' );
+               $this->assertEquals(
+                       2,
+                       count( Hooks::getHandlers( 'MediaWikiHooksTest001' ) ),
+                       'Hooks::getHandlers() should return hooks registered via wgHooks as well as Hooks::register'
+               );
 
                $foo = 'quux';
                $bar = 'qaax';
 
                Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
-               $this->assertEquals( 1, $a->calls, 'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register' );
-               $this->assertEquals( 1, $b->calls, 'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register' );
+               $this->assertEquals(
+                       1,
+                       $a->calls,
+                       'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register'
+               );
+               $this->assertEquals(
+                       1,
+                       $b->calls,
+                       'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register'
+               );
        }
 
        /**
index 98eff7b..10ccc4f 100644 (file)
@@ -8,7 +8,9 @@ class HtmlFormatterTest extends MediaWikiTestCase {
         * @dataProvider getHtmlData
         * @covers HtmlFormatter::getText
         */
-       public function testTransform( $input, $expectedText, $expectedRemoved = array(), $callback = false ) {
+       public function testTransform( $input, $expectedText,
+               $expectedRemoved = array(), $callback = false
+       ) {
                $input = self::normalize( $input );
                $formatter = new HtmlFormatter( HtmlFormatter::wrapHTML( $input ) );
                if ( $callback ) {
@@ -56,9 +58,11 @@ class HtmlFormatterTest extends MediaWikiTestCase {
                        ),
                        // basic tag removal
                        array(
+                               // @codingStandardsIgnoreStart Ignore long line warnings.
                                '<table><tr><td>foo</td></tr></table><div class="foo">foo</div><div class="foo quux">foo</div><span id="bar">bar</span>
 <strong class="foo" id="bar">foobar</strong><div class="notfoo">test</div><div class="baz"/>
 <span class="baz">baz</span>',
+                               // @codingStandardsIgnoreEnd
                                '<div class="notfoo">test</div>
 <span class="baz">baz</span>',
                                array(
@@ -92,8 +96,10 @@ class HtmlFormatterTest extends MediaWikiTestCase {
                        ),
                        // https://bugzilla.wikimedia.org/show_bug.cgi?id=53086
                        array(
-                               'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup> <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
-                               'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup> <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
+                               'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>'
+                                       . ' <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
+                               'Foo<sup id="cite_ref-1" class="reference"><a href="#cite_note-1">[1]</a></sup>'
+                                       . ' <a href="/wiki/Bar" title="Bar" class="mw-redirect">Bar</a>',
                        ),
                );
        }
index 21372a0..e934965 100644 (file)
@@ -590,7 +590,8 @@ class HtmlTest extends MediaWikiTestCase {
                # see remarks on http://msdn.microsoft.com/en-us/library/ie/ms535211%28v=vs.85%29.aspx
                $cases[] = array( '<button type=submit></button>',
                        'button', array( 'type' => 'submit' ),
-                       'According to standard the default type is "submit". Depending on compatibility mode IE might use "button", instead.',
+                       'According to standard the default type is "submit". '
+                               . 'Depending on compatibility mode IE might use "button", instead.',
                );
 
                # <select> specifc handling
@@ -640,13 +641,27 @@ class HtmlTest extends MediaWikiTestCase {
         */
        public function testFormValidationBlacklist() {
                $this->assertEmpty(
-                       Html::expandAttributes( array( 'min' => 1, 'max' => 100, 'pattern' => 'abc', 'required' => true, 'step' => 2 ) ),
+                       Html::expandAttributes( array(
+                               'min' => 1,
+                               'max' => 100,
+                               'pattern' => 'abc',
+                               'required' => true,
+                               'step' => 2
+                       ) ),
                        'Blacklist form validation attributes.'
                );
                $this->assertEquals(
                        ' step=any',
-                       Html::expandAttributes( array( 'min' => 1, 'max' => 100, 'pattern' => 'abc', 'required' => true, 'step' => 'any' ) ),
-                       'Allow special case "step=any".'
+                       Html::expandAttributes(
+                               array(
+                                       'min' => 1,
+                                       'max' => 100,
+                                       'pattern' => 'abc',
+                                       'required' => true,
+                                       'step' => 'any'
+                               ),
+                               'Allow special case "step=any".'
+                       )
                );
        }
 }
index 11d8ed6..9b53381 100644 (file)
@@ -177,7 +177,6 @@ class HttpTest extends MediaWikiTestCase {
  * Class to let us overwrite MWHttpRequest respHeaders variable
  */
 class MWHttpRequestTester extends MWHttpRequest {
-
        // function derived from the MWHttpRequest factory function but
        // returns appropriate tester class here
        public static function factory( $url, $options = null ) {
@@ -193,8 +192,9 @@ class MWHttpRequestTester extends MWHttpRequest {
                                return new CurlHttpRequestTester( $url, $options );
                        case 'php':
                                if ( !wfIniGetBool( 'allow_url_fopen' ) ) {
-                                       throw new MWException( __METHOD__ . ': allow_url_fopen needs to be enabled for pure PHP' .
-                                               ' http requests to work. If possible, curl should be used instead. See http://php.net/curl.' );
+                                       throw new MWException( __METHOD__ .
+                                               ': allow_url_fopen needs to be enabled for pure PHP HTTP requests to work. '
+                                                       . 'If possible, curl should be used instead. See http://php.net/curl.' );
                                }
 
                                return new PhpHttpRequestTester( $url, $options );
index 351ad34..110cbac 100644 (file)
@@ -28,38 +28,52 @@ class LinkerTest extends MediaWikiLangTestCase {
 
                        ### ANONYMOUS USER ########################################
                        array(
-                               '<a href="/wiki/Special:Contributions/JohnDoe" title="Special:Contributions/JohnDoe" class="mw-userlink mw-anonuserlink">JohnDoe</a>',
+                               '<a href="/wiki/Special:Contributions/JohnDoe" '
+                                       . 'title="Special:Contributions/JohnDoe" '
+                                       . 'class="mw-userlink mw-anonuserlink">JohnDoe</a>',
                                0, 'JohnDoe', false,
                        ),
                        array(
-                               '<a href="/wiki/Special:Contributions/::1" title="Special:Contributions/::1" class="mw-userlink mw-anonuserlink">::1</a>',
+                               '<a href="/wiki/Special:Contributions/::1" '
+                                       . 'title="Special:Contributions/::1" '
+                                       . 'class="mw-userlink mw-anonuserlink">::1</a>',
                                0, '::1', false,
                                'Anonymous with pretty IPv6'
                        ),
                        array(
-                               '<a href="/wiki/Special:Contributions/0:0:0:0:0:0:0:1" title="Special:Contributions/0:0:0:0:0:0:0:1" class="mw-userlink mw-anonuserlink">::1</a>',
+                               '<a href="/wiki/Special:Contributions/0:0:0:0:0:0:0:1" '
+                                       . 'title="Special:Contributions/0:0:0:0:0:0:0:1" '
+                                       . 'class="mw-userlink mw-anonuserlink">::1</a>',
                                0, '0:0:0:0:0:0:0:1', false,
                                'Anonymous with almost pretty IPv6'
                        ),
                        array(
-                               '<a href="/wiki/Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001" title="Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001" class="mw-userlink mw-anonuserlink">::1</a>',
+                               '<a href="/wiki/Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001" '
+                                       . 'title="Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001" '
+                                       . 'class="mw-userlink mw-anonuserlink">::1</a>',
                                0, '0000:0000:0000:0000:0000:0000:0000:0001', false,
                                'Anonymous with full IPv6'
                        ),
                        array(
-                               '<a href="/wiki/Special:Contributions/::1" title="Special:Contributions/::1" class="mw-userlink mw-anonuserlink">AlternativeUsername</a>',
+                               '<a href="/wiki/Special:Contributions/::1" '
+                                       . 'title="Special:Contributions/::1" '
+                                       . 'class="mw-userlink mw-anonuserlink">AlternativeUsername</a>',
                                0, '::1', 'AlternativeUsername',
                                'Anonymous with pretty IPv6 and an alternative username'
                        ),
 
                        # IPV4
                        array(
-                               '<a href="/wiki/Special:Contributions/127.0.0.1" title="Special:Contributions/127.0.0.1" class="mw-userlink mw-anonuserlink">127.0.0.1</a>',
+                               '<a href="/wiki/Special:Contributions/127.0.0.1" '
+                                       . 'title="Special:Contributions/127.0.0.1" '
+                                       . 'class="mw-userlink mw-anonuserlink">127.0.0.1</a>',
                                0, '127.0.0.1', false,
                                'Anonymous with IPv4'
                        ),
                        array(
-                               '<a href="/wiki/Special:Contributions/127.0.0.1" title="Special:Contributions/127.0.0.1" class="mw-userlink mw-anonuserlink">AlternativeUsername</a>',
+                               '<a href="/wiki/Special:Contributions/127.0.0.1" '
+                                       . 'title="Special:Contributions/127.0.0.1" '
+                                       . 'class="mw-userlink mw-anonuserlink">AlternativeUsername</a>',
                                0, '127.0.0.1', 'AlternativeUsername',
                                'Anonymous with IPv4 and an alternative username'
                        ),
index 33643ac..9ff547c 100644 (file)
@@ -63,9 +63,15 @@ class LinksUpdateTest extends MediaWikiTestCase {
                $po->addLink( Title::newFromText( "linksupdatetest:Foo" ) ); // interwiki link should be ignored
                $po->addLink( Title::newFromText( "#Foo" ) ); // hash link should be ignored
 
-               $update = $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
-                       array( NS_MAIN, 'Foo' ),
-               ) );
+               $update = $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'pagelinks',
+                       'pl_namespace,
+                       pl_title',
+                       'pl_from = 111',
+                       array( array( NS_MAIN, 'Foo' ) )
+               );
                $this->assertArrayEquals( array(
                        Title::makeTitle( NS_MAIN, 'Foo' ),  // newFromText doesn't yield the same internal state....
                ), $update->getAddedLinks() );
@@ -76,10 +82,18 @@ class LinksUpdateTest extends MediaWikiTestCase {
                $po->addLink( Title::newFromText( "Bar" ) );
                $po->addLink( Title::newFromText( "Talk:Bar" ) );
 
-               $update = $this->assertLinksUpdate( $t, $po, 'pagelinks', 'pl_namespace, pl_title', 'pl_from = 111', array(
-                       array( NS_MAIN, 'Bar' ),
-                       array( NS_TALK, 'Bar' ),
-               ) );
+               $update = $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'pagelinks',
+                       'pl_namespace,
+                       pl_title',
+                       'pl_from = 111',
+                       array(
+                               array( NS_MAIN, 'Bar' ),
+                               array( NS_TALK, 'Bar' ),
+                       )
+               );
                $this->assertArrayEquals( array(
                        Title::makeTitle( NS_MAIN, 'Bar' ),
                        Title::makeTitle( NS_TALK, 'Bar' ),
@@ -143,9 +157,15 @@ class LinksUpdateTest extends MediaWikiTestCase {
 
                $po->addTemplate( Title::newFromText( "Template:Foo" ), 23, 42 );
 
-               $this->assertLinksUpdate( $t, $po, 'templatelinks', 'tl_namespace, tl_title', 'tl_from = 111', array(
-                       array( NS_TEMPLATE, 'Foo' ),
-               ) );
+               $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'templatelinks',
+                       'tl_namespace,
+                       tl_title',
+                       'tl_from = 111',
+                       array( array( NS_TEMPLATE, 'Foo' ) )
+               );
        }
 
        /**
@@ -180,19 +200,55 @@ class LinksUpdateTest extends MediaWikiTestCase {
         * @covers ParserOutput::setProperty
         */
        public function testUpdate_page_props() {
+               global $wgPagePropsHaveSortkey;
+
                /** @var ParserOutput $po */
                list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
 
-               $po->setProperty( "foo", "bar" );
+               $fields = array( 'pp_propname', 'pp_value' );
+               $expected = array();
 
-               $this->assertLinksUpdate( $t, $po, 'page_props', 'pp_propname, pp_value', 'pp_page = 111', array(
-                       array( 'foo', 'bar' ),
-               ) );
+               $po->setProperty( "bool", true );
+               $expected[] = array( "bool", true );
+
+               $po->setProperty( "float", 4.0 + 1.0/4.0 );
+               $expected[] = array( "float", 4.0 + 1.0/4.0 );
+
+               $po->setProperty( "int", -7 );
+               $expected[] = array( "int", -7 );
+
+               $po->setProperty( "string", "33 bar" );
+               $expected[] = array( "string", "33 bar" );
+
+               // compute expected sortkey values
+               if ( $wgPagePropsHaveSortkey ) {
+                       $fields[] = 'pp_sortkey';
+
+                       foreach ( $expected as &$row ) {
+                               $value = $row[1];
+
+                               if ( is_int( $value ) || is_float( $value ) || is_bool( $value ) ) {
+                                       $row[] = floatval( $value );
+                               } else {
+                                       $row[] = null;
+                               }
+                       }
+               }
+
+               $this->assertLinksUpdate( $t, $po, 'page_props', $fields, 'pp_page = 111', $expected );
+       }
+
+       public function testUpdate_page_props_without_sortkey() {
+               $this->setMwGlobals( 'wgPagePropsHaveSortkey', false );
+
+               $this->testUpdate_page_props();
        }
 
        // @todo test recursive, too!
 
-       protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput, $table, $fields, $condition, array $expectedRows ) {
+       protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput,
+               $table, $fields, $condition, array $expectedRows
+       ) {
                $update = new LinksUpdate( $title, $parserOutput );
 
                //NOTE: make sure LinksUpdate does not generate warnings when called inside a transaction.
index d210ce5..5c5052e 100644 (file)
@@ -67,20 +67,44 @@ class LocalFileTest extends MediaWikiTestCase {
         * @covers File::getArchivePath
         */
        public function testGetArchivePath() {
-               $this->assertEquals( 'mwstore://local-backend/test-public/archive', $this->file_hl0->getArchivePath() );
-               $this->assertEquals( 'mwstore://local-backend/test-public/archive/a/a2', $this->file_hl2->getArchivePath() );
-               $this->assertEquals( 'mwstore://local-backend/test-public/archive/!', $this->file_hl0->getArchivePath( '!' ) );
-               $this->assertEquals( 'mwstore://local-backend/test-public/archive/a/a2/!', $this->file_hl2->getArchivePath( '!' ) );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive',
+                       $this->file_hl0->getArchivePath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive/a/a2',
+                       $this->file_hl2->getArchivePath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive/!',
+                       $this->file_hl0->getArchivePath( '!' )
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-public/archive/a/a2/!',
+                       $this->file_hl2->getArchivePath( '!' )
+               );
        }
 
        /**
         * @covers File::getThumbPath
         */
        public function testGetThumbPath() {
-               $this->assertEquals( 'mwstore://local-backend/test-thumb/Test!', $this->file_hl0->getThumbPath() );
-               $this->assertEquals( 'mwstore://local-backend/test-thumb/a/a2/Test!', $this->file_hl2->getThumbPath() );
-               $this->assertEquals( 'mwstore://local-backend/test-thumb/Test!/x', $this->file_hl0->getThumbPath( 'x' ) );
-               $this->assertEquals( 'mwstore://local-backend/test-thumb/a/a2/Test!/x', $this->file_hl2->getThumbPath( 'x' ) );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/Test!',
+                       $this->file_hl0->getThumbPath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/a/a2/Test!',
+                       $this->file_hl2->getThumbPath()
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/Test!/x',
+                       $this->file_hl0->getThumbPath( 'x' )
+               );
+               $this->assertEquals(
+                       'mwstore://local-backend/test-thumb/a/a2/Test!/x',
+                       $this->file_hl2->getThumbPath( 'x' )
+               );
        }
 
        /**
@@ -108,9 +132,18 @@ class LocalFileTest extends MediaWikiTestCase {
         */
        public function testGetArchiveVirtualUrl() {
                $this->assertEquals( 'mwrepo://test/public/archive', $this->file_hl0->getArchiveVirtualUrl() );
-               $this->assertEquals( 'mwrepo://test/public/archive/a/a2', $this->file_hl2->getArchiveVirtualUrl() );
-               $this->assertEquals( 'mwrepo://test/public/archive/%21', $this->file_hl0->getArchiveVirtualUrl( '!' ) );
-               $this->assertEquals( 'mwrepo://test/public/archive/a/a2/%21', $this->file_hl2->getArchiveVirtualUrl( '!' ) );
+               $this->assertEquals(
+                       'mwrepo://test/public/archive/a/a2',
+                       $this->file_hl2->getArchiveVirtualUrl()
+               );
+               $this->assertEquals(
+                       'mwrepo://test/public/archive/%21',
+                       $this->file_hl0->getArchiveVirtualUrl( '!' )
+               );
+               $this->assertEquals(
+                       'mwrepo://test/public/archive/a/a2/%21',
+                       $this->file_hl2->getArchiveVirtualUrl( '!' )
+               );
        }
 
        /**
@@ -119,8 +152,14 @@ class LocalFileTest extends MediaWikiTestCase {
        public function testGetThumbVirtualUrl() {
                $this->assertEquals( 'mwrepo://test/thumb/Test%21', $this->file_hl0->getThumbVirtualUrl() );
                $this->assertEquals( 'mwrepo://test/thumb/a/a2/Test%21', $this->file_hl2->getThumbVirtualUrl() );
-               $this->assertEquals( 'mwrepo://test/thumb/Test%21/%21', $this->file_hl0->getThumbVirtualUrl( '!' ) );
-               $this->assertEquals( 'mwrepo://test/thumb/a/a2/Test%21/%21', $this->file_hl2->getThumbVirtualUrl( '!' ) );
+               $this->assertEquals(
+                       'mwrepo://test/thumb/Test%21/%21',
+                       $this->file_hl0->getThumbVirtualUrl( '!' )
+               );
+               $this->assertEquals(
+                       'mwrepo://test/thumb/a/a2/Test%21/%21',
+                       $this->file_hl2->getThumbVirtualUrl( '!' )
+               );
        }
 
        /**
@@ -136,6 +175,10 @@ class LocalFileTest extends MediaWikiTestCase {
         */
        public function testWfLocalFile() {
                $file = wfLocalFile( "File:Some_file_that_probably_doesn't exist.png" );
-               $this->assertThat( $file, $this->isInstanceOf( 'LocalFile' ), 'wfLocalFile() returns LocalFile for valid Titles' );
+               $this->assertThat(
+                       $file,
+                       $this->isInstanceOf( 'LocalFile' ),
+                       'wfLocalFile() returns LocalFile for valid Titles'
+               );
        }
 }
index b6fa139..49fdd48 100644 (file)
@@ -572,7 +572,11 @@ class MWNamespaceTest extends MediaWikiTestCase {
                        return $this->$method( $args );
                }
 
-               if ( preg_match( '/^assert(Has|Is|Can)(Not|)(Subject|Talk|Watchable|Content|Subpages|Capitalized)$/', $method, $m ) ) {
+               if ( preg_match(
+                       '/^assert(Has|Is|Can)(Not|)(Subject|Talk|Watchable|Content|Subpages|Capitalized)$/',
+                       $method,
+                       $m
+               ) ) {
                        # Interprets arguments:
                        $ns = $args[0];
                        $msg = isset( $args[1] ) ? $args[1] : " dummy message";
index 25b0805..7db985b 100644 (file)
@@ -124,7 +124,10 @@ class MessageTest extends MediaWikiLangTestCase {
                // NOTE: make sure internal caching of the message text is reset appropriately
                $msg = wfMessage( 'mainpage' );
                $this->assertEquals( 'Main Page', $msg->inLanguage( Language::factory( 'en' ) )->text() );
-               $this->assertEquals( 'Заглавная страница', $msg->inLanguage( Language::factory( 'ru' ) )->text() );
+               $this->assertEquals(
+                       'Заглавная страница',
+                       $msg->inLanguage( Language::factory( 'ru' ) )->text()
+               );
        }
 
        /**
@@ -133,8 +136,14 @@ class MessageTest extends MediaWikiLangTestCase {
        public function testMessageParams() {
                $this->assertEquals( 'Return to $1.', wfMessage( 'returnto' )->text() );
                $this->assertEquals( 'Return to $1.', wfMessage( 'returnto', array() )->text() );
-               $this->assertEquals( 'You have foo (bar).', wfMessage( 'youhavenewmessages', 'foo', 'bar' )->text() );
-               $this->assertEquals( 'You have foo (bar).', wfMessage( 'youhavenewmessages', array( 'foo', 'bar' ) )->text() );
+               $this->assertEquals(
+                       'You have foo (bar).',
+                       wfMessage( 'youhavenewmessages', 'foo', 'bar' )->text()
+               );
+               $this->assertEquals(
+                       'You have foo (bar).',
+                       wfMessage( 'youhavenewmessages', array( 'foo', 'bar' ) )->text()
+               );
        }
 
        /**
@@ -142,10 +151,22 @@ class MessageTest extends MediaWikiLangTestCase {
         * @covers Message::rawParams
         */
        public function testMessageParamSubstitution() {
-               $this->assertEquals( '(Заглавная страница)', wfMessage( 'parentheses', 'Заглавная страница' )->plain() );
-               $this->assertEquals( '(Заглавная страница $1)', wfMessage( 'parentheses', 'Заглавная страница $1' )->plain() );
-               $this->assertEquals( '(Заглавная страница)', wfMessage( 'parentheses' )->rawParams( 'Заглавная страница' )->plain() );
-               $this->assertEquals( '(Заглавная страница $1)', wfMessage( 'parentheses' )->rawParams( 'Заглавная страница $1' )->plain() );
+               $this->assertEquals(
+                       '(Заглавная страница)',
+                       wfMessage( 'parentheses', 'Заглавная страница' )->plain()
+               );
+               $this->assertEquals(
+                       '(Заглавная страница $1)',
+                       wfMessage( 'parentheses', 'Заглавная страница $1' )->plain()
+               );
+               $this->assertEquals(
+                       '(Заглавная страница)',
+                       wfMessage( 'parentheses' )->rawParams( 'Заглавная страница' )->plain()
+               );
+               $this->assertEquals(
+                       '(Заглавная страница $1)',
+                       wfMessage( 'parentheses' )->rawParams( 'Заглавная страница $1' )->plain()
+               );
        }
 
        /**
@@ -156,7 +177,11 @@ class MessageTest extends MediaWikiLangTestCase {
                $msg = new RawMessage( '$1$2$3$4$5$6$7$8$9$10$11$12' );
                // One less than above has placeholders
                $params = array( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k' );
-               $this->assertEquals( 'abcdefghijka2', $msg->params( $params )->plain(), 'Params > 9 are replaced correctly' );
+               $this->assertEquals(
+                       'abcdefghijka2',
+                       $msg->params( $params )->plain(),
+                       'Params > 9 are replaced correctly'
+               );
        }
 
        /**
@@ -270,9 +295,17 @@ class MessageTest extends MediaWikiLangTestCase {
                // NOTE: make sure internal caching of the message text is reset appropriately.
                // NOTE: wgForceUIMsgAsContentMsg forces the messages *current* language to be used.
                $msg = wfMessage( 'mainpage' );
-               $this->assertEquals( 'Accueil', $msg->inContentLanguage()->plain(), 'inContentLanguage() with ForceUIMsg override enabled' );
+               $this->assertEquals(
+                       'Accueil',
+                       $msg->inContentLanguage()->plain(),
+                       'inContentLanguage() with ForceUIMsg override enabled'
+               );
                $this->assertEquals( 'Main Page', $msg->inLanguage( 'en' )->plain(), "inLanguage( 'en' )" );
-               $this->assertEquals( 'Main Page', $msg->inContentLanguage()->plain(), 'inContentLanguage() with ForceUIMsg override enabled' );
+               $this->assertEquals(
+                       'Main Page',
+                       $msg->inContentLanguage()->plain(),
+                       'inContentLanguage() with ForceUIMsg override enabled'
+               );
                $this->assertEquals( 'Hauptseite', $msg->inLanguage( 'de' )->plain(), "inLanguage( 'de' )" );
        }
 
index e60dc54..0d78268 100644 (file)
@@ -236,8 +236,10 @@ class PathRouterTest extends MediaWikiTestCase {
         * Ensure the router doesn't choke on long paths.
         */
        public function testLength() {
+               // @codingStandardsIgnoreStart Ignore long line warnings
                $matches = $this->basicRouter->parse( "/wiki/Lorem_ipsum_dolor_sit_amet,_consectetur_adipisicing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum." );
                $this->assertEquals( $matches, array( 'title' => "Lorem_ipsum_dolor_sit_amet,_consectetur_adipisicing_elit,_sed_do_eiusmod_tempor_incididunt_ut_labore_et_dolore_magna_aliqua._Ut_enim_ad_minim_veniam,_quis_nostrud_exercitation_ullamco_laboris_nisi_ut_aliquip_ex_ea_commodo_consequat._Duis_aute_irure_dolor_in_reprehenderit_in_voluptate_velit_esse_cillum_dolore_eu_fugiat_nulla_pariatur._Excepteur_sint_occaecat_cupidatat_non_proident,_sunt_in_culpa_qui_officia_deserunt_mollit_anim_id_est_laborum." ) );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
index 1776b5d..f595d2d 100644 (file)
@@ -25,8 +25,11 @@ class RequestContextTest extends MediaWikiTestCase {
 
                $curTitle = Title::newFromText( "C" );
                $context->setTitle( $curTitle );
-               $this->assertTrue( $curTitle->equals( $context->getWikiPage()->getTitle() ),
-                       "When a title is updated the WikiPage should be purged and recreated on-demand with the new title." );
+               $this->assertTrue(
+                       $curTitle->equals( $context->getWikiPage()->getTitle() ),
+                       "When a title is updated the WikiPage should be purged "
+                               . "and recreated on-demand with the new title."
+               );
        }
 
        /**
@@ -46,7 +49,9 @@ class RequestContextTest extends MediaWikiTestCase {
                        'sessionId' => 'd612ee607c87e749ef14da4983a702cd',
                        'userId' => $user->getId(),
                        'ip' => '192.0.2.0',
-                       'headers' => array( 'USER-AGENT' => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0' )
+                       'headers' => array(
+                               'USER-AGENT' => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0'
+                       )
                );
                $sc = RequestContext::importScopedSession( $sinfo ); // load new context
 
@@ -55,12 +60,24 @@ class RequestContextTest extends MediaWikiTestCase {
                $this->assertEquals( $sinfo['headers'], $info['headers'], "Correct headers." );
                $this->assertEquals( $sinfo['sessionId'], $info['sessionId'], "Correct session ID." );
                $this->assertEquals( $sinfo['userId'], $info['userId'], "Correct user ID." );
-               $this->assertEquals( $sinfo['ip'], $context->getRequest()->getIP(), "Correct context IP address." );
-               $this->assertEquals( $sinfo['headers'], $context->getRequest()->getAllHeaders(), "Correct context headers." );
+               $this->assertEquals(
+                       $sinfo['ip'],
+                       $context->getRequest()->getIP(),
+                       "Correct context IP address."
+               );
+               $this->assertEquals(
+                       $sinfo['headers'],
+                       $context->getRequest()->getAllHeaders(),
+                       "Correct context headers."
+               );
                $this->assertEquals( $sinfo['sessionId'], session_id(), "Correct context session ID." );
                $this->assertEquals( true, $context->getUser()->isLoggedIn(), "Correct context user." );
                $this->assertEquals( $sinfo['userId'], $context->getUser()->getId(), "Correct context user ID." );
-               $this->assertEquals( 'UnitTestContextUser', $context->getUser()->getName(), "Correct context user name." );
+               $this->assertEquals(
+                       'UnitTestContextUser',
+                       $context->getUser()->getName(),
+                       "Correct context user name."
+               );
 
                unset( $sc ); // restore previous context
 
index e69660e..9a429bc 100644 (file)
  * ^--- important, causes tests not to fail with timeout
  */
 class RevisionStorageTest extends MediaWikiTestCase {
-
        /**
         * @var WikiPage $the_page
         */
-       var $the_page;
+       private $the_page;
 
        function __construct( $name = null, array $data = array(), $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
@@ -52,7 +51,11 @@ class RevisionStorageTest extends MediaWikiTestCase {
                MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
                $wgContLang->resetNamespaces(); # reset namespace cache
                if ( !$this->the_page ) {
-                       $this->the_page = $this->createPage( 'RevisionStorageTest_the_page', "just a dummy page", CONTENT_MODEL_WIKITEXT );
+                       $this->the_page = $this->createPage(
+                               'RevisionStorageTest_the_page',
+                               "just a dummy page",
+                               CONTENT_MODEL_WIKITEXT
+                       );
                }
        }
 
@@ -174,7 +177,11 @@ class RevisionStorageTest extends MediaWikiTestCase {
         * @covers Revision::newFromArchiveRow
         */
        public function testNewFromArchiveRow() {
-               $page = $this->createPage( 'RevisionStorageTest_testNewFromArchiveRow', 'Lorem Ipsum', CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       'RevisionStorageTest_testNewFromArchiveRow',
+                       'Lorem Ipsum',
+                       CONTENT_MODEL_WIKITEXT
+               );
                $orig = $page->getRevision();
                $page->doDeleteArticle( 'test Revision::newFromArchiveRow' );
 
@@ -205,7 +212,11 @@ class RevisionStorageTest extends MediaWikiTestCase {
         * @covers Revision::fetchRevision
         */
        public function testFetchRevision() {
-               $page = $this->createPage( 'RevisionStorageTest_testFetchRevision', 'one', CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       'RevisionStorageTest_testFetchRevision',
+                       'one',
+                       CONTENT_MODEL_WIKITEXT
+               );
 
                // Hidden process cache assertion below
                $page->getRevision()->getId();
@@ -235,7 +246,10 @@ class RevisionStorageTest extends MediaWikiTestCase {
 
                $this->assertTrue( in_array( 'rev_id', $fields ), 'missing rev_id in list of fields' );
                $this->assertTrue( in_array( 'rev_page', $fields ), 'missing rev_page in list of fields' );
-               $this->assertTrue( in_array( 'rev_timestamp', $fields ), 'missing rev_timestamp in list of fields' );
+               $this->assertTrue(
+                       in_array( 'rev_timestamp', $fields ),
+                       'missing rev_timestamp in list of fields'
+               );
                $this->assertTrue( in_array( 'rev_user', $fields ), 'missing rev_user in list of fields' );
 
                if ( $wgContentHandlerUseDB ) {
@@ -351,7 +365,11 @@ class RevisionStorageTest extends MediaWikiTestCase {
         * @covers Revision::isCurrent
         */
        public function testIsCurrent() {
-               $page = $this->createPage( 'RevisionStorageTest_testIsCurrent', 'Lorem Ipsum', CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       'RevisionStorageTest_testIsCurrent',
+                       'Lorem Ipsum',
+                       CONTENT_MODEL_WIKITEXT
+               );
                $rev1 = $page->getRevision();
 
                # @todo find out if this should be true
@@ -360,7 +378,10 @@ class RevisionStorageTest extends MediaWikiTestCase {
                $rev1x = Revision::newFromId( $rev1->getId() );
                $this->assertTrue( $rev1x->isCurrent() );
 
-               $page->doEditContent( ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 'second rev' );
+               $page->doEditContent(
+                       ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       'second rev'
+               );
                $rev2 = $page->getRevision();
 
                # @todo find out if this should be true
@@ -377,12 +398,17 @@ class RevisionStorageTest extends MediaWikiTestCase {
         * @covers Revision::getPrevious
         */
        public function testGetPrevious() {
-               $page = $this->createPage( 'RevisionStorageTest_testGetPrevious', 'Lorem Ipsum testGetPrevious', CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       'RevisionStorageTest_testGetPrevious',
+                       'Lorem Ipsum testGetPrevious',
+                       CONTENT_MODEL_WIKITEXT
+               );
                $rev1 = $page->getRevision();
 
                $this->assertNull( $rev1->getPrevious() );
 
-               $page->doEditContent( ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+               $page->doEditContent(
+                       ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
                        'second rev testGetPrevious' );
                $rev2 = $page->getRevision();
 
@@ -394,13 +420,19 @@ class RevisionStorageTest extends MediaWikiTestCase {
         * @covers Revision::getNext
         */
        public function testGetNext() {
-               $page = $this->createPage( 'RevisionStorageTest_testGetNext', 'Lorem Ipsum testGetNext', CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       'RevisionStorageTest_testGetNext',
+                       'Lorem Ipsum testGetNext',
+                       CONTENT_MODEL_WIKITEXT
+               );
                $rev1 = $page->getRevision();
 
                $this->assertNull( $rev1->getNext() );
 
-               $page->doEditContent( ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       'second rev testGetNext' );
+               $page->doEditContent(
+                       ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       'second rev testGetNext'
+               );
                $rev2 = $page->getRevision();
 
                $this->assertNotNull( $rev1->getNext() );
@@ -411,7 +443,11 @@ class RevisionStorageTest extends MediaWikiTestCase {
         * @covers Revision::newNullRevision
         */
        public function testNewNullRevision() {
-               $page = $this->createPage( 'RevisionStorageTest_testNewNullRevision', 'some testing text', CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       'RevisionStorageTest_testNewNullRevision',
+                       'some testing text',
+                       CONTENT_MODEL_WIKITEXT
+               );
                $orig = $page->getRevision();
 
                $dbw = wfGetDB( DB_MASTER );
@@ -469,7 +505,8 @@ class RevisionStorageTest extends MediaWikiTestCase {
                # zero
                $revisions[0] = new Revision( array(
                        'page' => $page->getId(),
-                       'title' => $page->getTitle(), // we need the title to determine the page's default content model
+                       // we need the title to determine the page's default content model
+                       'title' => $page->getTitle(),
                        'timestamp' => '20120101000000',
                        'user' => $userA->getId(),
                        'text' => 'zero',
@@ -481,7 +518,8 @@ class RevisionStorageTest extends MediaWikiTestCase {
                # one
                $revisions[1] = new Revision( array(
                        'page' => $page->getId(),
-                       'title' => $page->getTitle(), // still need the title, because $page->getId() is 0 (there's no entry in the page table)
+                       // still need the title, because $page->getId() is 0 (there's no entry in the page table)
+                       'title' => $page->getTitle(),
                        'timestamp' => '20120101000100',
                        'user' => $userA->getId(),
                        'text' => 'one',
diff --git a/tests/phpunit/includes/RevisionStorageTestContentHandlerUseDB.php b/tests/phpunit/includes/RevisionStorageTestContentHandlerUseDB.php
new file mode 100644 (file)
index 0000000..d5e47c8
--- /dev/null
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * @group ContentHandler
+ * @group Database
+ * ^--- important, causes temporary tables to be used instead of the real database
+ */
+class RevisionTestContentHandlerUseDB extends RevisionStorageTest {
+
+       protected function setUp() {
+               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $page_table = $dbw->tableName( 'page' );
+               $revision_table = $dbw->tableName( 'revision' );
+               $archive_table = $dbw->tableName( 'archive' );
+
+               if ( $dbw->fieldExists( $page_table, 'page_content_model' ) ) {
+                       $dbw->query( "alter table $page_table drop column page_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_format" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_model" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_format" );
+               }
+
+               parent::setUp();
+       }
+
+       /**
+        * @covers Revision::selectFields
+        */
+       public function testSelectFields() {
+               $fields = Revision::selectFields();
+
+               $this->assertTrue( in_array( 'rev_id', $fields ), 'missing rev_id in list of fields' );
+               $this->assertTrue( in_array( 'rev_page', $fields ), 'missing rev_page in list of fields' );
+               $this->assertTrue(
+                       in_array( 'rev_timestamp', $fields ),
+                       'missing rev_timestamp in list of fields'
+               );
+               $this->assertTrue( in_array( 'rev_user', $fields ), 'missing rev_user in list of fields' );
+
+               $this->assertFalse(
+                       in_array( 'rev_content_model', $fields ),
+                       'missing rev_content_model in list of fields'
+               );
+               $this->assertFalse(
+                       in_array( 'rev_content_format', $fields ),
+                       'missing rev_content_format in list of fields'
+               );
+       }
+
+       /**
+        * @covers Revision::getContentModel
+        */
+       public function testGetContentModel() {
+               try {
+                       $this->makeRevision( array( 'text' => 'hello hello.',
+                               'content_model' => CONTENT_MODEL_JAVASCRIPT ) );
+
+                       $this->fail( "Creating JavaScript content on a wikitext page should fail with "
+                               . "\$wgContentHandlerUseDB disabled" );
+               } catch ( MWException $ex ) {
+                       $this->assertTrue( true ); // ok
+               }
+       }
+
+       /**
+        * @covers Revision::getContentFormat
+        */
+       public function testGetContentFormat() {
+               try {
+                       // @todo change this to test failure on using a non-standard (but supported) format
+                       //       for a content model supported in the given location. As of 1.21, there are
+                       //       no alternative formats for any of the standard content models that could be
+                       //       used for this though.
+
+                       $this->makeRevision( array( 'text' => 'hello hello.',
+                               'content_model' => CONTENT_MODEL_JAVASCRIPT,
+                               'content_format' => 'text/javascript' ) );
+
+                       $this->fail( "Creating JavaScript content on a wikitext page should fail with "
+                               . "\$wgContentHandlerUseDB disabled" );
+               } catch ( MWException $ex ) {
+                       $this->assertTrue( true ); // ok
+               }
+       }
+}
diff --git a/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php b/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
deleted file mode 100644 (file)
index f830e36..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-
-/**
- * @group ContentHandler
- * @group Database
- * ^--- important, causes temporary tables to be used instead of the real database
- */
-class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
-
-       protected function setUp() {
-               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               $page_table = $dbw->tableName( 'page' );
-               $revision_table = $dbw->tableName( 'revision' );
-               $archive_table = $dbw->tableName( 'archive' );
-
-               if ( $dbw->fieldExists( $page_table, 'page_content_model' ) ) {
-                       $dbw->query( "alter table $page_table drop column page_content_model" );
-                       $dbw->query( "alter table $revision_table drop column rev_content_model" );
-                       $dbw->query( "alter table $revision_table drop column rev_content_format" );
-                       $dbw->query( "alter table $archive_table drop column ar_content_model" );
-                       $dbw->query( "alter table $archive_table drop column ar_content_format" );
-               }
-
-               parent::setUp();
-       }
-
-       /**
-        * @covers Revision::selectFields
-        */
-       public function testSelectFields() {
-               $fields = Revision::selectFields();
-
-               $this->assertTrue( in_array( 'rev_id', $fields ), 'missing rev_id in list of fields' );
-               $this->assertTrue( in_array( 'rev_page', $fields ), 'missing rev_page in list of fields' );
-               $this->assertTrue( in_array( 'rev_timestamp', $fields ), 'missing rev_timestamp in list of fields' );
-               $this->assertTrue( in_array( 'rev_user', $fields ), 'missing rev_user in list of fields' );
-
-               $this->assertFalse( in_array( 'rev_content_model', $fields ), 'missing rev_content_model in list of fields' );
-               $this->assertFalse( in_array( 'rev_content_format', $fields ), 'missing rev_content_format in list of fields' );
-       }
-
-       /**
-        * @covers Revision::getContentModel
-        */
-       public function testGetContentModel() {
-               try {
-                       $this->makeRevision( array( 'text' => 'hello hello.',
-                               'content_model' => CONTENT_MODEL_JAVASCRIPT ) );
-
-                       $this->fail( "Creating JavaScript content on a wikitext page should fail with "
-                               . "\$wgContentHandlerUseDB disabled" );
-               } catch ( MWException $ex ) {
-                       $this->assertTrue( true ); // ok
-               }
-       }
-
-       /**
-        * @covers Revision::getContentFormat
-        */
-       public function testGetContentFormat() {
-               try {
-                       // @todo change this to test failure on using a non-standard (but supported) format
-                       //       for a content model supported in the given location. As of 1.21, there are
-                       //       no alternative formats for any of the standard content models that could be
-                       //       used for this though.
-
-                       $this->makeRevision( array( 'text' => 'hello hello.',
-                               'content_model' => CONTENT_MODEL_JAVASCRIPT,
-                               'content_format' => 'text/javascript' ) );
-
-                       $this->fail( "Creating JavaScript content on a wikitext page should fail with "
-                               . "\$wgContentHandlerUseDB disabled" );
-               } catch ( MWException $ex ) {
-                       $this->assertTrue( true ); // ok
-               }
-       }
-}
index 48a4017..4623b38 100644 (file)
@@ -173,7 +173,7 @@ class RevisionTest extends MediaWikiTestCase {
                        Revision::getRevisionText( $row ), "getRevisionText" );
        }
 
-       # =================================================================================================================
+       # =========================================================================
 
        /**
         * @param string $text
@@ -183,7 +183,9 @@ class RevisionTest extends MediaWikiTestCase {
         *
         * @return Revision
         */
-       function newTestRevision( $text, $title = "Test", $model = CONTENT_MODEL_WIKITEXT, $format = null ) {
+       function newTestRevision( $text, $title = "Test",
+               $model = CONTENT_MODEL_WIKITEXT, $format = null
+       ) {
                if ( is_string( $title ) ) {
                        $title = Title::newFromText( $title );
                }
@@ -273,8 +275,22 @@ class RevisionTest extends MediaWikiTestCase {
                //NOTE: we expect the help namespace to always contain wikitext
                return array(
                        array( 'hello world', 'Help:Hello', null, null, Revision::FOR_PUBLIC, 'hello world' ),
-                       array( serialize( 'hello world' ), 'Hello', "testing", null, Revision::FOR_PUBLIC, serialize( 'hello world' ) ),
-                       array( serialize( 'hello world' ), 'Dummy:Hello', null, null, Revision::FOR_PUBLIC, serialize( 'hello world' ) ),
+                       array(
+                               serialize( 'hello world' ),
+                               'Hello',
+                               "testing",
+                               null,
+                               Revision::FOR_PUBLIC,
+                               serialize( 'hello world' )
+                       ),
+                       array(
+                               serialize( 'hello world' ),
+                               'Dummy:Hello',
+                               null,
+                               null,
+                               Revision::FOR_PUBLIC,
+                               serialize( 'hello world' )
+                       ),
                );
        }
 
@@ -283,11 +299,16 @@ class RevisionTest extends MediaWikiTestCase {
         * @dataProvider dataGetContent
         * @covers Revision::getContent
         */
-       public function testGetContent( $text, $title, $model, $format, $audience, $expectedSerialization ) {
+       public function testGetContent( $text, $title, $model, $format,
+               $audience, $expectedSerialization
+       ) {
                $rev = $this->newTestRevision( $text, $title, $model, $format );
                $content = $rev->getContent( $audience );
 
-               $this->assertEquals( $expectedSerialization, is_null( $content ) ? null : $content->serialize( $format ) );
+               $this->assertEquals(
+                       $expectedSerialization,
+                       is_null( $content ) ? null : $content->serialize( $format )
+               );
        }
 
        function dataGetText() {
@@ -345,7 +366,11 @@ class RevisionTest extends MediaWikiTestCase {
        public function dataGetSha1() {
                return array(
                        array( "hello world.", CONTENT_MODEL_WIKITEXT, Revision::base36Sha1( "hello world." ) ),
-                       array( serialize( "hello world." ), "testing", Revision::base36Sha1( serialize( "hello world." ) ) ),
+                       array(
+                               serialize( "hello world." ),
+                               "testing",
+                               Revision::base36Sha1( serialize( "hello world." ) )
+                       ),
                );
        }
 
@@ -420,8 +445,10 @@ class RevisionTest extends MediaWikiTestCase {
                $content->setText( "bar" );
 
                $content2 = $rev->getContent( Revision::RAW );
-               $this->assertNotSame( $content, $content2, "expected a clone" ); // content is mutable, expect clone
-               $this->assertEquals( "foo", $content2->getText() ); // clone should contain the original text
+               // content is mutable, expect clone
+               $this->assertNotSame( $content, $content2, "expected a clone" );
+               // clone should contain the original text
+               $this->assertEquals( "foo", $content2->getText() );
 
                $content2->setText( "bla bla" );
                $this->assertEquals( "bar", $content->getText() ); // clones should be independent
index 7e81fab..758c2e2 100644 (file)
@@ -56,10 +56,12 @@ class TestSample extends MediaWikiLangTestCase {
                );
        }
 
+       // @codingStandardsIgnoreStart Ignore long line warning
        /**
         * @dataProvider provideTitles
-        * See http://www.phpunit.de/manual/3.4/en/appendixes.annotations.html#appendixes.annotations.dataProvider
+        * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.dataProvider
         */
+       // @codingStandardsIgnoreEnd
        public function testCreateBasicListOfTitles( $titleName, $ns, $text ) {
                $title = Title::newFromText( $titleName, $ns );
                $this->assertEquals( $text, "$title", "see if '$titleName' matches '$text'" );
@@ -86,16 +88,18 @@ class TestSample extends MediaWikiLangTestCase {
 
        /**
         * @depends testSetUpMainPageTitleForNextTest
-        * See http://www.phpunit.de/manual/3.4/en/appendixes.annotations.html#appendixes.annotations.depends
+        * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.depends
         */
        public function testCheckMainPageTitleIsConsideredLocal( $title ) {
                $this->assertTrue( $title->isLocal() );
        }
 
+       // @codingStandardsIgnoreStart Ignore long line warning
        /**
         * @expectedException MWException object
-        * See http://www.phpunit.de/manual/3.4/en/appendixes.annotations.html#appendixes.annotations.expectedException
+        * See http://phpunit.de/manual/3.7/en/appendixes.annotations.html#appendixes.annotations.expectedException
         */
+       // @codingStandardsIgnoreEnd
        public function testTitleObjectFromObject() {
                $title = Title::newFromText( Title::newFromText( "test" ) );
                $this->assertEquals( "Test", $title->isLocal() );
index f5551ed..50c1e50 100644 (file)
@@ -84,7 +84,11 @@ class SanitizerTest extends MediaWikiTestCase {
         * @covers Sanitizer::decodeCharReferences
         */
        public function testInvalidNumberedEntities() {
-               $this->assertEquals( UTF8_REPLACEMENT, Sanitizer::decodeCharReferences( "&#88888888888888;" ), 'Invalid numbered entity' );
+               $this->assertEquals(
+                       UTF8_REPLACEMENT,
+                       Sanitizer::decodeCharReferences( "&#88888888888888;" ),
+                       'Invalid numbered entity'
+               );
        }
 
        /**
@@ -180,9 +184,21 @@ class SanitizerTest extends MediaWikiTestCase {
                        array( array( 'foo' => 'bar' ), '    foo   =   bar    ', 'Spaced attribute' ),
                        array( array( 'foo' => 'bar' ), 'foo="bar"', 'Double-quoted attribute' ),
                        array( array( 'foo' => 'bar' ), 'foo=\'bar\'', 'Single-quoted attribute' ),
-                       array( array( 'foo' => 'bar', 'baz' => 'foo' ), 'foo=\'bar\'   baz="foo"', 'Several attributes' ),
-                       array( array( 'foo' => 'bar', 'baz' => 'foo' ), 'foo=\'bar\'   baz="foo"', 'Several attributes' ),
-                       array( array( 'foo' => 'bar', 'baz' => 'foo' ), 'foo=\'bar\'   baz="foo"', 'Several attributes' ),
+                       array(
+                               array( 'foo' => 'bar', 'baz' => 'foo' ),
+                               'foo=\'bar\'   baz="foo"',
+                               'Several attributes'
+                       ),
+                       array(
+                               array( 'foo' => 'bar', 'baz' => 'foo' ),
+                               'foo=\'bar\'   baz="foo"',
+                               'Several attributes'
+                       ),
+                       array(
+                               array( 'foo' => 'bar', 'baz' => 'foo' ),
+                               'foo=\'bar\'   baz="foo"',
+                               'Several attributes'
+                       ),
                        array( array( ':foo' => 'bar' ), ':foo=\'bar\'', 'Leading :' ),
                        array( array( '_foo' => 'bar' ), '_foo=\'bar\'', 'Leading _' ),
                        array( array( 'foo' => 'bar' ), 'Foo=\'bar\'', 'Leading capital' ),
@@ -203,9 +219,21 @@ class SanitizerTest extends MediaWikiTestCase {
                        array( array(), 'foo$=baz', 'Symbols are not allowed' ),
                        array( array(), 'foo@=baz', 'Symbols are not allowed' ),
                        array( array(), 'foo~=baz', 'Symbols are not allowed' ),
-                       array( array( 'foo' => '1[#^`*%w/(' ), 'foo=1[#^`*%w/(', 'All kind of characters are allowed as values' ),
-                       array( array( 'foo' => '1[#^`*%\'w/(' ), 'foo="1[#^`*%\'w/("', 'Double quotes are allowed if quoted by single quotes' ),
-                       array( array( 'foo' => '1[#^`*%"w/(' ), 'foo=\'1[#^`*%"w/(\'', 'Single quotes are allowed if quoted by double quotes' ),
+                       array(
+                               array( 'foo' => '1[#^`*%w/(' ),
+                               'foo=1[#^`*%w/(',
+                               'All kind of characters are allowed as values'
+                       ),
+                       array(
+                               array( 'foo' => '1[#^`*%\'w/(' ),
+                               'foo="1[#^`*%\'w/("',
+                               'Double quotes are allowed if quoted by single quotes'
+                       ),
+                       array(
+                               array( 'foo' => '1[#^`*%"w/(' ),
+                               'foo=\'1[#^`*%"w/(\'',
+                               'Single quotes are allowed if quoted by double quotes'
+                       ),
                        array( array( 'foo' => '&"' ), 'foo=&amp;&quot;', 'Special chars can be provided as entities' ),
                        array( array( 'foo' => '&foobar;' ), 'foo=&foobar;', 'Entity-like items are accepted' ),
                );
@@ -266,15 +294,29 @@ class SanitizerTest extends MediaWikiTestCase {
                                'Remove anything after a comment-start token' ),
                        array( '', "\\2f\\2a unifinished comment'",
                                'Remove anything after a backslash-escaped comment-start token' ),
-                       array( '/* insecure input */', 'filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'asdf.png\',sizingMethod=\'scale\');' ),
-                       array( '/* insecure input */', '-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'asdf.png\',sizingMethod=\'scale\')";' ),
+                       array(
+                               '/* insecure input */',
+                               'filter: progid:DXImageTransform.Microsoft.AlphaImageLoader'
+                                       . '(src=\'asdf.png\',sizingMethod=\'scale\');'
+                       ),
+                       array(
+                               '/* insecure input */',
+                               '-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader'
+                                       . '(src=\'asdf.png\',sizingMethod=\'scale\')";'
+                       ),
                        array( '/* insecure input */', 'width: expression(1+1);' ),
                        array( '/* insecure input */', 'background-image: image(asdf.png);' ),
                        array( '/* insecure input */', 'background-image: -webkit-image(asdf.png);' ),
                        array( '/* insecure input */', 'background-image: -moz-image(asdf.png);' ),
                        array( '/* insecure input */', 'background-image: image-set("asdf.png" 1x, "asdf.png" 2x);' ),
-                       array( '/* insecure input */', 'background-image: -webkit-image-set("asdf.png" 1x, "asdf.png" 2x);' ),
-                       array( '/* insecure input */', 'background-image: -moz-image-set("asdf.png" 1x, "asdf.png" 2x);' ),
+                       array(
+                               '/* insecure input */',
+                               'background-image: -webkit-image-set("asdf.png" 1x, "asdf.png" 2x);'
+                       ),
+                       array(
+                               '/* insecure input */',
+                               'background-image: -moz-image-set("asdf.png" 1x, "asdf.png" 2x);'
+                       ),
                );
        }
 
@@ -284,7 +326,12 @@ class SanitizerTest extends MediaWikiTestCase {
        public static function provideAttributeSupport() {
                /** array( <attributes>, <expected>, <message> ) */
                return array(
-                       array( 'div', ' role="presentation"', ' role="presentation"', 'Support for WAI-ARIA\'s role="presentation".' ),
+                       array(
+                               'div',
+                               ' role="presentation"',
+                               ' role="presentation"',
+                               'Support for WAI-ARIA\'s role="presentation".'
+                       ),
                        array( 'div', ' role="main"', '', "Other WAI-ARIA roles are currently not supported." ),
                );
        }
index 572740f..6547c87 100644 (file)
@@ -323,16 +323,41 @@ class SiteConfigurationTest extends MediaWikiTestCase {
                        'fallback' => 'tag',
                        'params' => 'en wiki enwiki',
                        'global' => array( 'enwiki' => 'enwiki' ) + $GLOBALS['global'],
-                       'merge' => array( 'enwiki' => 'enwiki', 'tag' => 'tag', 'wiki' => 'wiki', 'default' => 'default' ),
+                       'merge' => array(
+                               'enwiki' => 'enwiki',
+                               'tag' => 'tag',
+                               'wiki' => 'wiki',
+                               'default' => 'default'
+                       ),
                );
                $this->assertEquals( $getall, $this->mConf->getAll( 'enwiki' ), 'getAll()' );
 
                $this->mConf->extractAllGlobals( 'enwiki', 'wiki' );
 
-               $this->assertEquals( $getall['simple'], $GLOBALS['simple'], 'extractAllGlobals(): simple setting' );
-               $this->assertEquals( $getall['fallback'], $GLOBALS['fallback'], 'extractAllGlobals(): fallback setting' );
-               $this->assertEquals( $getall['params'], $GLOBALS['params'], 'extractAllGlobals(): parameter replacement' );
-               $this->assertEquals( $getall['global'], $GLOBALS['global'], 'extractAllGlobals(): merging with global' );
-               $this->assertEquals( $getall['merge'], $GLOBALS['merge'], 'extractAllGlobals(): merging setting' );
+               $this->assertEquals(
+                       $getall['simple'],
+                       $GLOBALS['simple'],
+                       'extractAllGlobals(): simple setting'
+               );
+               $this->assertEquals(
+                       $getall['fallback'],
+                       $GLOBALS['fallback'],
+                       'extractAllGlobals(): fallback setting'
+               );
+               $this->assertEquals(
+                       $getall['params'],
+                       $GLOBALS['params'],
+                       'extractAllGlobals(): parameter replacement'
+               );
+               $this->assertEquals(
+                       $getall['global'],
+                       $GLOBALS['global'],
+                       'extractAllGlobals(): merging with global'
+               );
+               $this->assertEquals(
+                       $getall['merge'],
+                       $GLOBALS['merge'],
+                       'extractAllGlobals(): merging setting'
+               );
        }
 }
index 8f54714..baa995d 100644 (file)
@@ -10,7 +10,6 @@
  */
 
 class SkinTemplateTest extends MediaWikiTestCase {
-
        /**
         * @dataProvider makeListItemProvider
         */
@@ -29,7 +28,13 @@ class SkinTemplateTest extends MediaWikiTestCase {
                        array(
                                '<li class="class" title="itemtitle"><a href="url" title="title">text</a></li>',
                                '',
-                               array( 'class' => 'class', 'itemtitle' => 'itemtitle', 'href' => 'url', 'title' => 'title', 'text' => 'text' ),
+                               array(
+                                       'class' => 'class',
+                                       'itemtitle' => 'itemtitle',
+                                       'href' => 'url',
+                                       'title' => 'title',
+                                       'text' => 'text'
+                               ),
                                array(),
                                'Test makteListItem with normal values'
                        )
index 8281073..1a6cfe6 100644 (file)
@@ -233,7 +233,10 @@ class StatusTest extends MediaWikiLangTestCase {
                $status2->error( $message2 );
 
                $status1->merge( $status2 );
-               $this->assertEquals( 2, count( $status1->getWarningsArray() ) + count( $status1->getErrorsArray() ) );
+               $this->assertEquals(
+                       2,
+                       count( $status1->getWarningsArray() ) + count( $status1->getErrorsArray() )
+               );
        }
 
        /**
@@ -249,7 +252,10 @@ class StatusTest extends MediaWikiLangTestCase {
                $status2->value = 'FooValue';
 
                $status1->merge( $status2, true );
-               $this->assertEquals( 2, count( $status1->getWarningsArray() ) + count( $status1->getErrorsArray() ) );
+               $this->assertEquals(
+                       2,
+                       count( $status1->getWarningsArray() ) + count( $status1->getErrorsArray() )
+               );
                $this->assertEquals( 'FooValue', $status1->getValue() );
        }
 
@@ -305,8 +311,9 @@ class StatusTest extends MediaWikiLangTestCase {
         * @dataProvider provideGetWikiTextAndHtml
         * @covers Status::getHtml
         * @todo test long and short context messages generated through this method
-        *       this can not really be done now due to use of $this->getWikiText using wfMessage()->plain()
-        *       It is possible to mock such methods but only if namespaces are used
+        *   this can not really be done now due to use of $this->getWikiText using
+        *   wfMessage()->plain(). It is possible to mock such methods but only if
+        *   namespaces are used.
         */
        public function testGetHtml( Status $status, $wikitext, $html ) {
                $this->assertEquals( $html, $status->getHTML() );
index 7d18206..610a6ac 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 
 /**
- * Wraps the user object, so we can also retain full access to properties like password if we log in via the API
+ * Wraps the user object, so we can also retain full access to properties
+ * like password if we log in via the API.
  */
 class TestUser {
        public $username;
@@ -10,7 +11,9 @@ class TestUser {
        public $groups;
        public $user;
 
-       public function __construct( $username, $realname = 'Real Name', $email = 'sample@example.com', $groups = array() ) {
+       public function __construct( $username, $realname = 'Real Name',
+               $email = 'sample@example.com', $groups = array()
+       ) {
                $this->username = $username;
                $this->realname = $realname;
                $this->email = $email;
index 832316e..e4c7623 100644 (file)
@@ -77,7 +77,10 @@ class TitleArrayFromResultTest extends MediaWikiTestCase {
         * @covers TitleArrayFromResult::count
         */
        public function testCountWithVaryingValues( $numRows ) {
-               $object = $this->getTitleArrayFromResult( $this->getMockResultWrapper( $this->getRowWithTitle(), $numRows ) );
+               $object = $this->getTitleArrayFromResult( $this->getMockResultWrapper(
+                       $this->getRowWithTitle(),
+                       $numRows
+               ) );
                $this->assertEquals( $numRows, $object->count() );
        }
 
index c7cbc7b..ac80a9a 100644 (file)
@@ -228,15 +228,21 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->runGroupPermissions( 'move', array( array( 'movenotallowedfile' ) ) );
 
                $this->setUserPerm( "" );
-               $this->runGroupPermissions( 'move', array( array( 'movenotallowedfile' ), array( 'movenotallowed' ) ) );
+               $this->runGroupPermissions(
+                       'move',
+                       array( array( 'movenotallowedfile' ), array( 'movenotallowed' ) )
+               );
 
                $this->setUser( 'anon' );
                $this->setUserPerm( "move" );
                $this->runGroupPermissions( 'move', array( array( 'movenotallowedfile' ) ) );
 
                $this->setUserPerm( "" );
-               $this->runGroupPermissions( 'move', array( array( 'movenotallowedfile' ), array( 'movenotallowed' ) ),
-                       array( array( 'movenotallowedfile' ), array( 'movenologintext' ) ) );
+               $this->runGroupPermissions(
+                       'move',
+                       array( array( 'movenotallowedfile' ), array( 'movenotallowed' ) ),
+                       array( array( 'movenotallowedfile' ), array( 'movenologintext' ) )
+               );
 
                if ( $this->isWikitextNS( NS_MAIN ) ) {
                        //NOTE: some content models don't allow moving
@@ -293,13 +299,25 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->assertEquals( array(), $res );
 
                $this->setUser( 'anon' );
-               $check = array( 'edit' => array( array( array( 'badaccess-groups', "*, [[$prefix:Users|Users]]", 2 ) ),
-                       array( array( 'badaccess-group0' ) ),
-                       array(), true ),
-                       'protect' => array( array( array( 'badaccess-groups', "[[$prefix:Administrators|Administrators]]", 1 ), array( 'protect-cantedit' ) ),
+               $check = array(
+                       'edit' => array(
+                               array( array( 'badaccess-groups', "*, [[$prefix:Users|Users]]", 2 ) ),
+                               array( array( 'badaccess-group0' ) ),
+                               array(),
+                               true
+                       ),
+                       'protect' => array(
+                               array( array(
+                                       'badaccess-groups',
+                                       "[[$prefix:Administrators|Administrators]]", 1 ),
+                                       array( 'protect-cantedit'
+                               ) ),
                                array( array( 'badaccess-group0' ), array( 'protect-cantedit' ) ),
-                               array( array( 'protect-cantedit' ) ), false ),
-                       '' => array( array(), array(), array(), true ) );
+                               array( array( 'protect-cantedit' ) ),
+                               false
+                       ),
+                       '' => array( array(), array(), array(), true )
+               );
 
                foreach ( array( "edit", "protect", "" ) as $action ) {
                        $this->setUserPerm( null );
@@ -599,8 +617,13 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->setTitle( NS_MAIN, "test page" );
                $this->setUserPerm( array( "edit", "bogus" ) );
 
-               $this->title->mCascadeSources = array( Title::makeTitle( NS_MAIN, "Bogus" ), Title::makeTitle( NS_MAIN, "UnBogus" ) );
-               $this->title->mCascadingRestrictions = array( "bogus" => array( 'bogus', "sysop", "protect", "" ) );
+               $this->title->mCascadeSources = array(
+                       Title::makeTitle( NS_MAIN, "Bogus" ),
+                       Title::makeTitle( NS_MAIN, "UnBogus" )
+               );
+               $this->title->mCascadingRestrictions = array(
+                       "bogus" => array( 'bogus', "sysop", "protect", "" )
+               );
 
                $this->assertEquals( false,
                        $this->title->userCan( 'bogus', $this->user ) );
index e86b556..1c7b662 100644 (file)
@@ -29,9 +29,15 @@ class TitleTest extends MediaWikiTestCase {
                foreach ( range( 1, 255 ) as $num ) {
                        $chr = chr( $num );
                        if ( strpos( "#[]{}<>|", $chr ) !== false || preg_match( "/[\\x00-\\x1f\\x7f]/", $chr ) ) {
-                               $this->assertFalse( (bool)preg_match( "/[$titlechars]/", $chr ), "chr($num) = $chr is not a valid titlechar" );
+                               $this->assertFalse(
+                                       (bool)preg_match( "/[$titlechars]/", $chr ),
+                                       "chr($num) = $chr is not a valid titlechar"
+                               );
                        } else {
-                               $this->assertTrue( (bool)preg_match( "/[$titlechars]/", $chr ), "chr($num) = $chr is a valid titlechar" );
+                               $this->assertTrue(
+                                       (bool)preg_match( "/[$titlechars]/", $chr ),
+                                       "chr($num) = $chr is a valid titlechar"
+                               );
                        }
                }
        }
@@ -75,6 +81,7 @@ class TitleTest extends MediaWikiTestCase {
                        'Foo/.../Sandbox',
                        'Sandbox/...',
                        'A~~',
+                       ':A',
                        // Length is 256 total, but only title part matters
                        'Category:' . str_repeat( 'x', 248 ),
                        str_repeat( 'x', 252 ),
@@ -231,7 +238,11 @@ class TitleTest extends MediaWikiTestCase {
                } else {
                        $par = null;
                }
-               $this->assertEquals( $expectedParam, $par, "Bug 31100 regression check: Title->fixSpecialName() should preserve parameter" );
+               $this->assertEquals(
+                       $expectedParam,
+                       $par,
+                       "Bug 31100 regression check: Title->fixSpecialName() should preserve parameter"
+               );
        }
 
        public static function provideBug31100() {
@@ -332,7 +343,11 @@ class TitleTest extends MediaWikiTestCase {
                        $allowableness = $expected
                                ? " should be allowed"
                                : " should NOT be allowed";
-                       $this->assertEquals( $expected, $errors, "User action '$action' on [[$source]] $allowableness." );
+                       $this->assertEquals(
+                               $expected,
+                               $errors,
+                               "User action '$action' on [[$source]] $allowableness."
+                       );
                } else {
                        $errors = $this->flattenErrorsArray( $errors );
                        foreach ( (array)$expected as $error ) {
@@ -400,7 +415,9 @@ class TitleTest extends MediaWikiTestCase {
         * @dataProvider provideGetPageViewLanguage
         * @covers Title::getPageViewLanguage
         */
-       public function testGetPageViewLanguage( $expected, $titleText, $contLang, $lang, $variant, $msg = '' ) {
+       public function testGetPageViewLanguage( $expected, $titleText, $contLang,
+               $lang, $variant, $msg = ''
+       ) {
                global $wgLanguageCode, $wgContLang, $wgLang, $wgDefaultLanguageVariant, $wgAllowUserJs;
 
                // Setup environnement for this test
index 8d095d6..ea44f36 100644 (file)
@@ -74,7 +74,10 @@ class UserArrayFromResultTest extends MediaWikiTestCase {
         * @covers UserArrayFromResult::count
         */
        public function testCountWithVaryingValues( $numRows ) {
-               $object = $this->getUserArrayFromResult( $this->getMockResultWrapper( $this->getRowWithUsername(), $numRows ) );
+               $object = $this->getUserArrayFromResult( $this->getMockResultWrapper(
+                       $this->getRowWithUsername(),
+                       $numRows
+               ) );
                $this->assertEquals( $numRows, $object->count() );
        }
 
index e6af126..a19d035 100644 (file)
@@ -196,13 +196,21 @@ class UserTest extends MediaWikiTestCase {
                }
 
                $user->clearInstanceCache();
-               $this->assertEquals( 3, $user->getEditCount(), 'After three edits, the user edit count should be 3' );
+               $this->assertEquals(
+                       3,
+                       $user->getEditCount(),
+                       'After three edits, the user edit count should be 3'
+               );
 
                // increase the edit count and clear the cache
                $user->incEditCount();
 
                $user->clearInstanceCache();
-               $this->assertEquals( 4, $user->getEditCount(), 'After increasing the edit count manually, the user edit count should be 4' );
+               $this->assertEquals(
+                       4,
+                       $user->getEditCount(),
+                       'After increasing the edit count manually, the user edit count should be 4'
+               );
        }
 
        /**
index 06ed1fd..45fe3e9 100644 (file)
@@ -317,14 +317,30 @@ class WebRequestTest extends MediaWikiTestCase {
                        array( '', array(), 'Empty Accept-Language header' ),
                        array( 'en', array( 'en' => 1 ), 'One language' ),
                        array( 'en, ar', array( 'en' => 1, 'ar' => 1 ), 'Two languages listed in appearance order.' ),
-                       array( 'zh-cn,zh-tw', array( 'zh-cn' => 1, 'zh-tw' => 1 ), 'Two equally prefered languages, listed in appearance order per rfc3282. Checks c9119' ),
-                       array( 'es, en; q=0.5', array( 'es' => 1, 'en' => '0.5' ), 'Spanish as first language and English and second' ),
+                       array(
+                               'zh-cn,zh-tw',
+                               array( 'zh-cn' => 1, 'zh-tw' => 1 ),
+                               'Two equally prefered languages, listed in appearance order per rfc3282. Checks c9119'
+                       ),
+                       array(
+                               'es, en; q=0.5',
+                               array( 'es' => 1, 'en' => '0.5' ),
+                               'Spanish as first language and English and second'
+                       ),
                        array( 'en; q=0.5, es', array( 'es' => 1, 'en' => '0.5' ), 'Less prefered language first' ),
                        array( 'fr, en; q=0.5, es', array( 'fr' => 1, 'es' => 1, 'en' => '0.5' ), 'Three languages' ),
                        array( 'en; q=0.5, es', array( 'es' => 1, 'en' => '0.5' ), 'Two languages' ),
                        array( 'en, zh;q=0', array( 'en' => 1 ), "It's Chinese to me" ),
-                       array( 'es; q=1, pt;q=0.7, it; q=0.6, de; q=0.1, ru;q=0', array( 'es' => '1', 'pt' => '0.7', 'it' => '0.6', 'de' => '0.1' ), 'Preference for romance languages' ),
-                       array( 'en-gb, en-us; q=1', array( 'en-gb' => 1, 'en-us' => '1' ), 'Two equally prefered English variants' ),
+                       array(
+                               'es; q=1, pt;q=0.7, it; q=0.6, de; q=0.1, ru;q=0',
+                               array( 'es' => '1', 'pt' => '0.7', 'it' => '0.6', 'de' => '0.1' ),
+                               'Preference for Romance languages'
+                       ),
+                       array(
+                               'en-gb, en-us; q=1',
+                               array( 'en-gb' => 1, 'en-us' => '1' ),
+                               'Two equally prefered English variants'
+                       ),
                );
        }
 
index 9470359..37f1975 100644 (file)
@@ -97,9 +97,12 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $page = $this->newPage( "WikiPageTest_testDoEditContent" );
                $title = $page->getTitle();
 
-               $content = ContentHandler::makeContent( "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
+               $content = ContentHandler::makeContent(
+                       "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
                                . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.",
-                       $title, CONTENT_MODEL_WIKITEXT );
+                       $title,
+                       CONTENT_MODEL_WIKITEXT
+               );
 
                $page->doEditContent( $content, "[[testing]] 1" );
 
@@ -125,9 +128,12 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
 
                # ------------------------
-               $content = ContentHandler::makeContent( "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
+               $content = ContentHandler::makeContent(
+                       "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
                                . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.",
-                       $title, CONTENT_MODEL_WIKITEXT );
+                       $title,
+                       CONTENT_MODEL_WIKITEXT
+               );
 
                $page->doEditContent( $content, "testing 2" );
 
@@ -231,9 +237,17 @@ class WikiPageTest extends MediaWikiLangTestCase {
        public function testDoQuickEditContent() {
                global $wgUser;
 
-               $page = $this->createPage( "WikiPageTest_testDoQuickEditContent", "original text", CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       "WikiPageTest_testDoQuickEditContent",
+                       "original text",
+                       CONTENT_MODEL_WIKITEXT
+               );
 
-               $content = ContentHandler::makeContent( "quick text", $page->getTitle(), CONTENT_MODEL_WIKITEXT );
+               $content = ContentHandler::makeContent(
+                       "quick text",
+                       $page->getTitle(),
+                       CONTENT_MODEL_WIKITEXT
+               );
                $page->doQuickEditContent( $content, $wgUser, "testing q" );
 
                # ---------------------
@@ -245,19 +259,38 @@ class WikiPageTest extends MediaWikiLangTestCase {
         * @covers WikiPage::doDeleteArticle
         */
        public function testDoDeleteArticle() {
-               $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       "WikiPageTest_testDoDeleteArticle",
+                       "[[original text]] foo",
+                       CONTENT_MODEL_WIKITEXT
+               );
                $id = $page->getId();
 
                $page->doDeleteArticle( "testing deletion" );
 
-               $this->assertFalse( $page->getTitle()->getArticleID() > 0, "Title object should now have page id 0" );
+               $this->assertFalse(
+                       $page->getTitle()->getArticleID() > 0,
+                       "Title object should now have page id 0"
+               );
                $this->assertFalse( $page->getId() > 0, "WikiPage should now have page id 0" );
-               $this->assertFalse( $page->exists(), "WikiPage::exists should return false after page was deleted" );
-               $this->assertNull( $page->getContent(), "WikiPage::getContent should return null after page was deleted" );
-               $this->assertFalse( $page->getText(), "WikiPage::getText should return false after page was deleted" );
+               $this->assertFalse(
+                       $page->exists(),
+                       "WikiPage::exists should return false after page was deleted"
+               );
+               $this->assertNull(
+                       $page->getContent(),
+                       "WikiPage::getContent should return null after page was deleted"
+               );
+               $this->assertFalse(
+                       $page->getText(),
+                       "WikiPage::getText should return false after page was deleted"
+               );
 
                $t = Title::newFromText( $page->getTitle()->getPrefixedText() );
-               $this->assertFalse( $t->exists(), "Title::exists should return false after page was deleted" );
+               $this->assertFalse(
+                       $t->exists(),
+                       "Title::exists should return false after page was deleted"
+               );
 
                # ------------------------
                $dbr = wfGetDB( DB_SLAVE );
@@ -272,7 +305,11 @@ class WikiPageTest extends MediaWikiLangTestCase {
         * @covers WikiPage::doDeleteUpdates
         */
        public function testDoDeleteUpdates() {
-               $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT );
+               $page = $this->createPage(
+                       "WikiPageTest_testDoDeleteArticle",
+                       "[[original text]] foo",
+                       CONTENT_MODEL_WIKITEXT
+               );
                $id = $page->getId();
 
                $page->doDeleteUpdates( $id );
@@ -366,7 +403,11 @@ class WikiPageTest extends MediaWikiLangTestCase {
                        $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
                }
 
-               $page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT );
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentModel",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
 
                $page = new WikiPage( $page->getTitle() );
                $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModel() );
@@ -382,7 +423,11 @@ class WikiPageTest extends MediaWikiLangTestCase {
                        $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
                }
 
-               $page = $this->createPage( "WikiPageTest_testGetContentHandler", "some text", CONTENT_MODEL_JAVASCRIPT );
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentHandler",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
 
                $page = new WikiPage( $page->getTitle() );
                $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
@@ -440,7 +485,12 @@ class WikiPageTest extends MediaWikiLangTestCase {
        public static function provideGetRedirectTarget() {
                return array(
                        array( 'WikiPageTest_testGetRedirectTarget_1', CONTENT_MODEL_WIKITEXT, "hello world", null ),
-                       array( 'WikiPageTest_testGetRedirectTarget_2', CONTENT_MODEL_WIKITEXT, "#REDIRECT [[hello world]]", "Hello world" ),
+                       array(
+                               'WikiPageTest_testGetRedirectTarget_2',
+                               CONTENT_MODEL_WIKITEXT,
+                               "#REDIRECT [[hello world]]",
+                               "Hello world"
+                       ),
                );
        }
 
@@ -587,7 +637,10 @@ class WikiPageTest extends MediaWikiLangTestCase {
 
                $title = Title::newFromText( $title );
 
-               if ( !$wgContentHandlerUseDB && $model && ContentHandler::getDefaultModelFor( $title ) != $model ) {
+               if ( !$wgContentHandlerUseDB
+                       && $model
+                       && ContentHandler::getDefaultModelFor( $title ) != $model
+               ) {
                        $this->markTestSkipped( "Can not use non-default content model $model for "
                                . $title->getPrefixedDBkey() . " with \$wgContentHandlerUseDB disabled." );
                }
@@ -599,11 +652,21 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $v = $page->isCountable();
                $w = $page->isCountable( $editInfo );
 
-               $this->assertEquals( $expected, $v, "isCountable( null ) returned unexpected value " . var_export( $v, true )
-                       . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
+               $this->assertEquals(
+                       $expected,
+                       $v,
+                       "isCountable( null ) returned unexpected value " . var_export( $v, true )
+                               . " instead of " . var_export( $expected, true )
+                       . " in mode `$mode` for text \"$text\""
+               );
 
-               $this->assertEquals( $expected, $w, "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
-                       . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
+               $this->assertEquals(
+                       $expected,
+                       $w,
+                       "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
+                               . " instead of " . var_export( $expected, true )
+                       . " in mode `$mode` for text \"$text\""
+               );
        }
 
        public static function provideGetParserOutput() {
@@ -661,7 +724,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." );
        }
 
-       static $sections =
+       public static $sections =
 
                "Intro
 
@@ -727,7 +790,9 @@ more stuff
         * @dataProvider dataReplaceSection
         * @covers WikiPage::replaceSection
         */
-       public function testReplaceSection( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
+       public function testReplaceSection( $title, $model, $text, $section, $with,
+               $sectionTitle, $expected
+       ) {
                $this->hideDeprecated( "WikiPage::replaceSection" );
 
                $page = $this->createPage( $title, $text, $model );
@@ -741,7 +806,9 @@ more stuff
         * @dataProvider dataReplaceSection
         * @covers WikiPage::replaceSectionContent
         */
-       public function testReplaceSectionContent( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
+       public function testReplaceSectionContent( $title, $model, $text, $section,
+               $with, $sectionTitle, $expected
+       ) {
                $page = $this->createPage( $title, $text, $model );
 
                $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
@@ -759,23 +826,38 @@ more stuff
        $rev1 = $page->getRevision();
 
        $text .= "\n\ntwo";
-       $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section two");
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section two"
+       );
        $rev2 = $page->getRevision();
 
        $text .= "\n\nthree";
-       $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section three");
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section three"
+       );
        $rev3 = $page->getRevision();
 
        $text .= "\n\nfour";
-       $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section four");
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section four"
+       );
        $rev4 = $page->getRevision();
 
        $text .= "\n\nfive";
-       $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section five");
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section five"
+       );
        $rev5 = $page->getRevision();
 
        $text .= "\n\nsix";
-       $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), "adding section six");
+       $page->doEditContent(
+               ContentHandler::makeContent( $text, $page->getTitle() ),
+               "adding section six"
+       );
        $rev6 = $page->getRevision();
 
        $undo6 = $page->getUndoText( $rev6 );
@@ -793,7 +875,8 @@ more stuff
         */
 
        /**
-        * @todo FIXME: this is a better rollback test than the one below, but it keeps failing in jenkins for some reason.
+        * @todo FIXME: this is a better rollback test than the one below, but it
+        * keeps failing in jenkins for some reason.
         */
        public function broken_testDoRollback() {
                $admin = new User();
@@ -818,8 +901,9 @@ more stuff
                $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
                        "adding section three", 0, false, $user2 );
 
-               # we are having issues with doRollback spuriously failing. apparently the last revision somehow goes missing
-               # or not committed under some circumstances. so, make sure the last revision has the right user name.
+               # we are having issues with doRollback spuriously failing. Apparently
+               # the last revision somehow goes missing or not committed under some
+               # circumstances. So, make sure the last revision has the right user name.
                $dbr = wfGetDB( DB_SLAVE );
                $this->assertEquals( 3, Revision::countByPageId( $dbr, $page->getId() ) );
 
@@ -835,11 +919,22 @@ more stuff
 
                # now, try the actual rollback
                $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
-               $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user2->getName() ), null );
-               $errors = $page->doRollback( $user2->getName(), "testing revert", $token, false, $details, $admin );
+               $token = $admin->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user2->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user2->getName(),
+                       "testing revert",
+                       $token,
+                       false,
+                       $details,
+                       $admin
+               );
 
                if ( $errors ) {
-                       $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
+                       $this->fail( "Rollback failed:\n" . print_r( $errors, true )
+                               . ";\n" . print_r( $details, true ) );
                }
 
                $page = new WikiPage( $page->getTitle() );
@@ -858,24 +953,45 @@ more stuff
 
                $text = "one";
                $page = $this->newPage( "WikiPageTest_testDoRollback" );
-               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "section one", EDIT_NEW, false, $admin );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "section one",
+                       EDIT_NEW,
+                       false,
+                       $admin
+               );
                $rev1 = $page->getRevision();
 
                $user1 = new User();
                $user1->setName( "127.0.1.11" );
                $text .= "\n\ntwo";
                $page = new WikiPage( $page->getTitle() );
-               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "adding section two", 0, false, $user1 );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "adding section two",
+                       0,
+                       false,
+                       $user1
+               );
 
                # now, try the rollback
                $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
-               $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null );
-               $errors = $page->doRollback( $user1->getName(), "testing revert", $token, false, $details, $admin );
+               $token = $admin->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user1->getName(),
+                       "testing revert",
+                       $token,
+                       false,
+                       $details,
+                       $admin
+               );
 
                if ( $errors ) {
-                       $this->fail( "Rollback failed:\n" . print_r( $errors, true ) . ";\n" . print_r( $details, true ) );
+                       $this->fail( "Rollback failed:\n" . print_r( $errors, true )
+                               . ";\n" . print_r( $details, true ) );
                }
 
                $page = new WikiPage( $page->getTitle() );
@@ -894,8 +1010,13 @@ more stuff
 
                $text = "one";
                $page = $this->newPage( "WikiPageTest_testDoRollback" );
-               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "section one", EDIT_NEW, false, $admin );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "section one",
+                       EDIT_NEW,
+                       false,
+                       $admin
+               );
                $rev1 = $page->getRevision();
 
                $user1 = new User();
@@ -903,20 +1024,45 @@ more stuff
                $user1->addGroup( "sysop" ); #XXX: make the test user a sysop...
                $text .= "\n\ntwo";
                $page = new WikiPage( $page->getTitle() );
-               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
-                       "adding section two", 0, false, $user1 );
+               $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                       "adding section two",
+                       0,
+                       false,
+                       $user1
+               );
 
                # now, do a the rollback from the same user was doing the edit before
                $resultDetails = array();
-               $token = $user1->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null );
-               $errors = $page->doRollback( $user1->getName(), "testing revert same user", $token, false, $resultDetails, $admin );
+               $token = $user1->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user1->getName(),
+                       "testing revert same user",
+                       $token,
+                       false,
+                       $resultDetails,
+                       $admin
+               );
 
                $this->assertEquals( array(), $errors, "Rollback failed same user" );
 
                # now, try the rollback
                $resultDetails = array();
-               $token = $admin->getEditToken( array( $page->getTitle()->getPrefixedText(), $user1->getName() ), null );
-               $errors = $page->doRollback( $user1->getName(), "testing revert", $token, false, $resultDetails, $admin );
+               $token = $admin->getEditToken(
+                       array( $page->getTitle()->getPrefixedText(), $user1->getName() ),
+                       null
+               );
+               $errors = $page->doRollback(
+                       $user1->getName(),
+                       "testing revert",
+                       $token,
+                       false,
+                       $resultDetails,
+                       $admin
+               );
 
                $this->assertEquals( array( array( 'alreadyrolled', 'WikiPageTest testDoRollback',
                        '127.0.1.11', 'Admin' ) ), $errors, "Rollback not failed" );
@@ -951,9 +1097,10 @@ more stuff
                        ),
 
                        array(
-                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
-                               labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et
-                               ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
+                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+                               eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+                               voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
+                               clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
                                'Hello world!',
                                0,
                                '/^Replaced .*Hello/'
@@ -1019,11 +1166,15 @@ more stuff
 
                        array(
                                array(
-                                       array( "first edit: "
-                                               . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
-                                               . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. "
-                                               . "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea "
-                                               . "takimata sanctus est Lorem ipsum dolor sit amet.'", null ),
+                                       array(
+                                               "first edit: "
+                                                       . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
+                                                       . " nonumy eirmod tempor invidunt ut labore et dolore magna "
+                                                       . "aliquyam erat, sed diam voluptua. At vero eos et accusam "
+                                                       . "et justo duo dolores et ea rebum. Stet clita kasd gubergren, "
+                                                       . "no sea  takimata sanctus est Lorem ipsum dolor sit amet.'",
+                                               null
+                                       ),
                                ),
                                '/first edit:.*\.\.\."/',
                                false
diff --git a/tests/phpunit/includes/WikiPageTestContentHandlerUseDB.php b/tests/phpunit/includes/WikiPageTestContentHandlerUseDB.php
new file mode 100644 (file)
index 0000000..3db7628
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * @group ContentHandler
+ * @group Database
+ * ^--- important, causes temporary tables to be used instead of the real database
+ */
+class WikiPageTestContentHandlerUseDB extends WikiPageTest {
+
+       protected function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $page_table = $dbw->tableName( 'page' );
+               $revision_table = $dbw->tableName( 'revision' );
+               $archive_table = $dbw->tableName( 'archive' );
+
+               if ( $dbw->fieldExists( $page_table, 'page_content_model' ) ) {
+                       $dbw->query( "alter table $page_table drop column page_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_format" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_model" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_format" );
+               }
+       }
+
+       /**
+        * @covers WikiPage::getContentModel
+        */
+       public function testGetContentModel() {
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentModel",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
+
+               $page = new WikiPage( $page->getTitle() );
+
+               // NOTE: since the content model is not recorded in the database,
+               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
+               $this->assertEquals( CONTENT_MODEL_WIKITEXT, $page->getContentModel() );
+       }
+
+       /**
+        * @covers WikiPage::getContentHandler
+        */
+       public function testGetContentHandler() {
+               $page = $this->createPage(
+                       "WikiPageTest_testGetContentHandler",
+                       "some text",
+                       CONTENT_MODEL_JAVASCRIPT
+               );
+
+               // NOTE: since the content model is not recorded in the database,
+               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( 'WikitextContentHandler', get_class( $page->getContentHandler() ) );
+       }
+}
diff --git a/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php b/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
deleted file mode 100644 (file)
index 2a723e8..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-/**
- * @group ContentHandler
- * @group Database
- * ^--- important, causes temporary tables to be used instead of the real database
- */
-class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
-
-       protected function setUp() {
-               parent::setUp();
-               $this->setMwGlobals( 'wgContentHandlerUseDB', false );
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               $page_table = $dbw->tableName( 'page' );
-               $revision_table = $dbw->tableName( 'revision' );
-               $archive_table = $dbw->tableName( 'archive' );
-
-               if ( $dbw->fieldExists( $page_table, 'page_content_model' ) ) {
-                       $dbw->query( "alter table $page_table drop column page_content_model" );
-                       $dbw->query( "alter table $revision_table drop column rev_content_model" );
-                       $dbw->query( "alter table $revision_table drop column rev_content_format" );
-                       $dbw->query( "alter table $archive_table drop column ar_content_model" );
-                       $dbw->query( "alter table $archive_table drop column ar_content_format" );
-               }
-       }
-
-       /**
-        * @covers WikiPage::getContentModel
-        */
-       public function testGetContentModel() {
-               $page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT );
-
-               $page = new WikiPage( $page->getTitle() );
-
-               // NOTE: since the content model is not recorded in the database,
-               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
-               $this->assertEquals( CONTENT_MODEL_WIKITEXT, $page->getContentModel() );
-       }
-
-       /**
-        * @covers WikiPage::getContentHandler
-        */
-       public function testGetContentHandler() {
-               $page = $this->createPage( "WikiPageTest_testGetContentHandler", "some text", CONTENT_MODEL_JAVASCRIPT );
-
-               // NOTE: since the content model is not recorded in the database,
-               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( 'WikitextContentHandler', get_class( $page->getContentHandler() ) );
-       }
-}
index 56d28b5..9f154bb 100644 (file)
@@ -72,7 +72,10 @@ class XmlSelectTest extends MediaWikiTestCase {
         */
        public function testAddOption() {
                $this->select->addOption( 'foo' );
-               $this->assertEquals( '<select><option value="foo">foo</option></select>', $this->select->getHTML() );
+               $this->assertEquals(
+                       '<select><option value="foo">foo</option></select>',
+                       $this->select->getHTML()
+               );
        }
 
        /**
@@ -80,7 +83,10 @@ class XmlSelectTest extends MediaWikiTestCase {
         */
        public function testAddOptionWithDefault() {
                $this->select->addOption( 'foo', true );
-               $this->assertEquals( '<select><option value="1">foo</option></select>', $this->select->getHTML() );
+               $this->assertEquals(
+                       '<select><option value="1">foo</option></select>',
+                       $this->select->getHTML()
+               );
        }
 
        /**
@@ -88,7 +94,10 @@ class XmlSelectTest extends MediaWikiTestCase {
         */
        public function testAddOptionWithFalse() {
                $this->select->addOption( 'foo', false );
-               $this->assertEquals( '<select><option value="foo">foo</option></select>', $this->select->getHTML() );
+               $this->assertEquals(
+                       '<select><option value="foo">foo</option></select>',
+                       $this->select->getHTML()
+               );
        }
 
        /**
@@ -96,7 +105,10 @@ class XmlSelectTest extends MediaWikiTestCase {
         */
        public function testAddOptionWithValueZero() {
                $this->select->addOption( 'foo', 0 );
-               $this->assertEquals( '<select><option value="0">foo</option></select>', $this->select->getHTML() );
+               $this->assertEquals(
+                       '<select><option value="0">foo</option></select>',
+                       $this->select->getHTML()
+               );
        }
 
        /**
index 86b4c35..382e3d8 100644 (file)
@@ -151,7 +151,11 @@ class XmlTest extends MediaWikiTestCase {
                }
 
                $this->assertEquals(
-                       '<label for="year">From year (and earlier):</label> <input id="year" maxlength="4" size="7" type="number" value="2011" name="year" /> <label for="month">From month (and earlier):</label> <select id="month" name="month" class="mw-month-selector"><option value="-1">all</option>' . "\n" .
+                       '<label for="year">From year (and earlier):</label> ' .
+                               '<input id="year" maxlength="4" size="7" type="number" value="2011" name="year" /> ' .
+                               '<label for="month">From month (and earlier):</label> ' .
+                               '<select id="month" name="month" class="mw-month-selector">' .
+                               '<option value="-1">all</option>' . "\n" .
                                '<option value="1">January</option>' . "\n" .
                                '<option value="2" selected="">February</option>' . "\n" .
                                '<option value="3">March</option>' . "\n" .
@@ -168,7 +172,11 @@ class XmlTest extends MediaWikiTestCase {
                        "Date menu for february 2011"
                );
                $this->assertEquals(
-                       '<label for="year">From year (and earlier):</label> <input id="year" maxlength="4" size="7" type="number" value="2011" name="year" /> <label for="month">From month (and earlier):</label> <select id="month" name="month" class="mw-month-selector"><option value="-1">all</option>' . "\n" .
+                       '<label for="year">From year (and earlier):</label> ' .
+                               '<input id="year" maxlength="4" size="7" type="number" value="2011" name="year" /> ' .
+                               '<label for="month">From month (and earlier):</label> ' .
+                               '<select id="month" name="month" class="mw-month-selector">' .
+                               '<option value="-1">all</option>' . "\n" .
                                '<option value="1">January</option>' . "\n" .
                                '<option value="2">February</option>' . "\n" .
                                '<option value="3">March</option>' . "\n" .
@@ -198,7 +206,11 @@ class XmlTest extends MediaWikiTestCase {
                );
 
                $this->assertEquals(
-                       '<label for="year">From year (and earlier):</label> <input id="year" maxlength="4" size="7" type="number" name="year" /> <label for="month">From month (and earlier):</label> <select id="month" name="month" class="mw-month-selector"><option value="-1">all</option>' . "\n" .
+                       '<label for="year">From year (and earlier):</label> ' .
+                               '<input id="year" maxlength="4" size="7" type="number" name="year" /> ' .
+                               '<label for="month">From month (and earlier):</label> ' .
+                               '<select id="month" name="month" class="mw-month-selector">' .
+                               '<option value="-1">all</option>' . "\n" .
                                '<option value="1">January</option>' . "\n" .
                                '<option value="2">February</option>' . "\n" .
                                '<option value="3">March</option>' . "\n" .
index f1199e0..67a75f3 100644 (file)
@@ -107,7 +107,8 @@ class ApiLoginTest extends ApiTestCase {
         * @group Broken
         */
        public function testApiLoginGotCookie() {
-               $this->markTestIncomplete( "The server can't do external HTTP requests, and the internal one won't give cookies" );
+               $this->markTestIncomplete( "The server can't do external HTTP requests, "
+                       . "and the internal one won't give cookies" );
 
                global $wgServer, $wgScriptPath;
 
@@ -147,7 +148,10 @@ class ApiLoginTest extends ApiTestCase {
                $this->assertNotEquals( false, $serverName );
                $serializedCookie = $cj->serializeToHttpRequest( $wgScriptPath, $serverName );
                $this->assertNotEquals( '', $serializedCookie );
-               $this->assertRegexp( '/_session=[^;]*; .*UserID=[0-9]*; .*UserName=' . $user->userName . '; .*Token=/', $serializedCookie );
+               $this->assertRegexp(
+                       '/_session=[^;]*; .*UserID=[0-9]*; .*UserName=' . $user->userName . '; .*Token=/',
+                       $serializedCookie
+               );
        }
 
        public function testRunLogin() {
index 15bd8bb..e031ce3 100644 (file)
@@ -318,7 +318,9 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->mUserMock->expects( $this->once() )
                        ->method( 'saveSettings' );
 
-               $request = $this->getSampleRequest( array( 'change' => 'willBeNull|willBeEmpty=|willBeHappy=Happy' ) );
+               $request = $this->getSampleRequest( array(
+                       'change' => 'willBeNull|willBeEmpty=|willBeHappy=Happy'
+               ) );
 
                $response = $this->executeQuery( $request );
 
@@ -382,7 +384,8 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        ->method( 'saveSettings' );
 
                $request = $this->getSampleRequest( array(
-                       'change' => 'testmultiselect-opt1=1|testmultiselect-opt2|testmultiselect-opt3=|testmultiselect-opt4=0'
+                       'change' => 'testmultiselect-opt1=1|testmultiselect-opt2|'
+                               . 'testmultiselect-opt3=|testmultiselect-opt4=0'
                ) );
 
                $response = $this->executeQuery( $request );
index d303d4b..d038a4f 100644 (file)
@@ -24,8 +24,12 @@ class ApiParseTest extends ApiTestCase {
 
                        $this->fail( "API did not return an error when parsing a nonexistent page" );
                } catch ( UsageException $ex ) {
-                       $this->assertEquals( 'missingtitle', $ex->getCodeString(),
-                               "Parse request for nonexistent page must give 'missingtitle' error: " . var_export( $ex->getMessageArray(), true ) );
+                       $this->assertEquals(
+                               'missingtitle',
+                               $ex->getCodeString(),
+                               "Parse request for nonexistent page must give 'missingtitle' error: "
+                                       . var_export( $ex->getMessageArray(), true )
+                       );
                }
        }
 }
index d25a4c1..7fce134 100644 (file)
@@ -31,8 +31,11 @@ class ApiPurgeTest extends ApiTestCase {
                $this->assertArrayHasKey( 'purge', $data[0],
                        "Must receive a 'purge' result from API" );
 
-               $this->assertEquals( 3, count( $data[0]['purge'] ),
-                       "Purge request for three articles should give back three results received: " . var_export( $data[0]['purge'], true ) );
+               $this->assertEquals(
+                       3,
+                       count( $data[0]['purge'] ),
+                       "Purge request for three articles should give back three results received: "
+                               . var_export( $data[0]['purge'], true ) );
 
                $pages = array( 'UTPage' => 'purged', $somePage => 'missing', '%5D' => 'invalid' );
                foreach ( $data[0]['purge'] as $v ) {
index 843c88d..87ad2cd 100644 (file)
@@ -72,7 +72,9 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
         *
         * @return array
         */
-       protected function doApiRequest( array $params, array $session = null, $appendModule = false, User $user = null ) {
+       protected function doApiRequest( array $params, array $session = null,
+               $appendModule = false, User $user = null
+       ) {
                global $wgRequest, $wgUser;
 
                if ( is_null( $session ) ) {
@@ -112,15 +114,19 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
 
        /**
         * Add an edit token to the API request
-        * This is cheating a bit -- we grab a token in the correct format and then add it to the pseudo-session and to the
-        * request, without actually requesting a "real" edit token
+        * This is cheating a bit -- we grab a token in the correct format and then
+        * add it to the pseudo-session and to the request, without actually
+        * requesting a "real" edit token.
+        *
         * @param array $params Key-value API params
         * @param array|null $session session array
         * @param User|null $user A User object for the context
         * @return mixed Result of the API call
         * @throws Exception in case wsToken is not set in the session
         */
-       protected function doApiRequestWithToken( array $params, array $session = null, User $user = null ) {
+       protected function doApiRequestWithToken( array $params, array $session = null,
+               User $user = null
+       ) {
                global $wgRequest;
 
                if ( $session === null ) {
index 42f02fa..40407dc 100644 (file)
@@ -40,10 +40,18 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
                        $noOldArchive = ""; // yes this really needs to be set this way
                        $comment = "removing for test";
                        $restrictDeletedVersions = false;
-                       $status = FileDeleteForm::doDelete( $title, $file, $noOldArchive, $comment, $restrictDeletedVersions );
+                       $status = FileDeleteForm::doDelete(
+                               $title,
+                               $file,
+                               $noOldArchive,
+                               $comment,
+                               $restrictDeletedVersions
+                       );
+
                        if ( !$status->isGood() ) {
                                return false;
                        }
+
                        $page = WikiPage::factory( $title );
                        $page->doDeleteArticle( "removing for test" );
 
@@ -66,7 +74,8 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
        }
 
        /**
-        * Helper function -- given a file on the filesystem, find matching content in the db (and associated articles) and remove them.
+        * Helper function -- given a file on the filesystem, find matching
+        * content in the db (and associated articles) and remove them.
         *
         * @param string $filePath path to file on the filesystem
         *
index ba7fb25..8ea761f 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /**
  * @group API
  * @group Database
  * user that will run tests.
  */
 
-// Note for reviewers: this intentionally duplicates functionality already in "ApiSetup" and so on.
-// This framework works better IMO and has less strangeness (such as test cases inheriting from "ApiSetup"...)
-// (and in the case of the other Upload tests, this flat out just actually works... )
+// Note for reviewers: this intentionally duplicates functionality already in
+// "ApiSetup" and so on. This framework works better IMO and has less
+// strangeness (such as test cases inheriting from "ApiSetup"...) (and in the
+// case of the other Upload tests, this flat out just actually works... )
 
-// TODO: port the other Upload tests, and other API tests to this framework
+// @todo Port the other Upload tests, and other API tests to this framework
 
 require_once 'ApiTestCaseUpload.php';
 
@@ -427,14 +427,16 @@ class ApiUploadTest extends ApiTestCaseUpload {
         */
        public function testUploadChunks( $session ) {
                $this->setMwGlobals( array(
-                       'wgUser' => self::$users['uploader']->user, // @todo FIXME: still used somewhere
+                       // @todo FIXME: still used somewhere
+                       'wgUser' => self::$users['uploader']->user,
                ) );
 
                $chunkSize = 1048576;
                // Download a large image file
                // ( using RandomImageGenerator for large files is not stable )
                $mimeType = 'image/jpeg';
-               $url = 'http://upload.wikimedia.org/wikipedia/commons/e/ed/Oberaargletscher_from_Oberaar%2C_2010_07.JPG';
+               $url = 'http://upload.wikimedia.org/wikipedia/commons/'
+                       . 'e/ed/Oberaargletscher_from_Oberaar%2C_2010_07.JPG';
                $filePath = wfTempDir() . '/Oberaargletscher_from_Oberaar.jpg';
                try {
                        // Only download if the file is not avaliable in the temp location:
@@ -464,13 +466,19 @@ class ApiUploadTest extends ApiTestCaseUpload {
                $chunkSessionKey = false;
                $resultOffset = 0;
                // Open the file:
-               $handle = @fopen( $filePath, "r" );
+               wfSuppressWarnings();
+               $handle = fopen( $filePath, "r" );
+               wfRestoreWarnings();
+
                if ( $handle === false ) {
                        $this->markTestIncomplete( "could not open file: $filePath" );
                }
+
                while ( !feof( $handle ) ) {
                        // Get the current chunk
-                       $chunkData = @fread( $handle, $chunkSize );
+                       wfSuppressWarnings();
+                       $chunkData = fread( $handle, $chunkSize );
+                       wfRestoreWarnings();
 
                        // Upload the current chunk into the $_FILE object:
                        $this->fakeUploadChunk( 'chunk', 'blob', $mimeType, $chunkData );
@@ -500,7 +508,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
                        }
                        // Filekey set to chunk session
                        $params['filekey'] = $chunkSessionKey;
-                       // Update the offset ( always add chunkSize for subquent chunks should be in-sync with $result['upload']['offset'] )
+                       // Update the offset ( always add chunkSize for subquent chunks
+                       // should be in-sync with $result['upload']['offset'] )
                        $params['offset'] += $chunkSize;
                        // Make sure param offset is insync with resultOffset:
                        $this->assertEquals( $resultOffset, $params['offset'] );
@@ -528,7 +537,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
                fclose( $handle );
 
                // Check that we got a valid file result:
-               wfDebug( __METHOD__ . " hohoh filesize {$fileSize} info {$result['upload']['imageinfo']['size']}\n\n" );
+               wfDebug( __METHOD__
+                       . " hohoh filesize {$fileSize} info {$result['upload']['imageinfo']['size']}\n\n" );
                $this->assertEquals( $fileSize, $result['upload']['imageinfo']['size'] );
                $this->assertEquals( $mimeType, $result['upload']['imageinfo']['mime'] );
                $this->assertTrue( isset( $result['upload']['filekey'] ) );
index 877e353..e3eea4c 100644 (file)
@@ -1,20 +1,23 @@
 <?php
-
 /**
  * RandomImageGenerator -- does what it says on the tin.
- * Requires Imagick, the ImageMagick library for PHP, or the command line equivalent (usually 'convert').
+ * Requires Imagick, the ImageMagick library for PHP, or the command line
+ * equivalent (usually 'convert').
  *
- * Because MediaWiki tests the uniqueness of media upload content, and filenames, it is sometimes useful to generate
- * files that are guaranteed (or at least very likely) to be unique in both those ways.
- * This generates a number of filenames with random names and random content (colored triangles)
+ * Because MediaWiki tests the uniqueness of media upload content, and
+ * filenames, it is sometimes useful to generate files that are guaranteed (or
+ * at least very likely) to be unique in both those ways. This generates a
+ * number of filenames with random names and random content (colored triangles).
  *
- * It is also useful to have fresh content because our tests currently run in a "destructive" mode, and don't create a fresh new wiki for each
- * test run.
- * Consequently, if we just had a few static files we kept re-uploading, we'd get lots of warnings about matching content or filenames,
- * and even if we deleted those files, we'd get warnings about archived files.
+ * It is also useful to have fresh content because our tests currently run in a
+ * "destructive" mode, and don't create a fresh new wiki for each test run.
+ * Consequently, if we just had a few static files we kept re-uploading, we'd
+ * get lots of warnings about matching content or filenames, and even if we
+ * deleted those files, we'd get warnings about archived files.
  *
- * This can also be used with a cronjob to generate random files all the time -- I use it to have a constant, never ending supply when I'm
- * testing interactively.
+ * This can also be used with a cronjob to generate random files all the time.
+ * I use it to have a constant, never ending supply when I'm testing
+ * interactively.
  *
  * @file
  * @author Neil Kandalgaonkar <neilk@wikimedia.org>
@@ -25,7 +28,6 @@
  * Can fetch a random image, or also write a number of them to disk with random filenames.
  */
 class RandomImageGenerator {
-
        private $dictionaryFile;
        private $minWidth = 400;
        private $maxWidth = 800;
@@ -34,10 +36,11 @@ class RandomImageGenerator {
        private $shapesToDraw = 5;
 
        /**
-        * Orientations: 0th row, 0th column, Exif orientation code, rotation 2x2 matrix that is opposite of orientation
-        * n.b. we do not handle the 'flipped' orientations, which is why there is no entry for 2, 4, 5, or 7. Those
-        * seem to be rare in real images anyway
-        * (we also would need a non-symmetric shape for the images to test those, like a letter F)
+        * Orientations: 0th row, 0th column, Exif orientation code, rotation 2x2
+        * matrix that is opposite of orientation. N.b. we do not handle the
+        * 'flipped' orientations, which is why there is no entry for 2, 4, 5, or 7.
+        * Those seem to be rare in real images anyway (we also would need a
+        * non-symmetric shape for the images to test those, like a letter F).
         */
        private static $orientations = array(
                array(
@@ -67,7 +70,9 @@ class RandomImageGenerator {
        );
 
        public function __construct( $options = array() ) {
-               foreach ( array( 'dictionaryFile', 'minWidth', 'minHeight', 'maxWidth', 'maxHeight', 'shapesToDraw' ) as $property ) {
+               foreach ( array( 'dictionaryFile', 'minWidth', 'minHeight',
+                       'maxWidth', 'maxHeight', 'shapesToDraw' ) as $property
+               ) {
                        if ( isset( $options[$property] ) ) {
                                $this->$property = $options[$property];
                        }
@@ -89,12 +94,14 @@ class RandomImageGenerator {
                        }
                }
                if ( !isset( $this->dictionaryFile ) ) {
-                       throw new Exception( "RandomImageGenerator: dictionary file not found or not specified properly" );
+                       throw new Exception( "RandomImageGenerator: dictionary file not "
+                               . "found or not specified properly" );
                }
        }
 
        /**
-        * Writes random images with random filenames to disk in the directory you specify, or current working directory
+        * Writes random images with random filenames to disk in the directory you
+        * specify, or current working directory.
         *
         * @param int $number Number of filenames to write
         * @param string $format Optional, must be understood by ImageMagick, such as 'jpg' or 'gif'
@@ -128,11 +135,15 @@ class RandomImageGenerator {
                        global $wgExiv2Command;
                        if ( class_exists( 'Imagick' ) && $wgExiv2Command && is_executable( $wgExiv2Command ) ) {
                                return 'writeImageWithApi';
-                       } elseif ( $wgUseImageMagick && $wgImageMagickConvertCommand && is_executable( $wgImageMagickConvertCommand ) ) {
+                       } elseif ( $wgUseImageMagick
+                               && $wgImageMagickConvertCommand
+                               && is_executable( $wgImageMagickConvertCommand )
+                       ) {
                                return 'writeImageWithCommandLine';
                        }
                }
-               throw new Exception( "RandomImageGenerator: could not find a suitable method to write images in '$format' format" );
+               throw new Exception( "RandomImageGenerator: could not find a suitable "
+                       . "method to write images in '$format' format" );
        }
 
        /**
@@ -163,9 +174,11 @@ class RandomImageGenerator {
 
        /**
         * Generate data representing an image of random size (within limits),
-        * consisting of randomly colored and sized upward pointing triangles against a random background color
-        * (This data is used in the writeImage* methods).
-        * @return {Mixed}
+        * consisting of randomly colored and sized upward pointing triangles
+        * against a random background color. (This data is used in the
+        * writeImage* methods).
+        *
+        * @return mixed
         */
        public function getImageSpec() {
                $spec = array();
@@ -264,8 +277,10 @@ class RandomImageGenerator {
 
                $image = new Imagick();
                /**
-                * If the format is 'jpg', will also add a random orientation -- the image will be drawn rotated with triangle points
-                * facing in some direction (0, 90, 180 or 270 degrees) and a countering rotation should turn the triangle points upward again
+                * If the format is 'jpg', will also add a random orientation -- the
+                * image will be drawn rotated with triangle points facing in some
+                * direction (0, 90, 180 or 270 degrees) and a countering rotation
+                * should turn the triangle points upward again.
                 */
                $orientation = self::$orientations[0]; // default is normal orientation
                if ( $format == 'jpg' ) {
@@ -289,8 +304,10 @@ class RandomImageGenerator {
 
                $image->writeImage( $filename );
 
-               // because the above setImageOrientation call doesn't work... nor can I get an external imagemagick binary to do this either...
-               // hacking this for now (only works if you have exiv2 installed, a program to read and manipulate exif)
+               // because the above setImageOrientation call doesn't work... nor can I
+               // get an external imagemagick binary to do this either... Hacking this
+               // for now (only works if you have exiv2 installed, a program to read
+               // and manipulate exif).
                if ( $wgExiv2Command ) {
                        $cmd = wfEscapeShellArg( $wgExiv2Command )
                                . " -M "
@@ -360,7 +377,8 @@ class RandomImageGenerator {
        }
 
        /**
-        * Based on an image specification, write such an image to disk, using the command line ImageMagick program ('convert').
+        * Based on an image specification, write such an image to disk, using the
+        * command line ImageMagick program ('convert').
         *
         * Sample command line:
         *  $ convert -size 100x60 xc:rgb(90,87,45) \
@@ -369,8 +387,8 @@ class RandomImageGenerator {
         *   -draw 'fill rgb(240,12,32)  circle 50,21 50,3'  filename.png
         *
         * @param array $spec Spec describing background and shapes to draw
-        * @param string $format File format to write (unused by this method but kept so it has the same signature as
-        * writeImageWithApi)
+        * @param string $format File format to write (unused by this method but
+        *   kept so it has the same signature as writeImageWithApi).
         * @param string $filename Filename to write to
         *
         * @return bool
@@ -410,7 +428,8 @@ class RandomImageGenerator {
        }
 
        /**
-        * Get an array of random pairs of random words, like array( array( 'foo', 'bar' ), array( 'quux', 'baz' ) );
+        * Get an array of random pairs of random words, like
+        * array( array( 'foo', 'bar' ), array( 'quux', 'baz' ) );
         *
         * @param int $number Number of pairs
         * @return array two-element arrays
@@ -447,8 +466,9 @@ class RandomImageGenerator {
                }
 
                /*
-                * This algorithm obtains N random lines from a file in one single pass. It does this by replacing elements of
-                * a fixed-size array of lines, less and less frequently as it reads the file.
+                * This algorithm obtains N random lines from a file in one single pass.
+                * It does this by replacing elements of a fixed-size array of lines,
+                * less and less frequently as it reads the file.
                 */
                $fh = fopen( $filepath, "r" );
                if ( !$fh ) {
index f1b773a..d8765ee 100644 (file)
@@ -173,7 +173,11 @@ abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
         * @param bool $numericIds If true, treat keys as ids to be merged instead of appending
         */
        protected function mergeResult( &$results, $newResult, $numericIds = false ) {
-               $this->assertEquals( is_array( $results ), is_array( $newResult ), 'Type of result and data do not match' );
+               $this->assertEquals(
+                       is_array( $results ),
+                       is_array( $newResult ),
+                       'Type of result and data do not match'
+               );
                if ( !is_array( $results ) ) {
                        $this->assertEquals( $results, $newResult, 'Repeated result must be the same as before' );
                } else {
index 49feec1..d47cafe 100644 (file)
@@ -359,7 +359,6 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
                        'rc_title' => $title,
                        'rc_namespace' => 0,
                        'rc_timestamp' => $timestamp,
-                       'rc_cur_time' => $timestamp,
                        'rc_old_len' => 212,
                        'rc_new_len' => 188,
                        'rc_comment' => '',
index 59b8d20..3f887dc 100644 (file)
@@ -59,7 +59,9 @@ class ComposerVersionNormalizerTest extends PHPUnit_Framework_TestCase {
        /**
         * @dataProvider complexVersionProvider
         */
-       public function testGivenComplexVersionWithoutDash_normalizeSuffixAddsDash( $withoutDash, $withDash ) {
+       public function testGivenComplexVersionWithoutDash_normalizeSuffixAddsDash(
+               $withoutDash, $withDash
+       ) {
                $normalizer = new ComposerVersionNormalizer();
 
                $this->assertEquals(
@@ -83,7 +85,9 @@ class ComposerVersionNormalizerTest extends PHPUnit_Framework_TestCase {
        /**
         * @dataProvider complexVersionProvider
         */
-       public function testGivenComplexVersionWithDash_normalizeSuffixReturnsAsIs( $withoutDash, $withDash ) {
+       public function testGivenComplexVersionWithDash_normalizeSuffixReturnsAsIs(
+               $withoutDash, $withDash
+       ) {
                $this->assertRemainsUnchanged( $withDash );
        }
 
@@ -114,7 +118,9 @@ class ComposerVersionNormalizerTest extends PHPUnit_Framework_TestCase {
        /**
         * @dataProvider levelNormalizationProvider
         */
-       public function testGivenFewerLevels_levelCountNormalizationEnsuresFourLevels( $expected, $version ) {
+       public function testGivenFewerLevels_levelCountNormalizationEnsuresFourLevels(
+               $expected, $version
+       ) {
                $normalizer = new ComposerVersionNormalizer();
 
                $this->assertEquals(
index f21aad8..ecfcfa3 100644 (file)
@@ -4,9 +4,9 @@
  * @group ContentHandler
  * @group Database
  *
- * @note Declare that we are using the database, because otherwise we'll fail in the "databaseless" test run.
- * This is because the LinkHolderArray used by the parser needs database access.
- *
+ * @note Declare that we are using the database, because otherwise we'll fail in
+ * the "databaseless" test run. This is because the LinkHolderArray used by the
+ * parser needs database access.
  */
 class ContentHandlerTest extends MediaWikiTestCase {
 
@@ -238,13 +238,45 @@ class ContentHandlerTest extends MediaWikiTestCase {
                        array( 'hallo', 'MediaWiki:Test.js', null, null, CONTENT_MODEL_JAVASCRIPT, 'hallo', false ),
                        array( serialize( 'hallo' ), 'Dummy:Test', null, null, "testing", 'hallo', false ),
 
-                       array( 'hallo', 'Help:Test', null, CONTENT_FORMAT_WIKITEXT, CONTENT_MODEL_WIKITEXT, 'hallo', false ),
-                       array( 'hallo', 'MediaWiki:Test.js', null, CONTENT_FORMAT_JAVASCRIPT, CONTENT_MODEL_JAVASCRIPT, 'hallo', false ),
+                       array(
+                               'hallo',
+                               'Help:Test',
+                               null,
+                               CONTENT_FORMAT_WIKITEXT,
+                               CONTENT_MODEL_WIKITEXT,
+                               'hallo',
+                               false
+                       ),
+                       array(
+                               'hallo',
+                               'MediaWiki:Test.js',
+                               null,
+                               CONTENT_FORMAT_JAVASCRIPT,
+                               CONTENT_MODEL_JAVASCRIPT,
+                               'hallo',
+                               false
+                       ),
                        array( serialize( 'hallo' ), 'Dummy:Test', null, "testing", "testing", 'hallo', false ),
 
                        array( 'hallo', 'Help:Test', CONTENT_MODEL_CSS, null, CONTENT_MODEL_CSS, 'hallo', false ),
-                       array( 'hallo', 'MediaWiki:Test.js', CONTENT_MODEL_CSS, null, CONTENT_MODEL_CSS, 'hallo', false ),
-                       array( serialize( 'hallo' ), 'Dummy:Test', CONTENT_MODEL_CSS, null, CONTENT_MODEL_CSS, serialize( 'hallo' ), false ),
+                       array(
+                               'hallo',
+                               'MediaWiki:Test.js',
+                               CONTENT_MODEL_CSS,
+                               null,
+                               CONTENT_MODEL_CSS,
+                               'hallo',
+                               false
+                       ),
+                       array(
+                               serialize( 'hallo' ),
+                               'Dummy:Test',
+                               CONTENT_MODEL_CSS,
+                               null,
+                               CONTENT_MODEL_CSS,
+                               serialize( 'hallo' ),
+                               false
+                       ),
 
                        array( 'hallo', 'Help:Test', CONTENT_MODEL_WIKITEXT, "testing", null, null, true ),
                        array( 'hallo', 'MediaWiki:Test.js', CONTENT_MODEL_CSS, "testing", null, null, true ),
@@ -256,7 +288,9 @@ class ContentHandlerTest extends MediaWikiTestCase {
         * @dataProvider dataMakeContent
         * @covers ContentHandler::makeContent
         */
-       public function testMakeContent( $data, $title, $modelId, $format, $expectedModelId, $expectedNativeData, $shouldFail ) {
+       public function testMakeContent( $data, $title, $modelId, $format,
+               $expectedModelId, $expectedNativeData, $shouldFail
+       ) {
                $title = Title::newFromText( $title );
 
                try {
@@ -291,7 +325,11 @@ class ContentHandlerTest extends MediaWikiTestCase {
                Hooks::register( 'testRunLegacyHooks', __CLASS__ . '::dummyHookHandler' );
 
                $content = new WikitextContent( 'test text' );
-               $ok = ContentHandler::runLegacyHooks( 'testRunLegacyHooks', array( 'foo', &$content, 'bar' ), false );
+               $ok = ContentHandler::runLegacyHooks(
+                       'testRunLegacyHooks',
+                       array( 'foo', &$content, 'bar' ),
+                       false
+               );
 
                $this->assertTrue( $ok, "runLegacyHooks should have returned true" );
                $this->assertEquals( "TEST TEXT", $content->getNativeData() );
@@ -362,8 +400,9 @@ class DummyContentForTesting extends AbstractContent {
        }
 
        /**
-        * @return string A string representing the content in a way useful for building a full text search index.
-        *   If no useful representation exists, this method returns an empty string.
+        * @return string A string representing the content in a way useful for
+        *   building a full text search index. If no useful representation exists,
+        *   this method returns an empty string.
         */
        public function getTextForSearchIndex() {
                return '';
@@ -378,7 +417,8 @@ class DummyContentForTesting extends AbstractContent {
        }
 
        /**
-        * Returns a textual representation of the content suitable for use in edit summaries and log messages.
+        * Returns a textual representation of the content suitable for use in edit
+        * summaries and log messages.
         *
         * @param int $maxlength Maximum length of the summary text.
         * @return string The summary text.
@@ -429,8 +469,8 @@ class DummyContentForTesting extends AbstractContent {
         * Returns true if this content is countable as a "real" wiki page, provided
         * that it's also in a countable location (e.g. a current revision in the main namespace).
         *
-        * @param bool $hasLinks if it is known whether this content contains links, provide this information here,
-        *  to avoid redundant parsing to find out.
+        * @param bool $hasLinks if it is known whether this content contains links,
+        * provide this information here, to avoid redundant parsing to find out.
         * @return bool
         */
        public function isCountable( $hasLinks = null ) {
@@ -446,7 +486,9 @@ class DummyContentForTesting extends AbstractContent {
         *
         * @return ParserOutput
         */
-       public function getParserOutput( Title $title, $revId = null, ParserOptions $options = null, $generateHtml = true ) {
+       public function getParserOutput( Title $title, $revId = null,
+               ParserOptions $options = null, $generateHtml = true
+       ) {
                return new ParserOutput( $this->getNativeData() );
        }
 }
index c8616ff..7193ec9 100644 (file)
@@ -243,7 +243,10 @@ class JavaScriptContentTest extends TextContentTest {
                $mw = MagicWord::get( "staticredirect" );
 
                $content = $this->newContent( "#REDIRECT [[FOO]]\n__STATICREDIRECT__" );
-               $this->assertFalse( $content->matchMagicWord( $mw ), "should not have matched magic word, since it's not wikitext" );
+               $this->assertFalse(
+                       $content->matchMagicWord( $mw ),
+                       "should not have matched magic word, since it's not wikitext"
+               );
        }
 
        /**
@@ -255,7 +258,10 @@ class JavaScriptContentTest extends TextContentTest {
                $content = $this->newContent( "#REDIRECT [[Someplace]]" );
                $newContent = $content->updateRedirect( $target );
 
-               $this->assertTrue( $content->equals( $newContent ), "content should be unchanged since it's not wikitext" );
+               $this->assertTrue(
+                       $content->equals( $newContent ),
+                       "content should be unchanged since it's not wikitext"
+               );
        }
 
        /**
index a1f099f..253a035 100644 (file)
@@ -53,7 +53,9 @@ class TextContentTest extends MediaWikiLangTestCase {
         * @dataProvider dataGetParserOutput
         * @covers TextContent::getParserOutput
         */
-       public function testGetParserOutput( $title, $model, $text, $expectedHtml, $expectedFields = null ) {
+       public function testGetParserOutput( $title, $model, $text, $expectedHtml,
+               $expectedFields = null
+       ) {
                $title = Title::newFromText( $title );
                $content = ContentHandler::makeContent( $text, $title, $model );
 
@@ -105,7 +107,11 @@ class TextContentTest extends MediaWikiLangTestCase {
                $options = ParserOptions::newFromUserAndLang( $this->context->getUser(), $wgContLang );
 
                $content = $this->newContent( $text );
-               $content = $content->preSaveTransform( $this->context->getTitle(), $this->context->getUser(), $options );
+               $content = $content->preSaveTransform(
+                       $this->context->getTitle(),
+                       $this->context->getUser(),
+                       $options
+               );
 
                $this->assertEquals( $expected, $content->getNativeData() );
        }
@@ -223,8 +229,13 @@ class TextContentTest extends MediaWikiLangTestCase {
 
                $v = $content->isCountable( $hasLinks, $this->context->getTitle() );
 
-               $this->assertEquals( $expected, $v, 'isCountable() returned unexpected value ' . var_export( $v, true )
-                       . ' instead of ' . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
+               $this->assertEquals(
+                       $expected,
+                       $v,
+                       'isCountable() returned unexpected value ' . var_export( $v, true )
+                               . ' instead of ' . var_export( $expected, true )
+                               . " in mode `$mode` for text \"$text\""
+               );
        }
 
        public static function dataGetTextForSummary() {
index 73b975b..38fb573 100644 (file)
@@ -4,11 +4,10 @@
  * @group ContentHandler
  */
 class WikitextContentHandlerTest extends MediaWikiLangTestCase {
-
        /**
         * @var ContentHandler
         */
-       var $handler;
+       private $handler;
 
        protected function setUp() {
                parent::setUp();
@@ -23,7 +22,10 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                $content = new WikitextContent( 'hello world' );
 
                $this->assertEquals( 'hello world', $this->handler->serializeContent( $content ) );
-               $this->assertEquals( 'hello world', $this->handler->serializeContent( $content, CONTENT_FORMAT_WIKITEXT ) );
+               $this->assertEquals(
+                       'hello world',
+                       $this->handler->serializeContent( $content, CONTENT_FORMAT_WIKITEXT )
+               );
 
                try {
                        $this->handler->serializeContent( $content, 'dummy/foo' );
@@ -98,7 +100,10 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                        array( 'Category:Foo', '#REDIRECT [[:Category:Foo]]' ),
                        array( Title::makeTitle( NS_MAIN, 'en:Foo' ), '#REDIRECT [[en:Foo]]' ),
                        array( Title::makeTitle( NS_MAIN, 'Foo', '', 'en' ), '#REDIRECT [[:en:Foo]]' ),
-                       array( Title::makeTitle( NS_MAIN, 'Bar', 'fragment', 'google' ), '#REDIRECT [[google:Bar#fragment]]' ),
+                       array(
+                               Title::makeTitle( NS_MAIN, 'Bar', 'fragment', 'google' ),
+                               '#REDIRECT [[google:Bar#fragment]]'
+                       ),
                );
        }
 
@@ -183,9 +188,10 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                        ),
 
                        array(
-                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
-                               labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et
-                               ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
+                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
+                               eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
+                               voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet
+                               clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
                                'Hello world!',
                                0,
                                '/^Replaced .*Hello/'
@@ -210,7 +216,10 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
 
                $summary = $this->handler->getAutosummary( $oldContent, $newContent, $flags );
 
-               $this->assertTrue( (bool)preg_match( $expected, $summary ), "Autosummary didn't match expected pattern $expected: $summary" );
+               $this->assertTrue(
+                       (bool)preg_match( $expected, $summary ),
+                       "Autosummary didn't match expected pattern $expected: $summary"
+               );
        }
 
        /**
@@ -224,6 +233,9 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
         * @todo Text case requires database, should be done by a test class in the Database group
         */
        /*
-       public function testGetUndoContent( Revision $current, Revision $undo, Revision $undoafter = null ) {}
+       public function testGetUndoContent( Revision $current, Revision $undo,
+               Revision $undoafter = null
+       ) {
+       }
        */
 }
index 1d133f3..bd4ae35 100644 (file)
@@ -7,7 +7,7 @@
  *        ^--- needed, because we do need the database to test link updates
  */
 class WikitextContentTest extends TextContentTest {
-       static $sections = "Intro
+       public static $sections = "Intro
 
 == stuff ==
 hello world
@@ -150,7 +150,10 @@ just a test"
                                "2",
                                "== TEST ==\nmore fun",
                                null,
-                               trim( preg_replace( '/^== test ==.*== foo ==/sm', "== TEST ==\nmore fun\n\n== foo ==", WikitextContentTest::$sections ) )
+                               trim( preg_replace(
+                                       '/^== test ==.*== foo ==/sm', "== TEST ==\nmore fun\n\n== foo ==",
+                                       WikitextContentTest::$sections
+                               ) )
                        ),
                        array( WikitextContentTest::$sections,
                                "8",
index 516ce3a..55e48d1 100644 (file)
  */
 class FakeDatabaseMysqlBase extends DatabaseMysqlBase {
        // From DatabaseBase
-       function __construct() {}
-       protected function closeConnection() {}
-       protected function doQuery( $sql ) {}
+       function __construct() {
+       }
+
+       protected function closeConnection() {
+       }
+
+       protected function doQuery( $sql ) {
+       }
 
        // From DatabaseMysql
-       protected function mysqlConnect( $realServer ) {}
-       protected function mysqlSetCharset( $charset ) {}
-       protected function mysqlFreeResult( $res ) {}
-       protected function mysqlFetchObject( $res ) {}
-       protected function mysqlFetchArray( $res ) {}
-       protected function mysqlNumRows( $res ) {}
-       protected function mysqlNumFields( $res ) {}
-       protected function mysqlFieldName( $res, $n ) {}
-       protected function mysqlFieldType( $res, $n ) {}
-       protected function mysqlDataSeek( $res, $row ) {}
-       protected function mysqlError( $conn = null ) {}
-       protected function mysqlFetchField( $res, $n ) {}
-       protected function mysqlPing() {}
+       protected function mysqlConnect( $realServer ) {
+       }
+
+       protected function mysqlSetCharset( $charset ) {
+       }
+
+       protected function mysqlFreeResult( $res ) {
+       }
+
+       protected function mysqlFetchObject( $res ) {
+       }
+
+       protected function mysqlFetchArray( $res ) {
+       }
+
+       protected function mysqlNumRows( $res ) {
+       }
+
+       protected function mysqlNumFields( $res ) {
+       }
+
+       protected function mysqlFieldName( $res, $n ) {
+       }
+
+       protected function mysqlFieldType( $res, $n ) {
+       }
+
+       protected function mysqlDataSeek( $res, $row ) {
+       }
+
+       protected function mysqlError( $conn = null ) {
+       }
+
+       protected function mysqlFetchField( $res, $n ) {
+       }
+
+       protected function mysqlPing() {
+       }
 
        // From interface DatabaseType
-       function insertId() {}
-       function lastErrno() {}
-       function affectedRows() {}
-       function getServerVersion() {}
+       function insertId() {
+       }
+
+       function lastErrno() {
+       }
+
+       function affectedRows() {
+       }
+
+       function getServerVersion() {
+       }
 }
 
 class DatabaseMysqlBaseTest extends MediaWikiTestCase {
-
        /**
         * @dataProvider provideDiapers
         * @covers DatabaseMysqlBase::addIdentifierQuotes
index bdd567e..5c2d4b7 100644 (file)
@@ -101,7 +101,11 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                                        'tables' => array( 'table', 't2' => 'table2' ),
                                        'fields' => array( 'tid', 'field', 'alias' => 'field2', 't2.id' ),
                                        'conds' => array( 'alias' => 'text' ),
-                                       'options' => array( 'LIMIT' => 1, 'GROUP BY' => array( 'field', 'field2' ), 'HAVING' => array( 'COUNT(*) > 1', 'field' => 1 ) ),
+                                       'options' => array(
+                                               'LIMIT' => 1,
+                                               'GROUP BY' => array( 'field', 'field2' ),
+                                               'HAVING' => array( 'COUNT(*) > 1', 'field' => 1 )
+                                       ),
                                        'join_conds' => array( 't2' => array(
                                                'LEFT JOIN', 'tid = t2.id'
                                        ) ),
index 65726eb..b4c1953 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 class MockDatabaseSqlite extends DatabaseSqliteStandalone {
-       var $lastQuery;
+       private $lastQuery;
 
        function __construct() {
                parent::__construct( ':memory:' );
@@ -27,11 +27,8 @@ class MockDatabaseSqlite extends DatabaseSqliteStandalone {
  * @group medium
  */
 class DatabaseSqliteTest extends MediaWikiTestCase {
-
-       /**
-        * @var MockDatabaseSqlite
-        */
-       var $db;
+       /** @var MockDatabaseSqlite */
+       protected $db;
 
        protected function setUp() {
                parent::setUp();
@@ -74,7 +71,8 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                        array( // #2: including quote
                                'foo\'bar', "'foo''bar'"
                        ),
-                       array( // #3: including \0 (must be represented as hex, per https://bugs.php.net/bug.php?id=63419)
+                       // #3: including \0 (must be represented as hex, per https://bugs.php.net/bug.php?id=63419)
+                       array(
                                "x\0y",
                                "x'780079'",
                        ),
@@ -116,14 +114,21 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
        public function testReplaceVars() {
                $this->assertEquals( 'foo', $this->replaceVars( 'foo' ), "Don't break anything accidentally" );
 
-               $this->assertEquals( "CREATE TABLE /**/foo (foo_key INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "
+               $this->assertEquals(
+                       "CREATE TABLE /**/foo (foo_key INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "
                                . "foo_bar TEXT, foo_name TEXT NOT NULL DEFAULT '', foo_int INTEGER, foo_int2 INTEGER );",
-                       $this->replaceVars( "CREATE TABLE /**/foo (foo_key int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-                       foo_bar char(13), foo_name varchar(255) binary NOT NULL DEFAULT '', foo_int tinyint ( 8 ), foo_int2 int(16) ) ENGINE=MyISAM;" )
+                       $this->replaceVars(
+                               "CREATE TABLE /**/foo (foo_key int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, "
+                               . "foo_bar char(13), foo_name varchar(255) binary NOT NULL DEFAULT '', "
+                               . "foo_int tinyint ( 8 ), foo_int2 int(16) ) ENGINE=MyISAM;"
+                       )
                );
 
-               $this->assertEquals( "CREATE TABLE foo ( foo1 REAL, foo2 REAL, foo3 REAL );",
-                       $this->replaceVars( "CREATE TABLE foo ( foo1 FLOAT, foo2 DOUBLE( 1,10), foo3 DOUBLE PRECISION );" )
+               $this->assertEquals(
+                       "CREATE TABLE foo ( foo1 REAL, foo2 REAL, foo3 REAL );",
+                       $this->replaceVars(
+                               "CREATE TABLE foo ( foo1 FLOAT, foo2 DOUBLE( 1,10), foo3 DOUBLE PRECISION );"
+                       )
                );
 
                $this->assertEquals( "CREATE TABLE foo ( foo_binary1 BLOB, foo_binary2 BLOB );",
index 35a8e4c..7e70439 100644 (file)
@@ -8,8 +8,9 @@ class DatabaseTest extends MediaWikiTestCase {
        /**
         * @var DatabaseBase
         */
-       var $db;
-       var $functionTest = false;
+       protected $db;
+
+       private $functionTest = false;
 
        protected function setUp() {
                parent::setUp();
@@ -215,7 +216,9 @@ class DatabaseTest extends MediaWikiTestCase {
                global $IP;
                $this->dropFunctions();
                $this->functionTest = true;
-               $this->assertTrue( $this->db->sourceFile( "$IP/tests/phpunit/data/db/{$this->db->getType()}/functions.sql" ) );
+               $this->assertTrue(
+                       $this->db->sourceFile( "$IP/tests/phpunit/data/db/{$this->db->getType()}/functions.sql" )
+               );
                $res = $this->db->query( 'SELECT mw_test_function() AS test', __METHOD__ );
                $this->assertEquals( 42, $res->fetchObject()->test );
        }
index 790f273..39c311f 100644 (file)
@@ -156,6 +156,10 @@ class DatabaseTestHelper extends DatabaseBase {
                return 'test';
        }
 
+       function isOpen() {
+               return true;
+       }
+
        protected function closeConnection() {
                return false;
        }
index 351908b..e914c72 100644 (file)
@@ -93,13 +93,32 @@ class ArrayDiffFormatterTest extends MediaWikiTestCase {
                );
                $otherTestCases[] = array(
                        $this->getMockDiff( array( $this->getMockDiffOp( 'change', array( 'd1' ), array( 'a1' ) ) ) ),
-                       array( array( 'action' => 'change', 'old' => 'd1', 'new' => 'mockLine', 'newline' => 1, 'oldline' => 1 ) ),
+                       array( array(
+                               'action' => 'change',
+                               'old' => 'd1',
+                               'new' => 'mockLine',
+                               'newline' => 1, 'oldline' => 1
+                       ) ),
                );
                $otherTestCases[] = array(
-                       $this->getMockDiff( array( $this->getMockDiffOp( 'change', array( 'd1', 'd2' ), array( 'a1', 'a2' ) ) ) ),
+                       $this->getMockDiff( array( $this->getMockDiffOp(
+                               'change',
+                               array( 'd1', 'd2' ),
+                               array( 'a1', 'a2' )
+                       ) ) ),
                        array(
-                               array( 'action' => 'change', 'old' => 'd1', 'new' => 'mockLine', 'newline' => 1, 'oldline' => 1 ),
-                               array( 'action' => 'change', 'old' => 'd2', 'new' => 'mockLine', 'newline' => 2, 'oldline' => 2 ),
+                               array(
+                                       'action' => 'change',
+                                       'old' => 'd1',
+                                       'new' => 'mockLine',
+                                       'newline' => 1, 'oldline' => 1
+                               ),
+                               array(
+                                       'action' => 'change',
+                                       'old' => 'd2',
+                                       'new' => 'mockLine',
+                                       'newline' => 2, 'oldline' => 2
+                               ),
                        ),
                );
 
index 1220270..a7bfbfe 100644 (file)
@@ -156,7 +156,10 @@ class FileBackendTest extends MediaWikiTestCase {
                        array( 'mwstore://backend/container/path', 'mwstore://backend/container/path' ),
                        array( 'mwstore://backend/container//path', 'mwstore://backend/container/path' ),
                        array( 'mwstore://backend/container///path', 'mwstore://backend/container/path' ),
-                       array( 'mwstore://backend/container///path//to///obj', 'mwstore://backend/container/path/to/obj' ),
+                       array(
+                               'mwstore://backend/container///path//to///obj',
+                               'mwstore://backend/container/path/to/obj'
+                       ),
                        array( 'mwstore://', null ),
                        array( 'mwstore://backend', null ),
                        array( 'mwstore://backend//container/path', null ),
@@ -1234,11 +1237,23 @@ class FileBackendTest extends MediaWikiTestCase {
                        $contents = $this->backend->getFileContentsMulti( array( 'srcs' => $source ) );
                        foreach ( $contents as $path => $data ) {
                                $this->assertNotEquals( false, $data, "Contents of $path exists ($backendName)." );
-                               $this->assertEquals( current( $content ), $data, "Contents of $path is correct ($backendName)." );
+                               $this->assertEquals(
+                                       current( $content ),
+                                       $data,
+                                       "Contents of $path is correct ($backendName)."
+                               );
                                next( $content );
                        }
-                       $this->assertEquals( $source, array_keys( $contents ), "Contents in right order ($backendName)." );
-                       $this->assertEquals( count( $source ), count( $contents ), "Contents array size correct ($backendName)." );
+                       $this->assertEquals(
+                               $source,
+                               array_keys( $contents ),
+                               "Contents in right order ($backendName)."
+                       );
+                       $this->assertEquals(
+                               count( $source ),
+                               count( $contents ),
+                               "Contents array size correct ($backendName)."
+                       );
                } else {
                        $data = $this->backend->getFileContents( array( 'src' => $source ) );
                        $this->assertNotEquals( false, $data, "Contents of $source exists ($backendName)." );
@@ -1297,18 +1312,34 @@ class FileBackendTest extends MediaWikiTestCase {
                                        "Creation of local copy of $path succeeded ($backendName)." );
                                $contents = file_get_contents( $tmpFile->getPath() );
                                $this->assertNotEquals( false, $contents, "Local copy of $path exists ($backendName)." );
-                               $this->assertEquals( current( $content ), $contents, "Local copy of $path is correct ($backendName)." );
+                               $this->assertEquals(
+                                       current( $content ),
+                                       $contents,
+                                       "Local copy of $path is correct ($backendName)."
+                               );
                                next( $content );
                        }
-                       $this->assertEquals( $source, array_keys( $tmpFiles ), "Local copies in right order ($backendName)." );
-                       $this->assertEquals( count( $source ), count( $tmpFiles ), "Local copies array size correct ($backendName)." );
+                       $this->assertEquals(
+                               $source,
+                               array_keys( $tmpFiles ),
+                               "Local copies in right order ($backendName)."
+                       );
+                       $this->assertEquals(
+                               count( $source ),
+                               count( $tmpFiles ),
+                               "Local copies array size correct ($backendName)."
+                       );
                } else {
                        $tmpFile = $this->backend->getLocalCopy( array( 'src' => $source ) );
                        $this->assertNotNull( $tmpFile,
                                "Creation of local copy of $source succeeded ($backendName)." );
                        $contents = file_get_contents( $tmpFile->getPath() );
                        $this->assertNotEquals( false, $contents, "Local copy of $source exists ($backendName)." );
-                       $this->assertEquals( $content[0], $contents, "Local copy of $source is correct ($backendName)." );
+                       $this->assertEquals(
+                               $content[0],
+                               $contents,
+                               "Local copy of $source is correct ($backendName)."
+                       );
                }
 
                $obj = new stdClass();
@@ -1367,11 +1398,23 @@ class FileBackendTest extends MediaWikiTestCase {
                                        "Creation of local copy of $path succeeded ($backendName)." );
                                $contents = file_get_contents( $tmpFile->getPath() );
                                $this->assertNotEquals( false, $contents, "Local ref of $path exists ($backendName)." );
-                               $this->assertEquals( current( $content ), $contents, "Local ref of $path is correct ($backendName)." );
+                               $this->assertEquals(
+                                       current( $content ),
+                                       $contents,
+                                       "Local ref of $path is correct ($backendName)."
+                               );
                                next( $content );
                        }
-                       $this->assertEquals( $source, array_keys( $tmpFiles ), "Local refs in right order ($backendName)." );
-                       $this->assertEquals( count( $source ), count( $tmpFiles ), "Local refs array size correct ($backendName)." );
+                       $this->assertEquals(
+                               $source,
+                               array_keys( $tmpFiles ),
+                               "Local refs in right order ($backendName)."
+                       );
+                       $this->assertEquals(
+                               count( $source ),
+                               count( $tmpFiles ),
+                               "Local refs array size correct ($backendName)."
+                       );
                } else {
                        $tmpFile = $this->backend->getLocalReference( array( 'src' => $source ) );
                        $this->assertNotNull( $tmpFile,
@@ -1950,7 +1993,10 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
                // Actual listing (no trailing slash) at root with advise
-               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1", 'adviseStat' => 1 ) );
+               $iter = $this->backend->getFileList( array(
+                       'dir' => "$base/unittest-cont1",
+                       'adviseStat' => 1
+               ) );
                $list = $this->listToArray( $iter );
                sort( $list );
                $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
@@ -1983,7 +2029,10 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
 
                // Actual listing (no trailing slash) at subdir with advise
-               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir", 'adviseStat' => 1 ) );
+               $iter = $this->backend->getFileList( array(
+                       'dir' => "$base/unittest-cont1/e/subdir2/subdir",
+                       'adviseStat' => 1
+               ) );
                $list = $this->listToArray( $iter );
                sort( $list );
                $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
@@ -2019,13 +2068,18 @@ class FileBackendTest extends MediaWikiTestCase {
                sort( $expected );
 
                // Actual listing (top files only) at subdir
-               $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
+               $iter = $this->backend->getTopFileList(
+                       array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" )
+               );
                $list = $this->listToArray( $iter );
                sort( $list );
                $this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
 
                // Actual listing (top files only) at subdir with advise
-               $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir", 'adviseStat' => 1 ) );
+               $iter = $this->backend->getTopFileList( array(
+                       'dir' => "$base/unittest-cont1/e/subdir2/subdir",
+                       'adviseStat' => 1
+               ) );
                $list = $this->listToArray( $iter );
                sort( $list );
                $this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
@@ -2162,7 +2216,10 @@ class FileBackendTest extends MediaWikiTestCase {
 
                // Actual listing (with trailing slash)
                $list = array();
-               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir2/" ) );
+               $iter = $this->backend->getTopDirectoryList(
+                       array( 'dir' => "$base/unittest-cont1/e/subdir2/" )
+               );
+
                foreach ( $iter as $file ) {
                        $list[] = $file;
                }
@@ -2177,7 +2234,11 @@ class FileBackendTest extends MediaWikiTestCase {
                }
                sort( $list );
 
-               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName), second iteration." );
+               $this->assertEquals(
+                       $expected,
+                       $list,
+                       "Correct top dir listing ($backendName), second iteration."
+               );
 
                // Expected listing (recursive)
                $expected = array(
index 787d83c..3276cf9 100644 (file)
@@ -130,7 +130,17 @@ class StoreBatchTest extends MediaWikiTestCase {
         */
        public function teststore() {
                global $IP;
-               $this->storecohort( "Test1.png", "$IP/skins/monobook/wiki.png", "$IP/skins/monobook/video.png", false );
-               $this->storecohort( "Test2.png", "$IP/skins/monobook/wiki.png", "$IP/skins/monobook/video.png", true );
+               $this->storecohort(
+                       "Test1.png",
+                       "$IP/skins/monobook/wiki.png",
+                       "$IP/skins/monobook/video.png",
+                       false
+               );
+               $this->storecohort(
+                       "Test2.png",
+                       "$IP/skins/monobook/wiki.png",
+                       "$IP/skins/monobook/video.png",
+                       true
+               );
        }
 }
index c41acef..5a822f5 100644 (file)
@@ -30,11 +30,12 @@ class HtmlCheckMatrixTest extends MediaWikiTestCase {
        public function testValidateCallsUserDefinedValidationCallback() {
                $called = false;
                $field = new HTMLCheckMatrix( self::$defaultOptions + array(
-                               'validation-callback' => function() use ( &$called ) {
-                                               $called = true;
-                                               return false;
-                                       },
-                       ) );
+                       'validation-callback' => function () use ( &$called ) {
+                               $called = true;
+
+                               return false;
+                       },
+               ) );
                $this->assertEquals( false, $this->validate( $field, array() ) );
                $this->assertTrue( $called );
        }
index 8466684..064d518 100644 (file)
@@ -48,17 +48,24 @@ class InstallDocFormatterTest extends MediaWikiTestCase {
 
                        # Transform '$wgFooBar' links
                        array(
-                               '<span class="config-plainlink">[https://www.mediawiki.org/wiki/Manual:$wgFooBar $wgFooBar]</span>',
+                               '<span class="config-plainlink">'
+                                       . '[https://www.mediawiki.org/wiki/Manual:$wgFooBar $wgFooBar]</span>',
                                '$wgFooBar', 'Testing basic $wgFooBar' ),
                        array(
-                               '<span class="config-plainlink">[https://www.mediawiki.org/wiki/Manual:$wgFooBar45 $wgFooBar45]</span>',
+                               '<span class="config-plainlink">'
+                                       . '[https://www.mediawiki.org/wiki/Manual:$wgFooBar45 $wgFooBar45]</span>',
                                '$wgFooBar45', 'Testing $wgFooBar45 (with numbers)' ),
                        array(
-                               '<span class="config-plainlink">[https://www.mediawiki.org/wiki/Manual:$wgFoo_Bar $wgFoo_Bar]</span>',
+                               '<span class="config-plainlink">'
+                                       . '[https://www.mediawiki.org/wiki/Manual:$wgFoo_Bar $wgFoo_Bar]</span>',
                                '$wgFoo_Bar', 'Testing $wgFoo_Bar (with underscore)' ),
 
                        # Icky variables that shouldn't link
-                       array( '$myAwesomeVariable', '$myAwesomeVariable', 'Testing $myAwesomeVariable (not starting with $wg)' ),
+                       array(
+                               '$myAwesomeVariable',
+                               '$myAwesomeVariable',
+                               'Testing $myAwesomeVariable (not starting with $wg)'
+                       ),
                        array( '$()not!a&Var', '$()not!a&Var', 'Testing $()not!a&Var (obviously not a variable)' ),
                );
        }
index 66e6559..fdcecf9 100644 (file)
@@ -40,7 +40,11 @@ class OracleInstallerTest extends MediaWikiTestCase {
                        array( true, 'host:1521/service:shared', 'Host, port, service and shared server type' ),
                        array( true, 'host:1521/service:dedicated', 'Host, port, service and dedicated server type' ),
                        array( true, 'host:1521/service:pooled', 'Host, port, service and pooled server type' ),
-                       array( true, 'host:1521/service:shared/instance1', 'Host, port, service, server type and instance' ),
+                       array(
+                               true,
+                               'host:1521/service:shared/instance1',
+                               'Host, port, service, server type and instance'
+                       ),
                        array( true, 'host:1521//instance1', 'Host, port and instance' ),
                );
        }
index 3d2b5d8..3e232a9 100644 (file)
@@ -28,7 +28,11 @@ class RefreshLinksPartitionTest extends MediaWikiTestCase {
                }
 
                $title->getBacklinkCache()->clear();
-               $this->assertEquals( 20, $title->getBacklinkCache()->getNumLinks( 'pagelinks' ), 'Correct number of backlinks' );
+               $this->assertEquals(
+                       20,
+                       $title->getBacklinkCache()->getNumLinks( 'pagelinks' ),
+                       'Correct number of backlinks'
+               );
 
                $job = new RefreshLinksJob( $title, array( 'recursive' => true, 'table' => 'pagelinks' )
                        + Job::newRootJobParams( "refreshlinks:pagelinks:{$title->getPrefixedText()}" ) );
@@ -55,7 +59,12 @@ class RefreshLinksPartitionTest extends MediaWikiTestCase {
                $this->assertEquals( $extraParams['rootJobSignature'], $jobs[9]->params['rootJobSignature'],
                        'Recursive sub-job has root params' );
 
-               $jobs2 = BacklinkJobUtils::partitionBacklinkJob( $jobs[9], 9, 1, array( 'params' => $extraParams ) );
+               $jobs2 = BacklinkJobUtils::partitionBacklinkJob(
+                       $jobs[9],
+                       9,
+                       1,
+                       array( 'params' => $extraParams )
+               );
 
                $this->assertEquals( 10, count( $jobs2 ), 'Correct number of sub-jobs' );
                $this->assertEquals( $pages[9], current( $jobs2[0]->params['pages'] ),
@@ -73,7 +82,12 @@ class RefreshLinksPartitionTest extends MediaWikiTestCase {
                $this->assertEquals( $extraParams['rootJobSignature'], $jobs2[9]->params['rootJobSignature'],
                        'Recursive sub-job has root params' );
 
-               $jobs3 = BacklinkJobUtils::partitionBacklinkJob( $jobs2[9], 9, 1, array( 'params' => $extraParams ) );
+               $jobs3 = BacklinkJobUtils::partitionBacklinkJob(
+                       $jobs2[9],
+                       9,
+                       1,
+                       array( 'params' => $extraParams )
+               );
 
                $this->assertEquals( 2, count( $jobs3 ), 'Correct number of sub-jobs' );
                $this->assertEquals( $pages[18], current( $jobs3[0]->params['pages'] ),
index 5c0487b..5475a82 100644 (file)
@@ -25,7 +25,11 @@ class CSSMinTest extends MediaWikiTestCase {
        public function testMinify( $code, $expectedOutput ) {
                $minified = CSSMin::minify( $code );
 
-               $this->assertEquals( $expectedOutput, $minified, 'Minified output should be in the form expected.' );
+               $this->assertEquals(
+                       $expectedOutput,
+                       $minified,
+                       'Minified output should be in the form expected.'
+               );
        }
 
        public static function provideMinifyCases() {
@@ -69,7 +73,8 @@ class CSSMinTest extends MediaWikiTestCase {
        }
 
        /**
-        * This tests funky parameters to CSSMin::remap. testRemapRemapping tests the basic functionality.
+        * This tests funky parameters to CSSMin::remap. testRemapRemapping tests
+        * the basic functionality.
         *
         * @dataProvider provideRemapCases
         * @covers CSSMin::remap
@@ -78,7 +83,11 @@ class CSSMinTest extends MediaWikiTestCase {
                $remapped = call_user_func_array( 'CSSMin::remap', $params );
 
                $messageAdd = " Case: $message";
-               $this->assertEquals( $expectedOutput, $remapped, 'CSSMin::remap should return the expected url form.' . $messageAdd );
+               $this->assertEquals(
+                       $expectedOutput,
+                       $remapped,
+                       'CSSMin::remap should return the expected url form.' . $messageAdd
+               );
        }
 
        public static function provideRemapCases() {
@@ -201,7 +210,8 @@ class CSSMinTest extends MediaWikiTestCase {
                        array(
                                'Embedded file (inline @embed)',
                                'foo { background: /* @embed */ url(red.gif); }',
-                               "foo { background: url($red); background: url(http://localhost/w/red.gif?timestamp)!ie; }",
+                               "foo { background: url($red); "
+                                       . "background: url(http://localhost/w/red.gif?timestamp)!ie; }",
                        ),
                        array(
                                'Can not embed large files',
@@ -211,27 +221,35 @@ class CSSMinTest extends MediaWikiTestCase {
                        array(
                                'Two regular files in one rule',
                                'foo { background: url(red.gif), url(green.gif); }',
-                               'foo { background: url(http://localhost/w/red.gif?timestamp), url(http://localhost/w/green.gif?timestamp); }',
+                               'foo { background: url(http://localhost/w/red.gif?timestamp), '
+                                       . 'url(http://localhost/w/green.gif?timestamp); }',
                        ),
                        array(
                                'Two embedded files in one rule',
                                'foo { /* @embed */ background: url(red.gif), url(green.gif); }',
-                               "foo { background: url($red), url($green); background: url(http://localhost/w/red.gif?timestamp), url(http://localhost/w/green.gif?timestamp)!ie; }",
+                               "foo { background: url($red), url($green); "
+                                       . "background: url(http://localhost/w/red.gif?timestamp), "
+                                       . "url(http://localhost/w/green.gif?timestamp)!ie; }",
                        ),
                        array(
                                'Two embedded files in one rule (inline @embed)',
                                'foo { background: /* @embed */ url(red.gif), /* @embed */ url(green.gif); }',
-                               "foo { background: url($red), url($green); background: url(http://localhost/w/red.gif?timestamp), url(http://localhost/w/green.gif?timestamp)!ie; }",
+                               "foo { background: url($red), url($green); "
+                                       . "background: url(http://localhost/w/red.gif?timestamp), "
+                                       . "url(http://localhost/w/green.gif?timestamp)!ie; }",
                        ),
                        array(
                                'Two embedded files in one rule (inline @embed), one too large',
                                'foo { background: /* @embed */ url(red.gif), /* @embed */ url(large.png); }',
-                               "foo { background: url($red), url(http://localhost/w/large.png?timestamp); background: url(http://localhost/w/red.gif?timestamp), url(http://localhost/w/large.png?timestamp)!ie; }",
+                               "foo { background: url($red), url(http://localhost/w/large.png?timestamp); "
+                                       . "background: url(http://localhost/w/red.gif?timestamp), "
+                                       . "url(http://localhost/w/large.png?timestamp)!ie; }",
                        ),
                        array(
                                'Practical example with some noise',
                                'foo { /* @embed */ background: #f9f9f9 url(red.gif) 0 0 no-repeat; }',
-                               "foo { background: #f9f9f9 url($red) 0 0 no-repeat; background: #f9f9f9 url(http://localhost/w/red.gif?timestamp) 0 0 no-repeat!ie; }",
+                               "foo { background: #f9f9f9 url($red) 0 0 no-repeat; "
+                                       . "background: #f9f9f9 url(http://localhost/w/red.gif?timestamp) 0 0 no-repeat!ie; }",
                        ),
                        array(
                                'Does not mess with other properties',
@@ -324,7 +342,10 @@ class CSSMinTest extends MediaWikiTestCase {
                        // - Using a tab in a string value (turns into a space)
                        array( "foo { content: '\t'; }", "foo{content:'\t'}" ),
                        // - Using css-like syntax in string values
-                       array( 'foo::after { content: "{;}"; position: absolute; }', 'foo::after{content:"{;}";position:absolute}' ),
+                       array(
+                               'foo::after { content: "{;}"; position: absolute; }',
+                               'foo::after{content:"{;}";position:absolute}'
+                       ),
                );
        }
 }
index 806f5bf..4911f73 100644 (file)
@@ -30,7 +30,8 @@
 abstract class GenericArrayObjectTest extends MediaWikiTestCase {
 
        /**
-        * Returns objects that can serve as elements in the concrete GenericArrayObject deriving class being tested.
+        * Returns objects that can serve as elements in the concrete
+        * GenericArrayObject deriving class being tested.
         *
         * @since 1.20
         *
index 01c330a..c8795b2 100644 (file)
@@ -14,16 +14,28 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                         * At some point there was a bug that caused this comment to be ended at '* /',
                         * causing /M... to be left as the beginning of a regex.
                         */
-                       array( "/**\n * Foo\n * {\n * 'bar' : {\n * //Multiple rules with configurable operators\n * 'baz' : false\n * }\n */", "" ),
+                       array(
+                               "/**\n * Foo\n * {\n * 'bar' : {\n * "
+                                       . "//Multiple rules with configurable operators\n * 'baz' : false\n * }\n */",
+                               "" ),
 
                        /**
                         * '  Foo \' bar \
                         *  baz \' quox '  .
                         */
-                       array( "'  Foo  \\'  bar  \\\n  baz  \\'  quox  '  .length", "'  Foo  \\'  bar  \\\n  baz  \\'  quox  '.length" ),
-                       array( "\"  Foo  \\\"  bar  \\\n  baz  \\\"  quox  \"  .length", "\"  Foo  \\\"  bar  \\\n  baz  \\\"  quox  \".length" ),
+                       array(
+                               "'  Foo  \\'  bar  \\\n  baz  \\'  quox  '  .length",
+                               "'  Foo  \\'  bar  \\\n  baz  \\'  quox  '.length"
+                       ),
+                       array(
+                               "\"  Foo  \\\"  bar  \\\n  baz  \\\"  quox  \"  .length",
+                               "\"  Foo  \\\"  bar  \\\n  baz  \\\"  quox  \".length"
+                       ),
                        array( "// Foo b/ar baz", "" ),
-                       array( "/  Foo  \\/  bar  [  /  \\]  /  ]  baz  /  .length", "/  Foo  \\/  bar  [  /  \\]  /  ]  baz  /.length" ),
+                       array(
+                               "/  Foo  \\/  bar  [  /  \\]  /  ]  baz  /  .length",
+                               "/  Foo  \\/  bar  [  /  \\]  /  ]  baz  /.length"
+                       ),
 
                        // HTML comments
                        array( "<!-- Foo bar", "" ),
@@ -49,7 +61,10 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
 
                        // Semicolon insertion between an expression having an inline
                        // comment after it, and a statement on the next line (bug 27046).
-                       array( "var a = this //foo bar \n for ( b = 0; c < d; b++ ) {}", "var a=this\nfor(b=0;c<d;b++){}" ),
+                       array(
+                               "var a = this //foo bar \n for ( b = 0; c < d; b++ ) {}",
+                               "var a=this\nfor(b=0;c<d;b++){}"
+                       ),
 
                        // Token separation
                        array( "x  in  y", "x in y" ),
@@ -85,16 +100,28 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                        array( "var foo=\"\\\nblah\\\n\";", "var foo=\"\\\nblah\\\n\";" ),
 
                        // Multiline quoted string followed by string with spaces
-                       array( "var foo=\"\\\nblah\\\n\";\nvar baz = \" foo \";\n", "var foo=\"\\\nblah\\\n\";var baz=\" foo \";" ),
+                       array(
+                               "var foo=\"\\\nblah\\\n\";\nvar baz = \" foo \";\n",
+                               "var foo=\"\\\nblah\\\n\";var baz=\" foo \";"
+                       ),
 
                        // URL in quoted string ( // is not a comment)
-                       array( "aNode.setAttribute('href','http://foo.bar.org/baz');", "aNode.setAttribute('href','http://foo.bar.org/baz');" ),
+                       array(
+                               "aNode.setAttribute('href','http://foo.bar.org/baz');",
+                               "aNode.setAttribute('href','http://foo.bar.org/baz');"
+                       ),
 
                        // URL in quoted string after multiline quoted string
-                       array( "var foo=\"\\\nblah\\\n\";\naNode.setAttribute('href','http://foo.bar.org/baz');", "var foo=\"\\\nblah\\\n\";aNode.setAttribute('href','http://foo.bar.org/baz');" ),
+                       array(
+                               "var foo=\"\\\nblah\\\n\";\naNode.setAttribute('href','http://foo.bar.org/baz');",
+                               "var foo=\"\\\nblah\\\n\";aNode.setAttribute('href','http://foo.bar.org/baz');"
+                       ),
 
                        // Division vs. regex nastiness
-                       array( "alert( (10+10) / '/'.charCodeAt( 0 ) + '//' );", "alert((10+10)/'/'.charCodeAt(0)+'//');" ),
+                       array(
+                               "alert( (10+10) / '/'.charCodeAt( 0 ) + '//' );",
+                               "alert((10+10)/'/'.charCodeAt(0)+'//');"
+                       ),
                        array( "if(1)/a /g.exec('Pa ss');", "if(1)/a /g.exec('Pa ss');" ),
 
                        // newline insertion after 1000 chars: break after the "++", not before
@@ -130,7 +157,11 @@ class JavaScriptMinifierTest extends MediaWikiTestCase {
                wfRestoreWarnings();
                $parser->parse( $minified, 'minify-test.js', 1 );
 
-               $this->assertEquals( $expectedOutput, $minified, "Minified output should be in the form expected." );
+               $this->assertEquals(
+                       $expectedOutput,
+                       $minified,
+                       "Minified output should be in the form expected."
+               );
        }
 
        public static function provideBug32548() {
index aedc23a..537c124 100644 (file)
@@ -20,18 +20,12 @@ class DjVuTest extends MediaWikiTestCase {
        protected $handler;
 
        protected function setUp() {
-               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML;
                parent::setUp();
 
                //cli tool setup
-               $wgDjvuRenderer = $wgDjvuRenderer ? $wgDjvuRenderer : '/usr/bin/ddjvu';
-               $wgDjvuDump = $wgDjvuDump ? $wgDjvuDump : '/usr/bin/djvudump';
-               $wgDjvuToXML = $wgDjvuToXML ? $wgDjvuToXML : '/usr/bin/djvutoxml';
-               if (
-                       !$this->checkIfToolExists( $wgDjvuRenderer ) ||
-                       !$this->checkIfToolExists( $wgDjvuDump ) ||
-                       !$this->checkIfToolExists( $wgDjvuToXML )
-               ) {
+               $djvuSupport = new DjVuSupport();
+
+               if ( !$djvuSupport->isEnabled() ) {
                        $this->markTestSkipped( 'This test needs the installation of the ddjvu, djvutoxml and djvudump tools' );
                }
 
@@ -52,19 +46,6 @@ class DjVuTest extends MediaWikiTestCase {
                $this->handler = new DjVuHandler();
        }
 
-       /**
-        * Check if a tool exist
-        *
-        * @param string $path path to the tool
-        * @return bool
-        */
-       protected function checkIfToolExists( $path ) {
-               wfSuppressWarnings();
-               $result = file_exists( $path );
-               wfRestoreWarnings();
-               return $result;
-       }
-
        protected function dataFile( $name, $type ) {
                return new UnregisteredLocalFile(
                        false,
index fb3e40e..44b2070 100644 (file)
@@ -45,7 +45,9 @@ class ExifBitmapTest extends MediaWikiTestCase {
         * @covers ExifBitmapHandler::isMetadataValid
         */
        public function testGoodMetadata() {
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                $meta = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
+               // @codingStandardsIgnoreEnd
                $res = $this->handler->isMetadataValid( null, $meta );
                $this->assertEquals( ExifBitmapHandler::METADATA_GOOD, $res );
        }
@@ -54,7 +56,9 @@ class ExifBitmapTest extends MediaWikiTestCase {
         * @covers ExifBitmapHandler::isMetadataValid
         */
        public function testIsOldGood() {
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                $meta = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:1;}';
+               // @codingStandardsIgnoreEnd
                $res = $this->handler->isMetadataValid( null, $meta );
                $this->assertEquals( ExifBitmapHandler::METADATA_COMPATIBLE, $res );
        }
@@ -64,7 +68,9 @@ class ExifBitmapTest extends MediaWikiTestCase {
         * @covers ExifBitmapHandler::isMetadataValid
         */
        public function testPagedTiffHandledGracefully() {
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                $meta = 'a:6:{s:9:"page_data";a:1:{i:1;a:5:{s:5:"width";i:643;s:6:"height";i:448;s:5:"alpha";s:4:"true";s:4:"page";i:1;s:6:"pixels";i:288064;}}s:10:"page_count";i:1;s:10:"first_page";i:1;s:9:"last_page";i:1;s:4:"exif";a:9:{s:10:"ImageWidth";i:643;s:11:"ImageLength";i:448;s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:4;s:12:"RowsPerStrip";i:50;s:19:"PlanarConfiguration";i:1;s:22:"MEDIAWIKI_EXIF_VERSION";i:1;}s:21:"TIFF_METADATA_VERSION";s:3:"1.4";}';
+               // @codingStandardsIgnoreEnd
                $res = $this->handler->isMetadataValid( null, $meta );
                $this->assertEquals( ExifBitmapHandler::METADATA_BAD, $res );
        }
index 3cfbf1a..438dc79 100644 (file)
@@ -70,8 +70,16 @@ class ExifRotationTest extends MediaWikiTestCase {
                        $file = $this->dataFile( $name, $type );
                        $thumb = $file->transform( $params, File::RENDER_NOW | File::RENDER_FORCE );
 
-                       $this->assertEquals( $out[0], $thumb->getWidth(), "$name: thumb reported width check for $size" );
-                       $this->assertEquals( $out[1], $thumb->getHeight(), "$name: thumb reported height check for $size" );
+                       $this->assertEquals(
+                               $out[0],
+                               $thumb->getWidth(),
+                               "$name: thumb reported width check for $size"
+                       );
+                       $this->assertEquals(
+                               $out[1],
+                               $thumb->getHeight(),
+                               "$name: thumb reported height check for $size"
+                       );
 
                        $gis = getimagesize( $thumb->getLocalCopyPath() );
                        if ( $out[0] > $info['width'] ) {
@@ -160,8 +168,16 @@ class ExifRotationTest extends MediaWikiTestCase {
                        $file = $this->dataFile( $name, $type );
                        $thumb = $file->transform( $params, File::RENDER_NOW | File::RENDER_FORCE );
 
-                       $this->assertEquals( $out[0], $thumb->getWidth(), "$name: thumb reported width check for $size" );
-                       $this->assertEquals( $out[1], $thumb->getHeight(), "$name: thumb reported height check for $size" );
+                       $this->assertEquals(
+                               $out[0],
+                               $thumb->getWidth(),
+                               "$name: thumb reported width check for $size"
+                       );
+                       $this->assertEquals(
+                               $out[1],
+                               $thumb->getHeight(),
+                               "$name: thumb reported height check for $size"
+                       );
 
                        $gis = getimagesize( $thumb->getLocalCopyPath() );
                        if ( $out[0] > $info['width'] ) {
index d750540..7a7ed21 100644 (file)
@@ -90,7 +90,9 @@ class GIFHandlerTest extends MediaWikiTestCase {
                        array( '', GIFHandler::METADATA_BAD ),
                        array( null, GIFHandler::METADATA_BAD ),
                        array( 'Something invalid!', GIFHandler::METADATA_BAD ),
+                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        array( 'a:4:{s:10:"frameCount";i:1;s:6:"looped";b:0;s:8:"duration";d:0.1000000000000000055511151231257827021181583404541015625;s:8:"metadata";a:2:{s:14:"GIFFileComment";a:1:{i:0;s:35:"GIF test file ⁕ Created with GIMP";}s:15:"_MW_GIF_VERSION";i:1;}}', GIFHandler::METADATA_GOOD ),
+                       // @codingStandardsIgnoreEnd
                );
        }
 
@@ -108,8 +110,10 @@ class GIFHandlerTest extends MediaWikiTestCase {
 
        public static function provideGetMetadata() {
                return array(
+                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        array( 'nonanimated.gif', 'a:4:{s:10:"frameCount";i:1;s:6:"looped";b:0;s:8:"duration";d:0.1000000000000000055511151231257827021181583404541015625;s:8:"metadata";a:2:{s:14:"GIFFileComment";a:1:{i:0;s:35:"GIF test file ⁕ Created with GIMP";}s:15:"_MW_GIF_VERSION";i:1;}}' ),
                        array( 'animated-xmp.gif', 'a:4:{s:10:"frameCount";i:4;s:6:"looped";b:1;s:8:"duration";d:2.399999999999999911182158029987476766109466552734375;s:8:"metadata";a:5:{s:6:"Artist";s:7:"Bawolff";s:16:"ImageDescription";a:2:{s:9:"x-default";s:18:"A file to test GIF";s:5:"_type";s:4:"lang";}s:15:"SublocationDest";s:13:"The interwebs";s:14:"GIFFileComment";a:1:{i:0;s:16:"GIƒ·test·file";}s:15:"_MW_GIF_VERSION";i:1;}}' ),
+                       // @codingStandardsIgnoreEnd
                );
        }
 
index 81c1d28..b556a75 100644 (file)
@@ -74,7 +74,8 @@ class IPTCTest extends MediaWikiTestCase {
         */
        public function testIPTCParseUTF8() {
                // This has the magic "\x1c\x01\x5A\x00\x03\x1B\x25\x47" which marks content as UTF8.
-               $iptcData = "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x0F\x1c\x02\x19\x00\x02¼\x1c\x01\x5A\x00\x03\x1B\x25\x47";
+               $iptcData =
+                       "Photoshop 3.0\08BIM\4\4\0\0\0\0\0\x0F\x1c\x02\x19\x00\x02¼\x1c\x01\x5A\x00\x03\x1B\x25\x47";
                $res = IPTC::Parse( $iptcData );
                $this->assertEquals( array( '¼' ), $res['Keywords'] );
        }
index 7ffde3b..b10f55c 100644 (file)
@@ -70,7 +70,8 @@ class JpegMetadataExtractorTest extends MediaWikiTestCase {
 
        public function testPSIRExtraction() {
                $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . 'jpeg-xmp-psir.jpg' );
-               $expected = '50686f746f73686f7020332e30003842494d04040000000000181c02190004746573741c02190003666f6f1c020000020004';
+               $expected = '50686f746f73686f7020332e30003842494d04040000000'
+                       . '000181c02190004746573741c02190003666f6f1c020000020004';
                $this->assertEquals( $expected, bin2hex( $res['PSIR'][0] ) );
        }
 
index 1b28de1..b261137 100644 (file)
@@ -37,7 +37,9 @@ class JpegTest extends MediaWikiTestCase {
        public function testJpegMetadataExtraction() {
                $file = $this->dataFile( 'test.jpg', 'image/jpeg' );
                $res = $this->handler->getMetadata( $file, $this->filePath . 'test.jpg' );
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                $expected = 'a:7:{s:16:"ImageDescription";s:9:"Test file";s:11:"XResolution";s:4:"72/1";s:11:"YResolution";s:4:"72/1";s:14:"ResolutionUnit";i:2;s:16:"YCbCrPositioning";i:1;s:15:"JPEGFileComment";a:1:{i:0;s:17:"Created with GIMP";}s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
+               // @codingStandardsIgnoreEnd
 
                // Unserialize in case serialization format ever changes.
                $this->assertEquals( unserialize( $expected ), unserialize( $res ) );
index aa73e2d..59d40de 100644 (file)
@@ -92,7 +92,9 @@ class PNGHandlerTest extends MediaWikiTestCase {
                        array( '', PNGHandler::METADATA_BAD ),
                        array( null, PNGHandler::METADATA_BAD ),
                        array( 'Something invalid!', PNGHandler::METADATA_BAD ),
+                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        array( 'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:8;s:9:"colorType";s:10:"truecolour";s:8:"metadata";a:1:{s:15:"_MW_PNG_VERSION";i:1;}}', PNGHandler::METADATA_GOOD ),
+                       // @codingStandardsIgnoreEnd
                );
        }
 
@@ -111,8 +113,10 @@ class PNGHandlerTest extends MediaWikiTestCase {
 
        public static function provideGetMetadata() {
                return array(
+                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        array( 'rgb-na-png.png', 'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:8;s:9:"colorType";s:10:"truecolour";s:8:"metadata";a:1:{s:15:"_MW_PNG_VERSION";i:1;}}' ),
                        array( 'xmp.png', 'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:1;s:9:"colorType";s:14:"index-coloured";s:8:"metadata";a:2:{s:12:"SerialNumber";s:9:"123456789";s:15:"_MW_PNG_VERSION";i:1;}}' ),
+                       // @codingStandardsIgnoreEnd
                );
        }
 
index ec7b0c9..fa63fa6 100644 (file)
@@ -121,12 +121,15 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
 
        public static function provideSvgFilesWithXMLMetadata() {
                $base = __DIR__ . '/../../data/media';
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                $metadata = '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
       <ns4:Work xmlns:ns4="http://creativecommons.org/ns#" rdf:about="">
         <ns5:format xmlns:ns5="http://purl.org/dc/elements/1.1/">image/svg+xml</ns5:format>
         <ns5:type xmlns:ns5="http://purl.org/dc/elements/1.1/" rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
       </ns4:Work>
     </rdf:RDF>';
+               // @codingStandardsIgnoreEnd
+
                $metadata = str_replace( "\r", '', $metadata ); // Windows compat
                return array(
                        array(
index 97e6c43..8a3d527 100644 (file)
@@ -40,7 +40,8 @@ class SvgTest extends MediaWikiTestCase {
                return array(
                        array( 'Tux.svg', array(
                                'ObjectName' => 'Tux',
-                               'ImageDescription' => 'For more information see: http://commons.wikimedia.org/wiki/Image:Tux.svg',
+                               'ImageDescription' =>
+                                       'For more information see: http://commons.wikimedia.org/wiki/Image:Tux.svg',
                        ) ),
                        array( 'Wikimedia-logo.svg', array() )
                );
index ca97698..26d7204 100644 (file)
@@ -29,7 +29,11 @@ class TiffTest extends MediaWikiTestCase {
         */
        public function testTiffMetadataExtraction() {
                $res = $this->handler->getMetadata( null, $this->filePath . 'test.tiff' );
+
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                $expected = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
+               // @codingStandardsIgnoreEnd
+
                // Re-unserialize in case there are subtle differences between how versions
                // of php serialize stuff.
                $this->assertEquals( unserialize( $expected ), unserialize( $res ) );
index a736234..dff31c1 100644 (file)
@@ -89,7 +89,9 @@ class CleanUpTest extends MediaWikiTestCase {
                                ( $i > UNICODE_SURROGATE_LAST && $i < 0xfffe ) ||
                                ( $i > 0xffff && $i <= UNICODE_MAX )
                        ) {
-                               if ( isset( UtfNormal::$utfCanonicalComp[$char] ) || isset( UtfNormal::$utfCanonicalDecomp[$char] ) ) {
+                               if ( isset( UtfNormal::$utfCanonicalComp[$char] )
+                                       || isset( UtfNormal::$utfCanonicalDecomp[$char] )
+                               ) {
                                        $comp = UtfNormal::NFC( $char );
                                        $this->assertEquals(
                                                bin2hex( $comp ),
@@ -243,12 +245,14 @@ class CleanUpTest extends MediaWikiTestCase {
                                                }
                                        } elseif ( $first > 0xc1 && $first < 0xe0 && $second < 0xc0 ) {
                                                $this->assertEquals(
-                                                       bin2hex( UtfNormal::NFC( $head . chr( $first ) . chr( $second ) ) . UTF8_REPLACEMENT . $tail ),
+                                                       bin2hex( UtfNormal::NFC( $head . chr( $first ) .
+                                                                       chr( $second ) ) . UTF8_REPLACEMENT . $tail ),
                                                        bin2hex( $clean ),
                                                        "Valid 2-byte $x + broken tail" );
                                        } elseif ( $second > 0xc1 && $second < 0xe0 && $third < 0xc0 ) {
                                                $this->assertEquals(
-                                                       bin2hex( $head . UTF8_REPLACEMENT . UtfNormal::NFC( chr( $second ) . chr( $third ) . $tail ) ),
+                                                       bin2hex( $head . UTF8_REPLACEMENT .
+                                                               UtfNormal::NFC( chr( $second ) . chr( $third ) . $tail ) ),
                                                        bin2hex( $clean ),
                                                        "Broken head + valid 2-byte $x" );
                                        } elseif ( ( $first > 0xfd || $second > 0xfd ) &&
index 1670823..1972bb5 100644 (file)
@@ -138,7 +138,10 @@ class BagOStuffTest extends MediaWikiTestCase {
                $this->cache->add( $key1, $value1 );
                $this->cache->add( $key2, $value2 );
 
-               $this->assertEquals( $this->cache->getMulti( array( $key1, $key2 ) ), array( $key1 => $value1, $key2 => $value2 ) );
+               $this->assertEquals(
+                       $this->cache->getMulti( array( $key1, $key2 ) ),
+                       array( $key1 => $value1, $key2 => $value2 )
+               );
 
                // cleanup
                $this->cache->delete( $key1 );
index 2ad2735..b81c973 100644 (file)
@@ -48,7 +48,9 @@ class MagicVariableTest extends MediaWikiTestCase {
 
                # Needs a title to do magic word stuff
                $title = Title::newFromText( 'Tests' );
-               $title->mRedirect = false; # Else it needs a db connection just to check if it's a redirect (when deciding the page language)
+               # Else it needs a db connection just to check if it's a redirect
+               # (when deciding the page language).
+               $title->mRedirect = false;
 
                $this->testParser->setTitle( $title );
        }
index f3c499b..66ed020 100644 (file)
@@ -31,6 +31,11 @@ class NewParserTest extends MediaWikiTestCase {
        public $fuzzSeed = 0;
        public $memoryLimit = 50;
 
+       /**
+        * @var DjVuSupport
+        */
+       private $djVuSupport;
+
        protected $file = false;
 
        public static function setUpBeforeClass() {
@@ -130,6 +135,9 @@ class NewParserTest extends MediaWikiTestCase {
                // Vector images have to be handled slightly differently
                $tmpGlobals['wgMediaHandlers']['image/svg+xml'] = 'MockSvgHandler';
 
+               // DjVu images have to be handled slightly differently
+               $tmpGlobals['wgMediaHandlers']['image/vnd.djvu'] = 'MockDjVuHandler';
+
                $tmpHooks = $wgHooks;
                $tmpHooks['ParserTestParser'][] = 'ParserTestParserHook::setup';
                $tmpHooks['ParserGetVariableValueTs'][] = 'ParserTest::getFakeTimestamp';
@@ -138,6 +146,9 @@ class NewParserTest extends MediaWikiTestCase {
                # proper precedence when resolving links. (bug 51680)
                $tmpGlobals['wgExtraNamespaces'] = array( 100 => 'MemoryAlpha' );
 
+               //DjVu support
+               $this->djVuSupport = new DjVuSupport();
+
                $this->setMwGlobals( $tmpGlobals );
 
                $this->savedWeirdGlobals['image_alias'] = $wgNamespaceAliases['Image'];
@@ -273,6 +284,47 @@ class NewParserTest extends MediaWikiTestCase {
                                        'fileExists'  => true
                        ), $this->db->timestamp( '20010115123500' ), $user );
                }
+
+               # A DjVu file
+               $image = wfLocalFile( Title::makeTitle( NS_FILE, 'LoremIpsum.djvu' ) );
+               if ( !$this->db->selectField( 'image', '1', array( 'img_name' => $image->getName() ) ) ) {
+                       $image->recordUpload2( '', 'Upload a DjVu', 'A DjVu', array(
+                               'size' => 3249,
+                               'width' => 2480,
+                               'height' => 3508,
+                               'bits' => 24,
+                               'media_type' => MEDIATYPE_BITMAP,
+                               'mime' => 'image/vnd.djvu',
+                               'metadata' => '<?xml version="1.0" ?>
+<!DOCTYPE DjVuXML PUBLIC "-//W3C//DTD DjVuXML 1.1//EN" "pubtext/DjVuXML-s.dtd">
+<DjVuXML>
+<HEAD></HEAD>
+<BODY><OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+<OBJECT height="3508" width="2480">
+<PARAM name="DPI" value="300" />
+<PARAM name="GAMMA" value="2.2" />
+</OBJECT>
+</BODY>
+</DjVuXML>',
+                               'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+                               'fileExists' => true
+                       ), $this->db->timestamp( '20140115123600' ), $user );
+               }
        }
 
        //ParserTest setup/teardown functions
@@ -446,6 +498,10 @@ class NewParserTest extends MediaWikiTestCase {
                $backend->store( array(
                        'src' => "$IP/skins/monobook/headbg.jpg", 'dst' => "$base/local-public/0/09/Bad.jpg"
                ) );
+               $backend->prepare( array( 'dir' => "$base/local-public/5/5f" ) );
+               $backend->store( array(
+                       'src' => "$IP/tests/phpunit/data/media/LoremIpsum.djvu", 'dst' => "$base/local-public/5/5f/LoremIpsum.djvu"
+               ) );
 
                // No helpful SVG file to copy, so make one ourselves
                $data = '<?xml version="1.0" encoding="utf-8"?>' .
@@ -525,6 +581,11 @@ class NewParserTest extends MediaWikiTestCase {
 
                                "$base/local-public/0/09/Bad.jpg",
 
+                               "$base/local-public/5/5f/LoremIpsum.djvu",
+                               "$base/local-thumb/5/5f/LoremIpsum.djvu/page2-2480px-LoremIpsum.djvu.jpg",
+                               "$base/local-thumb/5/5f/LoremIpsum.djvu/page2-3720px-LoremIpsum.djvu.jpg",
+                               "$base/local-thumb/5/5f/LoremIpsum.djvu/page2-4960px-LoremIpsum.djvu.jpg",
+
                                "$base/local-public/f/ff/Foobar.svg",
                                "$base/local-thumb/f/ff/Foobar.svg/180px-Foobar.svg.png",
                                "$base/local-thumb/f/ff/Foobar.svg/2000px-Foobar.svg.png",
@@ -638,6 +699,11 @@ class NewParserTest extends MediaWikiTestCase {
                                        . "Current configuration is:\n\$wgTexvc = '$wgTexvc'" );
                        }
                }
+               if ( isset( $opts['djvu'] ) ) {
+                       if ( !$this->djVuSupport->isEnabled() ) {
+                               $this->markTestSkipped( "SKIPPED: djvu binaries do not exist or are not executable.\n" );
+                       }
+               }
 
                if ( isset( $opts['pst'] ) ) {
                        $out = $parser->preSaveTransform( $input, $title, $user, $options );
index e5c5cb2..229eeb4 100644 (file)
@@ -91,5 +91,6 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                        ),
                ), $out->getSections(), 'getSections() with proper value when <h2> is used' );
        }
-       //@Todo Add tests for cleanSig() / cleanSigInSig(), getSection(), replaceSection(), getPreloadText()
+       // @todo Add tests for cleanSig() / cleanSigInSig(), getSection(),
+       // replaceSection(), getPreloadText()
 }
index cfb3f72..345fd0a 100644 (file)
@@ -16,7 +16,9 @@ class PreprocessorTest extends MediaWikiTestCase {
                global $wgParserConf, $wgContLang;
                parent::setUp();
                $this->mOptions = ParserOptions::newFromUserAndLang( new User, $wgContLang );
-               $name = isset( $wgParserConf['preprocessorClass'] ) ? $wgParserConf['preprocessorClass'] : 'Preprocessor_DOM';
+               $name = isset( $wgParserConf['preprocessorClass'] )
+                       ? $wgParserConf['preprocessorClass']
+                       : 'Preprocessor_DOM';
 
                $this->mPreprocessor = new $name( $this );
        }
@@ -26,6 +28,7 @@ class PreprocessorTest extends MediaWikiTestCase {
        }
 
        public static function provideCases() {
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                return array(
                        array( "Foo", "<root>Foo</root>" ),
                        array( "<!-- Foo -->", "<root><comment>&lt;!-- Foo --&gt;</comment></root>" ),
@@ -113,6 +116,7 @@ class PreprocessorTest extends MediaWikiTestCase {
                        array( "{{Foo|} Bar=}}", "<root><template><title>Foo</title><part><name>} Bar</name>=<value></value></part></template></root>" ),
                        /* array( file_get_contents( __DIR__ . '/QuoteQuran.txt' ), file_get_contents( __DIR__ . '/QuoteQuranExpanded.txt' ) ), */
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -157,6 +161,7 @@ class PreprocessorTest extends MediaWikiTestCase {
         * These are more complex test cases taken out of wiki articles.
         */
        public static function provideFiles() {
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                return array(
                        array( "QuoteQuran" ), # http://en.wikipedia.org/w/index.php?title=Template:QuoteQuran/sandbox&oldid=237348988 GFDL + CC BY-SA by Striver
                        array( "Factorial" ), # http://en.wikipedia.org/w/index.php?title=Template:Factorial&oldid=98548758 GFDL + CC BY-SA by Polonium
@@ -164,6 +169,7 @@ class PreprocessorTest extends MediaWikiTestCase {
                        array( "Fundraising" ), # http://tl.wiktionary.org/w/index.php?title=MediaWiki:Sitenotice&oldid=5716 GFDL + CC BY-SA, copied there by Sky Harbor.
                        array( "NestedTemplates" ), # bug 27936
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -190,6 +196,7 @@ class PreprocessorTest extends MediaWikiTestCase {
         * Tests from Bug 28642 · https://bugzilla.wikimedia.org/28642
         */
        public static function provideHeadings() {
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                return array( /* These should become headings: */
                        array( "== h ==<!--c1-->", "<root><h level=\"2\" i=\"1\">== h ==<comment>&lt;!--c1--&gt;</comment></h></root>" ),
                        array( "== h ==         <!--c1-->", "<root><h level=\"2\" i=\"1\">== h ==       <comment>&lt;!--c1--&gt;</comment></h></root>" ),
@@ -227,6 +234,7 @@ class PreprocessorTest extends MediaWikiTestCase {
                        array( "== h ==<!--c1--> x <!--c2--><!--c3-->  ", "<root>== h ==<comment>&lt;!--c1--&gt;</comment> x <comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment>  </root>" ),
                        array( "== h ==<!--c1--><!--c2--><!--c3--> x ", "<root>== h ==<comment>&lt;!--c1--&gt;</comment><comment>&lt;!--c2--&gt;</comment><comment>&lt;!--c3--&gt;</comment> x </root>" ),
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
index 259a9e2..e3c4cc8 100644 (file)
@@ -5,7 +5,13 @@
  */
 class TagHookTest extends MediaWikiTestCase {
        public static function provideValidNames() {
-               return array( array( 'foo' ), array( 'foo-bar' ), array( 'foo_bar' ), array( 'FOO-BAR' ), array( 'foo bar' ) );
+               return array(
+                       array( 'foo' ),
+                       array( 'foo-bar' ),
+                       array( 'foo_bar' ),
+                       array( 'FOO-BAR' ),
+                       array( 'foo bar' )
+               );
        }
 
        public static function provideBadNames() {
@@ -27,7 +33,11 @@ class TagHookTest extends MediaWikiTestCase {
                $parser = new Parser( $wgParserConf );
 
                $parser->setHook( $tag, array( $this, 'tagCallback' ) );
-               $parserOutput = $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
+               $parserOutput = $parser->parse(
+                       "Foo<$tag>Bar</$tag>Baz",
+                       Title::newFromText( 'Test' ),
+                       ParserOptions::newFromUserAndLang( new User, $wgContLang )
+               );
                $this->assertEquals( "<p>FooOneBaz\n</p>", $parserOutput->getText() );
 
                $parser->mPreprocessor = null; # Break the Parser <-> Preprocessor cycle
@@ -43,7 +53,11 @@ class TagHookTest extends MediaWikiTestCase {
                $parser = new Parser( $wgParserConf );
 
                $parser->setHook( $tag, array( $this, 'tagCallback' ) );
-               $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
+               $parser->parse(
+                       "Foo<$tag>Bar</$tag>Baz",
+                       Title::newFromText( 'Test' ),
+                       ParserOptions::newFromUserAndLang( new User, $wgContLang )
+               );
                $this->fail( 'Exception not thrown.' );
        }
 
@@ -56,7 +70,11 @@ class TagHookTest extends MediaWikiTestCase {
                $parser = new Parser( $wgParserConf );
 
                $parser->setFunctionTagHook( $tag, array( $this, 'functionTagCallback' ), 0 );
-               $parserOutput = $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
+               $parserOutput = $parser->parse(
+                       "Foo<$tag>Bar</$tag>Baz",
+                       Title::newFromText( 'Test' ),
+                       ParserOptions::newFromUserAndLang( new User, $wgContLang )
+               );
                $this->assertEquals( "<p>FooOneBaz\n</p>", $parserOutput->getText() );
 
                $parser->mPreprocessor = null; # Break the Parser <-> Preprocessor cycle
@@ -72,7 +90,11 @@ class TagHookTest extends MediaWikiTestCase {
                $parser = new Parser( $wgParserConf );
 
                $parser->setFunctionTagHook( $tag, array( $this, 'functionTagCallback' ), SFH_OBJECT_ARGS );
-               $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
+               $parser->parse(
+                       "Foo<$tag>Bar</$tag>Baz",
+                       Title::newFromText( 'Test' ),
+                       ParserOptions::newFromUserAndLang( new User, $wgContLang )
+               );
                $this->fail( 'Exception not thrown.' );
        }
 
index 5b51ef8..c4412de 100644 (file)
@@ -151,6 +151,7 @@ mw.loader.addSource( {
                                                        'test.x.foo',
                                                        'test.x.bar',
                                                        'test.x.util',
+                                                       'test.x.unknown',
                                                ),
                                        ) ),
                                        'test.group.foo.1' => new ResourceLoaderTestModule( array(
@@ -211,7 +212,6 @@ mw.loader.addSource( {
         "test.x.bar",
         "1388534400",
         [
-            "test.x.core",
             "test.x.util"
         ]
     ],
@@ -221,7 +221,7 @@ mw.loader.addSource( {
         [
             "test.x.foo",
             "test.x.bar",
-            "test.x.util"
+            "test.x.unknown"
         ]
     ],
     [
@@ -256,7 +256,10 @@ mw.loader.addSource( {
 
        /**
         * @dataProvider provideGetModuleRegistrations
+        * @covers ResourceLoaderStartupModule::optimizeDependencies
         * @covers ResourceLoaderStartUpModule::getModuleRegistrations
+        * @covers ResourceLoader::makeLoaderSourcesScript
+        * @covers ResourceLoader::makeLoaderRegisterScript
         */
        public function testGetModuleRegistrations( $case ) {
                if ( isset( $case['sources'] ) ) {
index ab0c8d9..d3736f5 100644 (file)
@@ -51,7 +51,8 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
        /* Test Methods */
 
        /**
-        * Ensures that the ResourceLoaderRegisterModules hook is called when a new ResourceLoader object is constructed
+        * Ensures that the ResourceLoaderRegisterModules hook is called when a new
+        * ResourceLoader object is constructed.
         * @covers ResourceLoader::__construct
         */
        public function testCreatingNewResourceLoaderCallsRegistrationHook() {
index b0c0f1b..3da1361 100644 (file)
@@ -57,7 +57,11 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                }
 
                $this->insertPage( "Not_Main_Page", "This is not a main page", 0 );
-               $this->insertPage( 'Talk:Not_Main_Page', 'This is not a talk page to the main page, see [[smithee]]', 1 );
+               $this->insertPage(
+                       'Talk:Not_Main_Page',
+                       'This is not a talk page to the main page, see [[smithee]]',
+                       1
+               );
                $this->insertPage( 'Smithee', 'A smithee is one who smiths. See also [[Alan Smithee]]', 0 );
                $this->insertPage( 'Talk:Smithee', 'This article sucks.', 1 );
                $this->insertPage( 'Unrelated_page', 'Nothing in this page is about the S word.', 0 );
index c5d52d3..15b8865 100644 (file)
@@ -46,9 +46,24 @@ class MediaWikiSiteTest extends SiteTest {
                        // url, filepath, path arg, expected
                        array( 'https://en.wikipedia.org', '/w/$1', 'api.php', 'https://en.wikipedia.org/w/api.php' ),
                        array( 'https://en.wikipedia.org', '/w/', 'api.php', 'https://en.wikipedia.org/w/' ),
-                       array( 'https://en.wikipedia.org', '/foo/page.php?name=$1', 'api.php', 'https://en.wikipedia.org/foo/page.php?name=api.php' ),
-                       array( 'https://en.wikipedia.org', '/w/$1', '', 'https://en.wikipedia.org/w/' ),
-                       array( 'https://en.wikipedia.org', '/w/$1', 'foo/bar/api.php', 'https://en.wikipedia.org/w/foo/bar/api.php' ),
+                       array(
+                               'https://en.wikipedia.org',
+                               '/foo/page.php?name=$1',
+                               'api.php',
+                               'https://en.wikipedia.org/foo/page.php?name=api.php'
+                       ),
+                       array(
+                               'https://en.wikipedia.org',
+                               '/w/$1',
+                               '',
+                               'https://en.wikipedia.org/w/'
+                       ),
+                       array(
+                               'https://en.wikipedia.org',
+                               '/w/$1',
+                               'foo/bar/api.php',
+                               'https://en.wikipedia.org/w/foo/bar/api.php'
+                       ),
                );
        }
 
index 39462b4..f92dc66 100644 (file)
@@ -50,14 +50,14 @@ class QueryAllSpecialPagesTest extends MediaWikiTestCase {
                global $wgDBtype;
 
                foreach ( $this->queryPages as $page ) {
-
                        // With MySQL, skips special pages reopening a temporary table
                        // See http://bugs.mysql.com/bug.php?id=10327
                        if (
                                $wgDBtype === 'mysql'
                                && in_array( $page->getName(), $this->reopensTempTable )
                        ) {
-                               $this->markTestSkipped( "SQL query for page {$page->getName()} can not be tested on MySQL backend (it reopens a temporary table)" );
+                               $this->markTestSkipped( "SQL query for page {$page->getName()} "
+                                       . "can not be tested on MySQL backend (it reopens a temporary table)" );
                                continue;
                        }
 
index 8cbcf97..dbebeb7 100644 (file)
@@ -13,14 +13,15 @@ class SpecialSearchTest extends MediaWikiTestCase {
        /**
         * @covers SpecialSearch::load
         * @dataProvider provideSearchOptionsTests
-        * @param array $requested Request parameters. For example array( 'ns5' => true, 'ns6' => true). Null to use default options.
-        * @param array $userOptions User options to test with. For example array('searchNs5' => 1 );. Null to use default options.
+        * @param array $requested Request parameters. For example:
+        *   array( 'ns5' => true, 'ns6' => true). Null to use default options.
+        * @param array $userOptions User options to test with. For example:
+        *   array('searchNs5' => 1 );. Null to use default options.
         * @param string $expectedProfile An expected search profile name
         * @param array $expectedNs Expected namespaces
         */
-       public function testProfileAndNamespaceLoading(
-               $requested, $userOptions, $expectedProfile, $expectedNS,
-               $message = 'Profile name and namespaces mismatches!'
+       public function testProfileAndNamespaceLoading( $requested, $userOptions,
+               $expectedProfile, $expectedNS, $message = 'Profile name and namespaces mismatches!'
        ) {
                $context = new RequestContext;
                $context->setUser(
index ac3e41e..1e5aca9 100644 (file)
@@ -89,7 +89,14 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
                        array( NS_MAIN, 'Foo_Bar', '', 'en', 'Foo Bar' ),
                        array( NS_USER, 'Hansi_Maier', 'stuff_and_so_on', 'en', 'User:Hansi Maier#stuff and so on' ),
                        array( false, 'Hansi_Maier', '', 'en', 'Hansi Maier' ),
-                       array( NS_USER_TALK, 'hansi__maier', '', 'en', 'User talk:hansi  maier', 'User talk:Hansi maier' ),
+                       array(
+                               NS_USER_TALK,
+                               'hansi__maier',
+                               '',
+                               'en',
+                               'User talk:hansi  maier',
+                               'User talk:Hansi maier'
+                       ),
 
                        // getGenderCache() provides a mock that considers first
                        // names ending in "a" to be female.
@@ -112,7 +119,11 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
 
                // test round trip
                $parsed = $codec->parseTitle( $actual, NS_MAIN );
-               $actual2 = $codec->formatTitle( $parsed->getNamespace(), $parsed->getText(), $parsed->getFragment() );
+               $actual2 = $codec->formatTitle(
+                       $parsed->getNamespace(),
+                       $parsed->getText(),
+                       $parsed->getFragment()
+               );
 
                $this->assertEquals( $normalized, $actual2, 'normalized after round trip' );
        }
index 879d821..7125247 100644 (file)
@@ -23,7 +23,9 @@ class UploadFromUrlTest extends ApiTestCase {
                }
        }
 
-       protected function doApiRequest( array $params, array $unused = null, $appendModule = false, User $user = null ) {
+       protected function doApiRequest( array $params, array $unused = null,
+               $appendModule = false, User $user = null
+       ) {
                $sessionId = session_id();
                session_write_close();
 
@@ -203,7 +205,10 @@ class UploadFromUrlTest extends ApiTestCase {
                        $page->doDeleteArticle( '' );
                }
 
-               $this->assertFalse( (bool)$talk->getArticleID( Title::GAID_FOR_UPDATE ), 'User talk does not exist' );
+               $this->assertFalse(
+                       (bool)$talk->getArticleID( Title::GAID_FOR_UPDATE ),
+                       'User talk does not exist'
+               );
 
                $this->doApiRequest( array(
                        'action' => 'upload',
@@ -236,7 +241,10 @@ class UploadFromUrlTest extends ApiTestCase {
                        ) );
                } catch ( UsageException $e ) {
                        $exception = true;
-                       $this->assertEquals( 'Using leavemessage without ignorewarnings is not supported', $e->getMessage() );
+                       $this->assertEquals(
+                               'Using leavemessage without ignorewarnings is not supported',
+                               $e->getMessage()
+                       );
                }
                $this->assertTrue( $exception );
 
index dbdb588..4dd5cdd 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 
+// @codingStandardsIgnoreStart Ignore Squiz.Classes.ValidClassName.NotCamelCaps
 class LanguageBe_taraskTest extends LanguageClassesTestCase {
+       // @codingStandardsIgnoreEnd
        /**
         * Make sure the language code we are given is indeed
         * be-tarask. This is to ensure LanguageClassesTestCase
index 13d84f7..a4ef06d 100644 (file)
@@ -412,7 +412,10 @@ class LanguageTest extends LanguageClassesTestCase {
                        array( 'fr-Latn-F', 'region too short' ),
                        array( 'a-value', 'language too short with region' ),
                        array( 'tlh-a-b-foo', 'valid three-letter with wrong variant' ),
-                       array( 'i-notexist', 'grandfathered but not registered: invalid, even if we only test well-formedness' ),
+                       array(
+                               'i-notexist',
+                               'grandfathered but not registered: invalid, even if we only test well-formedness'
+                       ),
                        array( 'abcdefghi-012345678', 'numbers too long' ),
                        array( 'ab-abc-abc-abc-abc', 'invalid extensions' ),
                        array( 'ab-abcd-abc', 'invalid extensions' ),
@@ -508,12 +511,14 @@ class LanguageTest extends LanguageClassesTestCase {
         */
        public function testKnownCldrLanguageTag() {
                if ( !class_exists( 'LanguageNames' ) ) {
-                       $this->markTestSkipped( 'The LanguageNames class is not available. The cldr extension is probably not installed.' );
+                       $this->markTestSkipped( 'The LanguageNames class is not available. '
+                               . 'The CLDR extension is probably not installed.' );
                }
 
                $this->assertTrue(
                        (bool)Language::isKnownLanguageTag( 'pal' ),
-                       'validating code "pal" an ancient language, which probably will not appear in Names.php, but appears in CLDR in English'
+                       'validating code "pal" an ancient language, which probably will '
+                               . 'not appear in Names.php, but appears in CLDR in English'
                );
        }
 
@@ -658,7 +663,8 @@ class LanguageTest extends LanguageClassesTestCase {
                                '2009-W53-4',
                                'leap week'
                        ),
-                       // What follows is mostly copied from https://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#.23time
+                       // What follows is mostly copied from
+                       // https://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#.23time
                        array(
                                'Y',
                                '20120102090705',
@@ -1284,6 +1290,7 @@ class LanguageTest extends LanguageClassesTestCase {
        }
 
        public static function provideCheckTitleEncodingData() {
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                return array(
                        array( "" ),
                        array( "United States of America" ), // 7bit ASCII
@@ -1334,6 +1341,7 @@ class LanguageTest extends LanguageClassesTestCase {
                                )
                        )
                );
+               // @codingStandardsIgnoreEnd
        }
 
        /**
@@ -1464,7 +1472,11 @@ class LanguageTest extends LanguageClassesTestCase {
                        array( array( 'formatDuration', 1023 * 60 * 60 ), '1023 hours', 'relative' ),
                        array( array( 'formatDuration', -1023 ), '-1023 seconds', 'negative relative' ),
                        array( array( 'formatDuration', 0 ), 'now', 'now' ),
-                       array( array( 'timeanddate', '20120102070000' ), '2012-1-1 7:00 +1 day', 'mixed, handled as absolute' ),
+                       array(
+                               array( 'timeanddate', '20120102070000' ),
+                               '2012-1-1 7:00 +1 day',
+                               'mixed, handled as absolute'
+                       ),
                        array( array( 'timeanddate', '19910203040506' ), '1991-2-3 4:05:06', 'absolute' ),
                        array( array( 'timeanddate', '19700101000000' ), '1970-1-1 0:00:00', 'absolute at epoch' ),
                        array( array( 'timeanddate', '19691231235959' ), '1969-12-31 23:59:59', 'time before epoch' ),
@@ -1472,6 +1484,29 @@ class LanguageTest extends LanguageClassesTestCase {
                );
        }
 
+       /**
+        * @dataProvider parseFormattedNumberProvider
+        */
+       public function testParseFormattedNumber( $langCode, $number ) {
+               $lang = Language::factory( $langCode );
+
+               $localisedNum = $lang->formatNum( $number );
+               $normalisedNum = $lang->parseFormattedNumber( $localisedNum );
+
+               $this->assertEquals( $number, $normalisedNum );
+       }
+
+       public function parseFormattedNumberProvider() {
+               return array(
+                       array( 'de', 377.01 ),
+                       array( 'fa', 334 ),
+                       array( 'fa', 382.772 ),
+                       array( 'ar', 1844 ),
+                       array( 'lzh', 3731 ),
+                       array( 'zh-classical', 7432 )
+               );
+       }
+
        /**
         * @covers Language::commafy()
         * @dataProvider provideCommafyData
@@ -1555,10 +1590,12 @@ class LanguageTest extends LanguageClassesTestCase {
        public static function provideGetParentLanguage() {
                return array(
                        array( 'zh-cn', 'zh', 'zh is the parent language of zh-cn' ),
-                       array( 'zh', 'zh', 'zh is defined as the parent language of zh, because zh converter can convert zh-cn to zh' ),
+                       array( 'zh', 'zh', 'zh is defined as the parent language of zh, '
+                               . 'because zh converter can convert zh-cn to zh' ),
                        array( 'zh-invalid', null, 'do not be fooled by arbitrarily composed language codes' ),
                        array( 'en-gb', null, 'en does not have converter' ),
-                       array( 'en', null, 'en does not have converter. Although FakeConverter handles en -> en conversion but it is useless' ),
+                       array( 'en', null, 'en does not have converter. Although FakeConverter '
+                                       . 'handles en -> en conversion but it is useless' ),
                );
        }
 
index 71d32c3..8e3b114 100644 (file)
@@ -110,7 +110,9 @@ class CLDRPluralRuleEvaluatorTest extends MediaWikiTestCase {
 
                        # Revision 33 samples
                        # expected, rule, number, comment
+                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        array( 0, 'n in 1,3,5@integer 3~10, 103~110, 1003, … @decimal 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 103.0, 1003.0, …', 3, 'samples' ),
+                       // @codingStandardsIgnoreEnd
 
                        # Revision 33 some test cases from CLDR
                        array( 0, 'i = 1 and v = 0 or i = 0 and t = 1', '0.1', 'pt one' ),
@@ -122,6 +124,7 @@ class CLDRPluralRuleEvaluatorTest extends MediaWikiTestCase {
                        array( 1, 'i = 1 and v = 0 or i = 0 and t = 1', '0.2', 'pt other' ),
                        array( 1, 'i = 1 and v = 0 or i = 0 and t = 1', '10.0', 'pt other' ),
                        array( 1, 'i = 1 and v = 0 or i = 0 and t = 1', '100.0', 'pt other' ),
+                       // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                        array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '2', 'bs few' ),
                        array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '4', 'bs few' ),
                        array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '22', 'bs few' ),
@@ -130,7 +133,7 @@ class CLDRPluralRuleEvaluatorTest extends MediaWikiTestCase {
                        array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '0.4', 'bs few' ),
                        array( 0, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '10.2', 'bs few' ),
                        array( 1, 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14', '10.0', 'bs other' ),
-
+                       // @codingStandardsIgnoreEnd
                );
 
                return $tests;
index eff90f0..4f0d24f 100644 (file)
@@ -35,16 +35,22 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         * @throws MWExcepion
         */
        protected function addRevision( Page $page, $text, $summary ) {
-               $status = $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), $summary );
+               $status = $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle() ),
+                       $summary
+               );
+
                if ( $status->isGood() ) {
                        $value = $status->getValue();
                        $revision = $value['revision'];
                        $revision_id = $revision->getId();
                        $text_id = $revision->getTextId();
+
                        if ( ( $revision_id > 0 ) && ( $text_id > 0 ) ) {
                                return array( $revision_id, $text_id );
                        }
                }
+
                throw new MWException( "Could not determine revision id (" . $status->getWikiText() . ")" );
        }
 
@@ -105,7 +111,10 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                $this->assertEquals( '', array_pop( $lines ), "Output ends in LF" );
                $timestamp_re = "[0-9]{4}-[01][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-6][0-9]";
                foreach ( $lines as $line ) {
-                       $this->assertRegExp( "/$timestamp_re: .* \(ID [0-9]+\) [0-9]* pages .*, [0-9]* revs .*, ETA/", $line );
+                       $this->assertRegExp(
+                               "/$timestamp_re: .* \(ID [0-9]+\) [0-9]* pages .*, [0-9]* revs .*, ETA/",
+                               $line
+                       );
                }
        }
 
@@ -299,7 +308,8 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         * @param string $format The expected format model id (default: CONTENT_FORMAT_WIKITEXT)
         * @param int|bool $parentid (optional) id of the parent revision
         */
-       protected function assertRevision( $id, $summary, $text_id, $text_bytes, $text_sha1, $text = false, $parentid = false,
+       protected function assertRevision( $id, $summary, $text_id, $text_bytes,
+               $text_sha1, $text = false, $parentid = false,
                $model = CONTENT_MODEL_WIKITEXT, $format = CONTENT_FORMAT_WIKITEXT
        ) {
                $this->assertNodeStart( "revision" );
index 904f12f..744cf61 100644 (file)
@@ -151,6 +151,7 @@ class BaseDumpTest extends MediaWikiTestCase {
                $fname = $this->getNewTempFile();
 
                // The header of every prefetch file
+               // @codingStandardsIgnoreStart Ignore Generic.Files.LineLength.TooLong
                $header = '<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.7/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.7/ http://www.mediawiki.org/xml/export-0.7.xsd" version="0.7" xml:lang="en">
   <siteinfo>
     <sitename>wikisvn</sitename>
@@ -179,6 +180,7 @@ class BaseDumpTest extends MediaWikiTestCase {
     </namespaces>
   </siteinfo>
 ';
+               // @codingStandardsIgnoreEnd
 
                // An array holding the pages that are available for prefetch
                $available_pages = array();
index a763071..016b7e0 100644 (file)
@@ -389,7 +389,12 @@ class TextPassDumperTest extends DumpTestCase {
                $this->assertEmpty( $files, "Remaining unchecked files" );
 
                // ... and have dealt with more than one checkpoint file
-               $this->assertGreaterThan( 1, $checkpointFiles, "expected more than 1 checkpoint to have been created. Checkpoint interval is $checkpointAfter seconds, maybe your computer is too fast?" );
+               $this->assertGreaterThan(
+                       1,
+                       $checkpointFiles,
+                       "expected more than 1 checkpoint to have been created. "
+                               . "Checkpoint interval is $checkpointAfter seconds, maybe your computer is too fast?"
+               );
 
                $this->expectETAOutput();
        }
index 6963601..0cb0cdb 100644 (file)
@@ -137,7 +137,11 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
+               $this->assertPageStart(
+                       $this->pageId4,
+                       $this->talk_namespace,
+                       $this->pageTitle4->getPrefixedText()
+               );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe",
                        "Talk about BackupDumperTestP1 Text1" );
@@ -183,7 +187,11 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
+               $this->assertPageStart(
+                       $this->pageId4,
+                       $this->talk_namespace,
+                       $this->pageTitle4->getPrefixedText()
+               );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -222,7 +230,11 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
+               $this->assertPageStart(
+                       $this->pageId4,
+                       $this->talk_namespace,
+                       $this->pageTitle4->getPrefixedText()
+               );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -264,7 +276,11 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
+               $this->assertPageStart(
+                       $this->pageId4,
+                       $this->talk_namespace,
+                       $this->pageTitle4->getPrefixedText()
+               );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -339,7 +355,11 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
+               $this->assertPageStart(
+                       $this->pageId4,
+                       $this->talk_namespace,
+                       $this->pageTitle4->getPrefixedText()
+               );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -367,7 +387,11 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
+               $this->assertPageStart(
+                       $this->pageId4,
+                       $this->talk_namespace,
+                       $this->pageTitle4->getPrefixedText()
+               );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
index 2e47e0c..8c40ffe 100644 (file)
@@ -105,15 +105,21 @@ class FetchTextTest extends MediaWikiTestCase {
         * @throws MWExcepion
         */
        private function addRevision( $page, $text, $summary ) {
-               $status = $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), $summary );
+               $status = $page->doEditContent(
+                       ContentHandler::makeContent( $text, $page->getTitle() ),
+                       $summary
+               );
+
                if ( $status->isGood() ) {
                        $value = $status->getValue();
                        $revision = $value['revision'];
                        $id = $revision->getTextId();
+
                        if ( $id > 0 ) {
                                return $id;
                        }
                }
+
                throw new MWException( "Could not determine text id" );
        }
 
@@ -127,14 +133,34 @@ class FetchTextTest extends MediaWikiTestCase {
                try {
                        $title = Title::newFromText( 'FetchTextTestPage1', $wikitextNamespace );
                        $page = WikiPage::factory( $title );
-                       $this->textId1 = $this->addRevision( $page, "FetchTextTestPage1Text1", "FetchTextTestPage1Summary1" );
+                       $this->textId1 = $this->addRevision(
+                               $page,
+                               "FetchTextTestPage1Text1",
+                               "FetchTextTestPage1Summary1"
+                       );
 
                        $title = Title::newFromText( 'FetchTextTestPage2', $wikitextNamespace );
                        $page = WikiPage::factory( $title );
-                       $this->textId2 = $this->addRevision( $page, "FetchTextTestPage2Text1", "FetchTextTestPage2Summary1" );
-                       $this->textId3 = $this->addRevision( $page, "FetchTextTestPage2Text2", "FetchTextTestPage2Summary2" );
-                       $this->textId4 = $this->addRevision( $page, "FetchTextTestPage2Text3", "FetchTextTestPage2Summary3" );
-                       $this->textId5 = $this->addRevision( $page, "FetchTextTestPage2Text4 some additional Text  ", "FetchTextTestPage2Summary4 extra " );
+                       $this->textId2 = $this->addRevision(
+                               $page,
+                               "FetchTextTestPage2Text1",
+                               "FetchTextTestPage2Summary1"
+                       );
+                       $this->textId3 = $this->addRevision(
+                               $page,
+                               "FetchTextTestPage2Text2",
+                               "FetchTextTestPage2Summary2"
+                       );
+                       $this->textId4 = $this->addRevision(
+                               $page,
+                               "FetchTextTestPage2Text3",
+                               "FetchTextTestPage2Summary3"
+                       );
+                       $this->textId5 = $this->addRevision(
+                               $page,
+                               "FetchTextTestPage2Text4 some additional Text  ",
+                               "FetchTextTestPage2Summary4 extra "
+                       );
                } catch ( Exception $e ) {
                        // We'd love to pass $e directly. However, ... see
                        // documentation of exceptionFromAddDBData
diff --git a/tests/phpunit/mocks/media/MockDjVuHandler.php b/tests/phpunit/mocks/media/MockDjVuHandler.php
new file mode 100644 (file)
index 0000000..31cb13d
--- /dev/null
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Fake handler for DjVu images.
+ *
+ * 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 Media
+ */
+
+class MockDjVuHandler extends DjVuHandler {
+       function doTransform( $image, $dstPath, $dstUrl, $params, $flags = 0 ) {
+               if ( !$this->normaliseParams( $image, $params ) ) {
+                       return new TransformParameterError( $params );
+               }
+               $width = $params['width'];
+               $height = $params['height'];
+               $page = $params['page'];
+               if ( $page > $this->pageCount( $image ) ) {
+                       return new MediaTransformError(
+                               'thumbnail_error',
+                               $width,
+                               $height,
+                               wfMessage( 'djvu_page_error' )->text()
+                       );
+               }
+
+               $params = array(
+                       'width' => $width,
+                       'height' => $height,
+                       'page' => $page
+               );
+
+               return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
+       }
+}
index 8e2bc03..2b77752 100755 (executable)
@@ -6,7 +6,8 @@
  * @file
  */
 
-// Set a flag which can be used to detect when other scripts have been entered through this entry point or not
+// Set a flag which can be used to detect when other scripts have been entered
+// through this entry point or not.
 define( 'MW_PHPUNIT_TEST', true );
 
 // Start up MediaWiki in command-line mode
@@ -16,8 +17,10 @@ class PHPUnitMaintClass extends Maintenance {
 
        public function __construct() {
                parent::__construct();
-               $this->addOption( 'with-phpunitdir',
-                       'Directory to include PHPUnit from, for example when using a git fetchout from upstream. Path will be prepended to PHP `include_path`.',
+               $this->addOption(
+                       'with-phpunitdir',
+                       'Directory to include PHPUnit from, for example when using a git '
+                               . 'fetchout from upstream. Path will be prepended to PHP `include_path`.',
                        false, # not required
                        true # need arg
                );
index be18a49..12f147e 100644 (file)
@@ -10,9 +10,13 @@ class AutoLoaderTest extends MediaWikiTestCase {
                $this->testLocalClasses = array(
                        'TestAutoloadedLocalClass' => __DIR__ . '/../data/autoloader/TestAutoloadedLocalClass.php',
                        'TestAutoloadedCamlClass' => __DIR__ . '/../data/autoloader/TestAutoloadedCamlClass.php',
-                       'TestAutoloadedSerializedClass' => __DIR__ . '/../data/autoloader/TestAutoloadedSerializedClass.php',
+                       'TestAutoloadedSerializedClass' =>
+                               __DIR__ . '/../data/autoloader/TestAutoloadedSerializedClass.php',
+               );
+               $this->setMwGlobals(
+                       'wgAutoloadLocalClasses',
+                       $this->testLocalClasses + $wgAutoloadLocalClasses
                );
-               $this->setMwGlobals( 'wgAutoloadLocalClasses', $this->testLocalClasses + $wgAutoloadLocalClasses );
                AutoLoader::resetAutoloadLocalClassesLower();
 
                $this->testExtensionClasses = array(
index cfcc771..d7742a6 100644 (file)
@@ -31,7 +31,10 @@ class ResourcesTest extends MediaWikiTestCase {
        public function testStyleMedia( $moduleName, $media, $filename, $css ) {
                $cssText = CSSMin::minify( $css->cssText );
 
-               $this->assertTrue( strpos( $cssText, '@media' ) === false, 'Stylesheets should not both specify "media" and contain @media' );
+               $this->assertTrue(
+                       strpos( $cssText, '@media' ) === false,
+                       'Stylesheets should not both specify "media" and contain @media'
+               );
        }
 
        public function testDependencies() {
index 7f41e52..4d24d9d 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 /**
  * This test suite runs unit tests registered by extensions.
- * See https://www.mediawiki.org/wiki/Manual:Hooks/UnitTestsList for details of how to register your tests.
+ * See https://www.mediawiki.org/wiki/Manual:Hooks/UnitTestsList for details of
+ * how to register your tests.
  */
 
 class ExtensionsTestSuite extends PHPUnit_Framework_TestSuite {
index cb9fa07..e861967 100644 (file)
@@ -44,6 +44,7 @@ return array(
        'test.mediawiki.qunit.suites' => array(
                'scripts' => array(
                        'tests/qunit/suites/resources/startup.test.js',
+                       'tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.autoEllipsis.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.byteLength.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.byteLimit.test.js',
@@ -77,6 +78,7 @@ return array(
                        'tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js',
                ),
                'dependencies' => array(
+                       'jquery.accessKeyLabel',
                        'jquery.autoEllipsis',
                        'jquery.byteLength',
                        'jquery.byteLimit',
diff --git a/tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js b/tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js
new file mode 100644 (file)
index 0000000..d5c5d27
--- /dev/null
@@ -0,0 +1,103 @@
+( function ( $ ) {
+       QUnit.module( 'jquery.accessKeyLabel', QUnit.newMwEnvironment() );
+
+       var getAccessKeyPrefixTestData = [
+                       //ua string, platform string, expected prefix
+                       // Internet Explorer
+                       ['Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'Win32', 'alt-'],
+                       ['Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)', 'Win32', 'alt-'],
+                       ['Mozilla/5.0 (Windows NT 6.3; Win64; x64; Trident/7.0; rv:11.0) like Gecko', 'Win64', 'alt-'],
+                       // Firefox
+                       ['Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19', 'MacIntel', 'ctrl-'],
+                       ['Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.10 (maverick) Firefox/3.6.17', 'Linux i686', 'alt-shift-'],
+                       ['Mozilla/5.0 (Windows NT 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1', 'Win32', 'alt-shift-'],
+                       // Safari / Konqueror
+                       ['Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'MacIntel', 'ctrl-alt-'],
+                       ['Mozilla/5.0 (Windows; U; Windows NT 6.0; cs-CZ) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7', 'Win32', 'alt-'],
+                       ['Mozilla/5.0 (X11; Linux i686) KHTML/4.9.1 (like Gecko) Konqueror/4.9', 'Linux i686', 'ctrl-'],
+                       // Opera
+                       ['Opera/9.80 (Windows NT 5.1)', 'Win32', 'shift-esc-'],
+                       ['Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130', 'Win32', 'shift-esc-'],
+                       // Chrome
+                       ['Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30', 'MacIntel', 'ctrl-option-'],
+                       ['Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30', 'Linux i686', 'alt-shift-']
+               ],
+               //strings appended to title to make sure updateTooltipAccessKeys handles them correctly
+               updateTooltipAccessKeysTestData = [ '', ' [a]', ' [test-a]', ' [alt-b]' ];
+
+       function makeInput ( title, accessKey ) {
+               //The properties aren't escaped, so make sure you don't call this function with values that need to be escaped!
+               return '<input title="' + title + '" ' + ( accessKey ? 'accessKey="' + accessKey + '" ' : '' ) + ' />';
+       }
+
+       QUnit.test( 'getAccessKeyPrefix', getAccessKeyPrefixTestData.length, function ( assert ) {
+               var i;
+               for ( i = 0; i < getAccessKeyPrefixTestData.length; i++ ) {
+                       assert.equal( $.fn.updateTooltipAccessKeys.getAccessKeyPrefix( {
+                               userAgent: getAccessKeyPrefixTestData[i][0],
+                               platform: getAccessKeyPrefixTestData[i][1]
+                       } ), getAccessKeyPrefixTestData[i][2], 'Correct prefix for ' + getAccessKeyPrefixTestData[i][0] );
+               }
+       } );
+
+       QUnit.test( 'updateTooltipAccessKeys - current browser', 2, function ( assert ) {
+               var title = $( makeInput ( 'Title', 'a' ) ).updateTooltipAccessKeys().prop( 'title' ),
+                       //The new title should be something like "Title [alt-a]", but the exact label will depend on the browser.
+                       //The "a" could be capitalized, and the prefix could be anything, e.g. a simple "^" for ctrl-
+                       //(no browser is known using such a short prefix, though) or "Alt+Umschalt+" in German Firefox.
+                       result = /^Title \[(.+)[aA]\]$/.exec( title );
+               assert.ok( result, 'title should match expected structure.' );
+               assert.notEqual( result[1], 'test-', 'Prefix used for testing shouldn\'t be used in production.' );
+       } );
+
+       QUnit.test( 'updateTooltipAccessKeys - no access key', updateTooltipAccessKeysTestData.length, function ( assert ) {
+               var i, oldTitle, $input, newTitle;
+               for ( i = 0; i < updateTooltipAccessKeysTestData.length; i++ ) {
+                       oldTitle = 'Title' + updateTooltipAccessKeysTestData[i];
+                       $input = $( makeInput( oldTitle ) );
+                       $( '#qunit-fixture' ).append( $input );
+                       newTitle = $input.updateTooltipAccessKeys().prop( 'title' );
+                       assert.equal( newTitle, 'Title', 'title="' + oldTitle + '"' );
+               }
+       } );
+
+       QUnit.test( 'updateTooltipAccessKeys - with access key', updateTooltipAccessKeysTestData.length, function ( assert ) {
+               $.fn.updateTooltipAccessKeys.setTestMode( true );
+               var i, oldTitle, $input, newTitle;
+               for ( i = 0; i < updateTooltipAccessKeysTestData.length; i++ ) {
+                       oldTitle = 'Title' + updateTooltipAccessKeysTestData[i];
+                       $input = $( makeInput( oldTitle, 'a' ) );
+                       $( '#qunit-fixture' ).append( $input );
+                       newTitle = $input.updateTooltipAccessKeys().prop( 'title' );
+                       assert.equal( newTitle, 'Title [test-a]', 'title="' + oldTitle + '"' );
+               }
+               $.fn.updateTooltipAccessKeys.setTestMode( false );
+       } );
+
+       QUnit.test( 'updateTooltipAccessKeys with label element', 2, function ( assert ) {
+               $.fn.updateTooltipAccessKeys.setTestMode( true );
+               var html = '<label for="testInput" title="Title">Label</label><input id="testInput" accessKey="a" />',
+                       $label, $input;
+               $( '#qunit-fixture' ).html( html );
+               $label = $( '#qunit-fixture label' );
+               $input = $( '#qunit-fixture input' );
+               $input.updateTooltipAccessKeys();
+               assert.equal( $input.prop( 'title' ), '', 'No title attribute added to input element.' );
+               assert.equal( $label.prop( 'title' ), 'Title [test-a]', 'title updated for associated label element.' );
+               $.fn.updateTooltipAccessKeys.setTestMode( false );
+       } );
+
+       QUnit.test( 'updateTooltipAccessKeys with label element as parent', 2, function ( assert ) {
+               $.fn.updateTooltipAccessKeys.setTestMode( true );
+               var html = '<label title="Title">Label<input id="testInput" accessKey="a" /></label>',
+               $label, $input;
+               $( '#qunit-fixture' ).html( html );
+               $label = $( '#qunit-fixture label' );
+               $input = $( '#qunit-fixture input' );
+               $input.updateTooltipAccessKeys();
+               assert.equal( $input.prop( 'title' ), '', 'No title attribute added to input element.' );
+               assert.equal( $label.prop( 'title' ), 'Title [test-a]', 'title updated for associated label element.' );
+               $.fn.updateTooltipAccessKeys.setTestMode( false );
+       } );
+
+}( jQuery ) );
index 70bcaf9..cd0db7c 100644 (file)
@@ -1,11 +1,7 @@
 ( function ( mw ) {
        QUnit.module( 'mediawiki.api.parse', QUnit.newMwEnvironment( {
                setup: function () {
-                       this.clock = this.sandbox.useFakeTimers();
                        this.server = this.sandbox.useFakeServer();
-               },
-               teardown: function () {
-                       this.clock.tick( 1 );
                }
        } ) );
 
index 4ee8afa..a93f572 100644 (file)
@@ -1,11 +1,7 @@
 ( function ( mw ) {
        QUnit.module( 'mediawiki.api', QUnit.newMwEnvironment( {
                setup: function () {
-                       this.clock = this.sandbox.useFakeTimers();
                        this.server = this.sandbox.useFakeServer();
-               },
-               teardown: function () {
-                       this.clock.tick( 1 );
                }
        } ) );
 
index e178090..5965ab7 100644 (file)
@@ -1,11 +1,7 @@
 ( function ( mw ) {
        QUnit.module( 'mediawiki.api.watch', QUnit.newMwEnvironment( {
                setup: function () {
-                       this.clock = this.sandbox.useFakeTimers();
                        this.server = this.sandbox.useFakeServer();
-               },
-               teardown: function () {
-                       this.clock.tick( 1 );
                }
        } ) );
 
index f5fd16d..61d662b 100644 (file)
@@ -74,6 +74,7 @@
                        'Foo/.../Sandbox',
                        'Sandbox/...',
                        'A~~',
+                       ':A',
                        // Length is 256 total, but only title part matters
                        'Category:' + repeat( 'x', 248 ),
                        repeat( 'x', 252 )
index 9707ab9..1e059e1 100644 (file)
@@ -1,11 +1,10 @@
 ( function ( mw, $ ) {
        QUnit.module( 'mediawiki.util', QUnit.newMwEnvironment( {
                setup: function () {
-                       this.taPrefix = mw.util.tooltipAccessKeyPrefix;
-                       mw.util.tooltipAccessKeyPrefix = 'ctrl-alt-';
+                       $.fn.updateTooltipAccessKeys.setTestMode( true );
                },
                teardown: function () {
-                       mw.util.tooltipAccessKeyPrefix = this.taPrefix;
+                       $.fn.updateTooltipAccessKeys.setTestMode( false );
                }
        } ) );
 
@@ -89,6 +88,8 @@
        } );
 
        QUnit.test( 'tooltipAccessKey', 4, function ( assert ) {
+               this.suppressWarnings();
+
                assert.equal( typeof mw.util.tooltipAccessKeyPrefix, 'string', 'tooltipAccessKeyPrefix must be a string' );
                assert.equal( $.type( mw.util.tooltipAccessKeyRegexp ), 'regexp', 'tooltipAccessKeyRegexp is a regexp' );
                assert.ok( mw.util.updateTooltipAccessKeys, 'updateTooltipAccessKeys is non-empty' );
@@ -96,6 +97,8 @@
                'Example [a]'.replace( mw.util.tooltipAccessKeyRegexp, function ( sub, m1, m2, m3, m4, m5, m6 ) {
                        assert.equal( m6, 'a', 'tooltipAccessKeyRegexp finds the accesskey hint' );
                } );
+
+               this.restoreWarnings();
        } );
 
        QUnit.test( '$content', 2, function ( assert ) {
                assert.ok( $.isDomElement( tbRL ), 'addPortletLink returns a valid DOM Element according to $.isDomElement' );
 
                tbMW = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/',
-                       'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', tbRL );
+                       'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org', 'm', tbRL );
                $tbMW = $( tbMW );
 
                assert.propEqual(
                        $tbMW.find( 'a' ).getAttrs(),
                        {
                                href: '//mediawiki.org/',
-                               title: 'Go to MediaWiki.org [ctrl-alt-m]',
+                               title: 'Go to MediaWiki.org [test-m]',
                                accesskey: 'm'
                        },
                        'Validate attributes of anchor tag in created element'
                cuQuux = mw.util.addPortletLink( 'p-test-custom', '#', 'Quux', null, 'Example [shift-x]', 'q' );
                $cuQuux = $( cuQuux );
 
-               assert.equal( $cuQuux.find( 'a' ).attr( 'title' ), 'Example [ctrl-alt-q]', 'Existing accesskey is stripped and updated' );
+               assert.equal( $cuQuux.find( 'a' ).attr( 'title' ), 'Example [test-q]', 'Existing accesskey is stripped and updated' );
 
                assert.equal(
                        $( '#p-test-custom #c-barmenu ul li' ).length,
index 6ff2b24..818b24e 100644 (file)
@@ -664,3 +664,37 @@ class DelayedParserTest {
        }
 
 }
+
+/**
+ * Initialize and detect the DjVu files support
+ */
+class DjVuSupport {
+
+       /**
+        * Initialises DjVu tools global with default values
+        */
+       public function __construct() {
+               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML, $wgFileExtensions;
+
+               $wgDjvuRenderer = $wgDjvuRenderer ? $wgDjvuRenderer : '/usr/bin/ddjvu';
+               $wgDjvuDump = $wgDjvuDump ? $wgDjvuDump : '/usr/bin/djvudump';
+               $wgDjvuToXML = $wgDjvuToXML ? $wgDjvuToXML : '/usr/bin/djvutoxml';
+
+               if ( !in_array( 'djvu', $wgFileExtensions ) ) {
+                       $wgFileExtensions[] = 'djvu';
+               }
+       }
+
+       /**
+        * Returns if the DjVu tools are usable
+        *
+        * @return bool
+        */
+       public function isEnabled() {
+               global $wgDjvuRenderer, $wgDjvuDump, $wgDjvuToXML;
+
+               return is_executable( $wgDjvuRenderer )
+                       && is_executable( $wgDjvuDump )
+                       && is_executable( $wgDjvuToXML );
+       }
+}
index bfaf9a0..b0310c8 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -163,12 +163,6 @@ function wfStreamThumb( array $params ) {
                return;
        }
 
-       // Check if the file is hidden
-       if ( $img->isDeleted( File::DELETED_FILE ) ) {
-               wfThumbError( 404, "The source file '$fileName' does not exist." );
-               return;
-       }
-
        // Check permissions if there are read restrictions
        $varyHeader = array();
        if ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) ) {
@@ -181,6 +175,12 @@ function wfStreamThumb( array $params ) {
                $varyHeader[] = 'Cookie';
        }
 
+       // Check if the file is hidden
+       if ( $img->isDeleted( File::DELETED_FILE ) ) {
+               wfThumbError( 404, "The source file '$fileName' does not exist." );
+               return;
+       }
+
        // Do rendering parameters extraction from thumbnail name.
        if ( isset( $params['thumbName'] ) ) {
                $params = wfExtractThumbParams( $img, $params );
@@ -324,31 +324,15 @@ function wfStreamThumb( array $params ) {
        } elseif ( $user->pingLimiter( 'renderfile' ) ) {
                wfThumbError( 500, wfMessage( 'actionthrottledtext' ) );
                return;
-       } elseif ( wfThumbIsAttemptThrottled( $img, $thumbName, 4 ) ) {
-               wfThumbError( 500, wfMessage( 'thumbnail_image-failure-limit', 4 ) );
-               return;
        }
 
-       // Thumbnail isn't already there, so create the new thumbnail...
-       $thumb = null;
-       try {
-               // Record failures on PHP fatals too
-               register_shutdown_function( function() use ( &$thumb, $img, $thumbName ) {
-                       if ( $thumb === null ) { // transform() gave a fatal
-                               wfThumbIncrAttemptFailures( $img, $thumbName );
-                       }
-               } );
-               $thumb = $img->transform( $params, File::RENDER_NOW );
-       } catch ( Exception $ex ) {
-               // Tried to select a page on a non-paged file?
-               $thumb = false;
-       }
+       // Actually generate a new thumbnail
+       list( $thumb, $errorMsg ) = wfGenerateThumbnail( $img, $params, $thumbName, $thumbPath );
 
        // Check for thumbnail generation errors...
-       $errorMsg = false;
        $msg = wfMessage( 'thumbnail_error' );
        if ( !$thumb ) {
-               $errorMsg = $msg->rawParams( 'File::transform() returned false' )->escaped();
+               $errorMsg = $errorMsg ?: $msg->rawParams( 'File::transform() returned false' )->escaped();
        } elseif ( $thumb->isError() ) {
                $errorMsg = $thumb->getHtmlMsg();
        } elseif ( !$thumb->hasFile() ) {
@@ -359,7 +343,6 @@ function wfStreamThumb( array $params ) {
        }
 
        if ( $errorMsg !== false ) {
-               wfThumbIncrAttemptFailures( $img, $thumbName );
                wfThumbError( 500, $errorMsg );
        } else {
                // Stream the file if there were no errors
@@ -367,6 +350,81 @@ function wfStreamThumb( array $params ) {
        }
 }
 
+/**
+ * Actually try to generate a new thumbnail
+ *
+ * @param File $file
+ * @param array $params
+ * @param string $thumbName
+ * @param string $thumbPath
+ * @return array (MediaTransformOutput|bool, string|bool error message HTML)
+ */
+function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath ) {
+       global $wgMemc, $wgAttemptFailureEpoch;
+
+       $key = wfMemcKey( 'attempt-failures', $wgAttemptFailureEpoch,
+               $file->getRepo()->getName(), md5( $file->getName() ), md5( $thumbName ) );
+
+       // Check if this file keeps failing to render
+       if ( $wgMemc->get( $key ) >= 4 ) {
+               return array( false, wfMessage( 'thumbnail_image-failure-limit', 4 ) );
+       }
+
+       $done = false;
+       // Record failures on PHP fatals in addition to caching exceptions
+       register_shutdown_function( function() use ( &$done, $key ) {
+               if ( !$done ) { // transform() gave a fatal
+                       global $wgMemc;
+                       // Randomize TTL to reduce stampedes
+                       $wgMemc->incrWithInit( $key, 3600 + mt_rand( 0, 300 ) );
+               }
+       } );
+
+       $thumb = false;
+       $errorHtml = false;
+
+       // Thumbnail isn't already there, so create the new thumbnail...
+       try {
+               $work = new PoolCounterWorkViaCallback( 'FileRender', sha1( $file->getName() ),
+                       array(
+                               'doWork' => function() use ( $file, $params ) {
+                                       return $file->transform( $params, File::RENDER_NOW );
+                               },
+                               'getCachedWork' => function() use ( $file, $params, $thumbPath ) {
+                                       // If the worker that finished made this thumbnail then use it.
+                                       // Otherwise, it probably made a different thumbnail for this file.
+                                       return $file->getRepo()->fileExists( $thumbPath )
+                                               ? $file->transform( $params )
+                                               : false; // retry once more in exclusive mode
+                               },
+                               'fallback' => function() {
+                                       return wfMessage( 'generic-pool-error' )->parse();
+                               },
+                               'error' => function ( $status ) {
+                                       return $status->getHTML();
+                               }
+                       )
+               );
+               $result = $work->execute();
+               if ( $result instanceof MediaTransformOutput ) {
+                       $thumb = $result;
+               } elseif ( is_string( $result ) ) { // error
+                       $errorHtml = $result;
+               }
+       } catch ( Exception $e ) {
+               // Tried to select a page on a non-paged file?
+       }
+
+       $done = true; // no PHP fatal occured
+
+       if ( !$thumb || $thumb->isError() ) {
+               // Randomize TTL to reduce stampedes
+               $wgMemc->incrWithInit( $key, 3600 + mt_rand( 0, 300 ) );
+       }
+
+       return array( $thumb, $errorHtml );
+}
+
 /**
  * Returns true if this thumbnail is one that MediaWiki generates
  * links to on file description pages and possibly parser output.
@@ -376,16 +434,13 @@ function wfStreamThumb( array $params ) {
  * of possible files with standard parameters is far less than that of all
  * possible combinations; rate-limiting for them can thus be more generious.
  *
- * @param File $img
+ * @param File $file
  * @param array $params
  * @return bool
  */
-function wfThumbIsStandard( File $img, array $params ) {
+function wfThumbIsStandard( File $file, array $params ) {
        global $wgThumbLimits, $wgImageLimits;
-       // @TODO: use polymorphism with media handler here
-       if ( array_diff( array_keys( $params ), array( 'width', 'page' ) ) ) {
-               return false; // extra parameters present
-       }
+
        if ( isset( $params['width'] ) ) {
                $widths = $wgThumbLimits;
                foreach ( $wgImageLimits as $pair ) {
@@ -395,46 +450,25 @@ function wfThumbIsStandard( File $img, array $params ) {
                        return false;
                }
        }
-       return true;
-}
 
-/**
- * @param File $img
- * @param string $thumbName
- * @param int $limit
- * @return int|bool
- */
-function wfThumbIsAttemptThrottled( File $img, $thumbName, $limit ) {
-       global $wgMemc;
-
-       return ( $wgMemc->get( wfThumbAttemptKey( $img, $thumbName ) ) >= $limit );
-}
-
-/**
- * @param File $img
- * @param string $thumbName
- */
-function wfThumbIncrAttemptFailures( File $img, $thumbName ) {
-       global $wgMemc;
-
-       $key = wfThumbAttemptKey( $img, $thumbName );
-       if ( !$wgMemc->incr( $key, 1 ) ) {
-               if ( !$wgMemc->add( $key, 1, 3600 ) ) {
-                       $wgMemc->incr( $key, 1 );
+       $handler = $file->getHandler();
+       if ( $handler ) {
+               // Standard thumbnails use a standard width and any page number
+               $normalParams = array( 'width' => $params['width'] );
+               if ( isset( $params['page'] ) ) {
+                       $normalParams['page'] = $params['page'];
+               }
+               // Append any default values to the map (e.g. "lossy", "lossless", "seek"...)
+               $handler->normaliseParams( $file, $normalParams );
+               // Check that the given values for non-page, non-width, params are just defaults
+               foreach ( $params as $key => $value ) {
+                       if ( !isset( $normalParams[$key] ) || $normalParams[$key] !== $value ) {
+                               return false;
+                       }
                }
        }
-}
-
-/**
- * @param File $img
- * @param string $thumbName
- * @return string
- */
-function wfThumbAttemptKey( File $img, $thumbName ) {
-       global $wgAttemptFailureEpoch;
 
-       return wfMemcKey( 'attempt-failures', $wgAttemptFailureEpoch,
-               $img->getRepo()->getName(), md5( $img->getName() ), md5( $thumbName ) );
+       return true;
 }
 
 /**